From 8c6b5e812924ad98f88b67aa6d7a0cf754dbb77f Mon Sep 17 00:00:00 2001 From: prot Date: Tue, 4 May 2004 09:18:39 +0000 Subject: Création du repository --- 2004/n/mic799/m_84.asm | 48 +++++ 2004/n/mic799/mic799.asm | 447 +++++++++++++++++++++++++++++++++++++++++++++++ 2004/n/mic799/mic799.pjt | 94 ++++++++++ 3 files changed, 589 insertions(+) create mode 100644 2004/n/mic799/m_84.asm create mode 100644 2004/n/mic799/mic799.asm create mode 100644 2004/n/mic799/mic799.pjt (limited to '2004/n') diff --git a/2004/n/mic799/m_84.asm b/2004/n/mic799/m_84.asm new file mode 100644 index 0000000..0e5c438 --- /dev/null +++ b/2004/n/mic799/m_84.asm @@ -0,0 +1,48 @@ +; Macros pour Pic 16f84 + +; ----------------- +; MACROS DISPONIBLES : +; load(val,adr) +; EEwrite() ;adr dans eeadr, donnée dans eedata +; EEread() ;adr dans eeadr, resultat dans eedata +; ----------------- + +; ----------------- +; load : charge 'valeur' dans 'adresse' +; 2 oct, 2 cycles +; ATTENTION : utilise W + +load MACRO val,adr + movlw val + movwf adr + ENDM + +; ----------------- +; EEwrite : écrit la valeur de W dans l'eeprom à l'adresse adr +; 13 oct +; ATTENTION : modifie W + +EEwrite MACRO + + bcf intcon,gie + bsf status,rp0 + + bsf eecon1,wren + load 055,eecon2 + load 0aa,eecon2 + bsf eecon1,wr + + bcf status,rp0 + bsf intcon,gie + ENDM + +; ----------------- +; EEread : lit une donnée d'eeprom à l'adresse pointée par eeadr +; et met le résultat dans eedata +; 7 oct + +EEread MACRO + bsf status,rp0 + bsf eecon1,rd + bcf status, rp0 + ENDM diff --git a/2004/n/mic799/mic799.asm b/2004/n/mic799/mic799.asm new file mode 100644 index 0000000..d8ecce5 --- /dev/null +++ b/2004/n/mic799/mic799.asm @@ -0,0 +1,447 @@ +; NIQ800 : free clone of MIC800 +; clock : 4,096MHz ( T_inst=1us ) +; serial line : 9600bps ( T= 104 cycles ) +;-------------------- +;Trame de commande : +; 1er octet de controle: Res-EE-cs2-cs1-cs0-s2-s1-s0 +; 2eme octet de position: la position du servo de 0 à 255 + +; Maximum 1,25ms entre les deux octets, sinon, le premier est oublié + + +;-------------------------------- + errorlevel 0, -224, -205, -302 +;-------------------------------- + +;----- PORTABILITE -------------- + + include "p16f876.inc" + include "m_84.asm" + __CONFIG _DEBUG_OFF & _WRT_ENABLE_ON & _CPD_OFF & _LVP_OFF & _BODEN_ON & _PWRTE_ON & _WDT_OFF & _XT_OSC + +servo0 equ 0 + + +Same equ 1 +MSB equ 7 + +;***************** Communication Parameters ************************** +; +X_MODE equ 1 ; If ( X_MODE==1) Then transmit LSB first +; if ( X_MODE==0) Then transmit MSB first ( CODEC like ) +R_MODE equ 1 ; If ( R_MODE==1) Then receive LSB first +; if ( X_MODE==0) Then receive MSB first ( CODEC like ) +X_Nbit equ 1 ; if (X_Nbit==1) # of data bits ( Transmission ) is 8 else 7 +R_Nbit equ 1 ; if (R_Nbit==1) # of data bits ( Reception ) is 8 else 7 +; +Sbit2 equ 0 ; if Sbit2 = 0 then 1 Stop Bit else 2 Stop Bits +; +;************************************************************************* +;X_flag equ PA0 ; Bit 5 of F3 ( PA0 ) +;R_flag equ PA1 ; Bit 6 of F3 ( PA1 ) +; +BAUD_1 equ .68 ; 3+3X = CLKOUT/Baud +BAUD_2 equ .67 ; 6+3X = CLKOUT/Baud +BAUD_3 equ .34 ; 3+3X = 0.5*CLKOUT/Baud +BAUD_4 equ .86 ; 3+3X = 1.25*CLKOUT/Baud +BAUD_X equ .66 ; 11+3X = CLKOUT/Baud +BAUD_Y equ .66 ; 9 +3X = CLKOUT/Baud + + +; -- Scratchpad du pic utilisé ( 1er adresse mémoire utilisable ) +sp equ h'20' ;(PIC 16f876) + +debug equ 0 ; debugging + +;-------------------------------- +; Variable definition +CBLOCK sp +buffer_in +value:1 +command:1 +chipID:1 +flags:1 +countwdt:1 +curentvalue:1 +wsave:1 +statussave +tabval:8 +RcvReg :1 ; Data received +XmtReg :1 ; Data to be transmitted +Count :1 ; Counter for #of Bits Transmitted +DlyCnt :1 +ENDC + +rtcc equ tmr0 + +; bits de porta +chID0 equ 0 +chID1 equ 1 +chID2 equ 2 +;servo0 equ 0 + +; dans flags +ms2 equ 0 ; continuer la deuxième ms +portvide equ 1 +f_sec_octet equ 2 +; -- bits de flags +bus_wr equ 3 + +; bits de l'octet commande : +reset_b equ 7 +eeprom_b equ 6 + +;----------------------------- +;----------------------------- +BUSROBOT.ASM +;----------------------------- +;----------------------------- + +; -- option +optionval equ b'01000010' +edg_msk equ b'01000000' + + +; ***** Mise à jour de l'EEPROM +; *********************************************** + + org h'2100' + de 1,.40,.75,.110,.145,.180,.215,.255 + + +; ***** Début du code +; *********************************************** + ORG 0 ;vecteur de reset + goto reset + ORG 4 +serviceint: + btfsc intcon,intf + goto busint + +; ***** Interuption de timer ***** + btfss flags,ms2 ; test du flag seconde moitié + goto suite2ms + +clr: ;on efface toutes les lignes + clrf portb + bcf porta,servo0 + bsf flags,portvide ; ça y est le port est bien vide + bcf intcon,t0if ;flag timer + retfie + +suite2ms: ; on lance la seconde moitié + bsf flags,ms2 ; flag qui dit qu'on est entré dans la seconde moitié + + movwf wsave + + clrf rtcc + movf curentvalue,w ; on remplit la rtcc + subwf rtcc,f + + bcf intcon,t0if ;flag timer + movf wsave,w + retfie + + +; ***** Interuption de bus ***** +busint: + movwf wsave + movf status,w + movwf statussave + +;*************************************************************** +; Receiver +; +Rcvr + IF R_Nbit + movlw 8 ; 8 Data bits + ELSE + movlw 7 ; 7 data bits + ENDIF +; + movwf Count +R_next bcf STATUS,C + IF R_MODE + rrf RcvReg,Same ; to set if MSB first or LSB first + ELSE + rlf RcvReg,Same + ENDIF + btfsc PORTA,DR +; + IF R_MODE + IF R_Nbit + bsf RcvReg,MSB ; Conditional Assembly + ELSE + bsf RcvReg,MSB-1 + ENDIF + ELSE + bsf RcvReg,LSB + ENDIF +; + call DelayY + decfsz Count,Same + goto R_next +;**************************************************** +;R_over movf RcvReg,0 ; Send back What is Just Received +; movwf XmtReg + + call work + +;**************************************************** +; Transmitter +; +Xmtr + IF X_Nbit + movlw 8 + ELSE + movlw 7 + ENDIF + movwf Count +; + IF X_MODE + ELSE + IF X_Nbit + ELSE + rlf XmtReg,Same + ENDIF + ENDIF +; + bcf PORTA,DX ; Send Start Bit + call Delay1 +X_next bcf STATUS,C +; + IF X_MODE + rrf XmtReg,Same ; Conditional Assembly + ELSE ; to set if MSB first or LSB first + rlf XmtReg,Same + ENDIF +; + btfsc STATUS,C + bsf PORTA,DX + btfss STATUS,C + bcf PORTA,DX + call DelayX + decfsz Count,Same + goto X_next + bsf PORTA,DX ; Send Stop Bit + call Delay1 +; + IF Sbit2 + bsf PORTA,DX + call Delay1 + ENDIF +; + goto finbusint +; +; End of Transmission +; + +DelayY movlw BAUD_Y + goto save +DelayX movlw BAUD_X + goto save +Delay4 movlw BAUD_4 + goto save +Delay1 movlw BAUD_1 ; 104 uS for 9600 baud + goto save +Delay2 movlw BAUD_2 +save movwf DlyCnt +redo_1 decfsz DlyCnt,Same + goto redo_1 + retlw 0 +; + + +;---------------------------- +;-- old bus_int +;---------------------------- + movf portc,w + + btfsc flags,f_sec_octet + goto sec_octet + movwf command + bsf flags,f_sec_octet + goto finbusint + +sec_octet + movwf value + call work + bcf flags,f_sec_octet + +;----- dans tous les cas -------- +finbusint: + movf statussave,w + movwf status + movf wsave,w + bcf intcon,intf + retfie + + +; ***** La sous-routine de reset ***** +reset: +; pour les tris, seuls les lignes à 0 peuvent être basculées en entrée. Les broches à 1 doivent rester en entrée ( sauf la broche RW dans le cas d'une liaison non-duplex ) + movlw b'11111111' + tris porta + movlw b'11111101' ; B7-B2 = input / B1 = TX / B0 = RX + tris portb + movlw b'00000000' ; C7-C2 = output / C1 = servo1 / C0 servo0 + tris portc + clrf portc + + movlw optionval + option + + clrf buffer_in + + bsf flags,portvide + bcf flags,f_sec_octet + + movlw b'10110000' ; (G|EE|T|I|Rb|T|I|Rb) + movwf intcon + + call restore_defaults + goto main + +;---------------- +restore_defaults: + clrf eeadr + movlw tabval + movwf fsr +I=0 +WHILE I<=7 +; EEread ; lit l'eeprom à l'adresse eeadr et place le résultat dans eedata +; movf eedata,w + movlw .128 + movwf indf + + incf fsr,f + incf eeadr,f +I++ +ENDW + return + + + +;------------------------------ +; interprétation de la commande +; 1er octet de controle: D5-D0 ! type ! voie +; type=1 => IO +; voie=1 => in +; voie=0 => out +; type=0 => servo +; voie=1 => servo1 +; voie=0 => servo0 + +work: + movf RcvReg,w + movwf XmtReg,f ; on prépare l'écho de la commande + +; type de trame + btfss RcvReg,1 + goto setServo + +;-- Gestion des IO +setIO + btfss RcvReg,1 + goto IOout +;- +IOin + movf portb,w + movwf XmtReg,f + +;mise en forme de la trame : + bsf XmtReg,0 ; IO + bsf XmtReg,1 ; in + + return + +;- +IOout + movf RcvReg,w + andlw '11111100' + movwf command + + movf portc,w + ; il faut bouger toutes les pattes du portb sans toucher aux servos + andlw '00000011' ; on efface les IO + iorwf command ; on les met à jour avec la nouvelle valeur + + movwf portc + return + + +;-- Gestion des servos +setServo +; n° de servo + movf command,w + andlw b'11111100' + movwf value,f + + andlw b'00000001' + movwf eeadr ; on prépare l'écriture en eeprom + addlw tabval + movwf fsr ; on met à jour le pointeur de tableau + + movf value,w ; on copie la valeur dans le tableau + movwf indf + + +; écriture en eeprom ? +; btfsc command,eeprom_b +; goto seteeprom +; +; return + +;seteeprom: +; movwf eedata ; on met la valeur dans eedata +; EEwrite + + return + + +;---- on passe par une macro pour spécifier le label en local +waitnext MACRO + LOCAL again + +again: btfss flags,portvide ; si le portb est vide, alors il faut lancer le signal du servo suivant + goto again ; sinon, on continue le poling + + ENDM + +;--------------- +main: +I=0 +WHILE I<=7 + waitnext ;exécute la macro + + bcf flags,ms2 + movlw I + addlw tabval + movwf fsr + +; ---- MODE PROTEGE ON ---- + bcf intcon,gie + +IF I==7 ;on allume la bonne ligne de sortie + bsf porta,servo0 +ELSE + bsf portb,I+1 +ENDIF + bcf flags,portvide ; le port n'est plus vide + +; on charge la rtcc pour attendre la première ms + load .198,rtcc + +; on met la valeur de la "seconde ms" dans curentvalue +; par cette technique, la position est échelonée de 0 à 255 ( avant : 1 correspondait au 1ms, donc on incrémente la valeur, comme ça 0 correspond au 1 qui correspond à 1ms ) + incf indf,w + movwf curentvalue + + bsf intcon,gie +; ---- MODE PROTEGE OFF ---- + +I++ +ENDW + goto main + +END diff --git a/2004/n/mic799/mic799.pjt b/2004/n/mic799/mic799.pjt new file mode 100644 index 0000000..378f342 --- /dev/null +++ b/2004/n/mic799/mic799.pjt @@ -0,0 +1,94 @@ +[PROJECT] +Target=MIC799.HEX +Development_Mode=2 +Processor=0x876f +ToolSuite=Microchip +[Fuses] +Frequency=4000000.000000 +ClockSource=1 +Mode=0 +WDTEnable=0 +WDTBreak=0 +WDTPrescale=710 +StackBreak=0 +Freeze=1 +EmulatorMemory=1 +ShortWrites=0 +PwrSetting=0 +OSC_Settings=0 +ProgBankRegEnable=0 +BankRegStartAddress=0 +BankRegEndAddress=0 +DisableIoPins=0 +12CXXX_MCLR_ENABLE=0 +CPP2_ENABLE=0 +LPSC_ENABLE=0 +MCLRPU_ENABLE=0 +[Directories] +Include= +Library= +LinkerScript= +[Target Data] +FileList=MIC799.ASM; +BuildTool=MPASM +OptionString=/e+;/l+;/x-;/c-; +AdditionalOptionString= +BuildRequired=0 +[MIC799.ASM] +Type=4 +Path= +FileList=P16F876.INC;M_84.ASM; +BuildTool= +OptionString= +AdditionalOptionString= +[P16F876.INC] +Type=5 +Path= +FileList= +BuildTool= +OptionString= +AdditionalOptionString= +[M_84.ASM] +Type=5 +Path=C:\DOCUME~1\ADMINI~1\BUREAU\MIC800\.\ +FileList= +BuildTool= +OptionString= +AdditionalOptionString= +[Trace-Config] +GetAddress=1 +AddressWidth=5.000000 +GetOpcode=1 +OpcodeWidth=5.000000 +GetLabel=1 +LabelWidth=8.000000 +GetInstruction=1 +InstructionWidth=10.000000 +InstructionRaw=1 +GetSrcAddr=1 +SrcAddrWidth=4.000000 +SrcAddrRaw=1 +GetSrcValue=1 +SrcValueWidth=4.000000 +GetDstAddr=1 +DstAddrWidth=4.000000 +DstAddrRaw=1 +GetDstValue=1 +DstValueWidth=4.000000 +GetExtInputs=1 +ExtInputsWidth=9.000000 +ExtInputsHexFmt=0 +GetTimeStamp=1 +TimeStampWidth=11.000000 +TimeStampDiplay=0 +TraceLines=100 +TraceFull=0 +CodeCoverageReset=0 +[Windows] +4=0004 56 178 953 586 9 0 +3=0000 c:\docume~1\admini~1\bureau\mic800\mic799.asm 8 5 814 432 9 0 +2=0000 .\m_84.asm 72 401 208 651 9 0 +1=0100 682 524 955 618 9 4 +0=0020 739 1 1024 270 9 0 +[mru-list] +1=c:\docume~1\admini~1\bureau\mic800\mic799.asm -- cgit v1.2.3