From d7646f5342cd8c9299feb2ba5cc8a03afaf3a923 Mon Sep 17 00:00:00 2001 From: prot Date: Wed, 30 Jun 2004 16:35:48 +0000 Subject: Ajout de fichiers --- 2004/n/mic799/mic799.asm | 370 ++++++++++++++++++++++++----------------------- 1 file changed, 189 insertions(+), 181 deletions(-) (limited to '2004/n') diff --git a/2004/n/mic799/mic799.asm b/2004/n/mic799/mic799.asm index d8ecce5..b4d7324 100644 --- a/2004/n/mic799/mic799.asm +++ b/2004/n/mic799/mic799.asm @@ -17,7 +17,7 @@ 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 + __CONFIG _DEBUG_OFF & _WRT_ENABLE_ON & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC servo0 equ 0 @@ -25,28 +25,6 @@ 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) @@ -70,10 +48,18 @@ RcvReg :1 ; Data received XmtReg :1 ; Data to be transmitted Count :1 ; Counter for #of Bits Transmitted DlyCnt :1 +counter :1 +subcounter :1 ENDC rtcc equ tmr0 +DR equ 0 +DX equ 1 +servo0 equ 0 +servo1 equ 1 + + ; bits de porta chID0 equ 0 chID1 equ 1 @@ -102,6 +88,30 @@ optionval equ b'01000010' edg_msk equ b'01000000' + + +;*** Macros pour lire les AD *** +wait_ad MACRO + local loop +loop: + btfsc adcon0,go + goto loop + ENDM + +admesure MACRO + bsf status,rp0 + movf adresl,w + bcf status,rp0 + ENDM + +BANK1 macro + bsf status,rp0 + endm + +BANK0 macro + bcf status,rp0 + endm + ; ***** Mise à jour de l'EEPROM ; *********************************************** @@ -115,7 +125,7 @@ edg_msk equ b'01000000' goto reset ORG 4 serviceint: - btfsc intcon,intf + btfss intcon,t0if goto busint ; ***** Interuption de timer ***** @@ -123,8 +133,8 @@ serviceint: goto suite2ms clr: ;on efface toutes les lignes - clrf portb - bcf porta,servo0 + bcf portc,servo0 + bcf portc,servo1 bsf flags,portvide ; ça y est le port est bien vide bcf intcon,t0if ;flag timer retfie @@ -148,125 +158,19 @@ busint: movwf wsave movf status,w movwf statussave + bcf intcon,gie ;interruption non protégée -;*************************************************************** -; 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 -; + movf rcreg,w -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 -; + movwf XmtReg + incf XmtReg,f + call txhard + movf rcreg,w + call analyse -;---------------------------- -;-- old bus_int -;---------------------------- - movf portc,w - - btfsc flags,f_sec_octet - goto sec_octet - movwf command - bsf flags,f_sec_octet - goto finbusint + goto finbusint -sec_octet - movwf value - call work - bcf flags,f_sec_octet ;----- dans tous les cas -------- finbusint: @@ -279,26 +183,50 @@ finbusint: ; ***** La sous-routine de reset ***** reset: + clrf intcon +; entrées analogiques + bsf status,RP0 + movlw b'00000010' + movwf adcon1 + bcf status,RP0 + + movlw b'01000001' + movwf adcon0 + ; 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' + movlw b'11111111' ; A0-A5 = AN1-6 tris porta movlw b'11111101' ; B7-B2 = input / B1 = TX / B0 = RX tris portb - movlw b'00000000' ; C7-C2 = output / C1 = servo1 / C0 servo0 + movlw b'10000000' ; C7 = RX C6 = TXmit C5-C2 = output / C1 = servo1 / C0 servo0 tris portc clrf portc movlw optionval option + BANK1 + movlw b'00100100' + movwf txsta + movlw .25 + movwf spbrg + + bsf pie1,rcie ;interruption du port série + + BANK0 + movlw b'10010000' + movwf rcsta + clrf buffer_in bsf flags,portvide bcf flags,f_sec_octet - movlw b'10110000' ; (G|EE|T|I|Rb|T|I|Rb) +; movlw b'11110000' ; (G|PEIE|T|I|Rb|T|I|Rb) + movlw b'11100000' ; (G|PEIE|T|I|Rb|T|I|Rb) movwf intcon - + + call restore_defaults goto main @@ -311,7 +239,7 @@ I=0 WHILE I<=7 ; EEread ; lit l'eeprom à l'adresse eeadr et place le résultat dans eedata ; movf eedata,w - movlw .128 + movlw .0 movwf indf incf fsr,f @@ -324,7 +252,7 @@ ENDW ;------------------------------ ; interprétation de la commande -; 1er octet de controle: D5-D0 ! type ! voie +; 1er octet de controle: type ! voie ! D5-D0 ; type=1 => IO ; voie=1 => in ; voie=0 => out @@ -332,59 +260,60 @@ ENDW ; voie=1 => servo1 ; voie=0 => servo0 -work: - movf RcvReg,w - movwf XmtReg,f ; on prépare l'écho de la commande +analyse: + movwf RcvReg + movwf command + movwf XmtReg ; on prépare l'écho de la commande ; type de trame - btfss RcvReg,1 + btfss RcvReg,7 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 +; btfss RcvReg,6 +; goto IOout +; return ;- IOout movf RcvReg,w - andlw '11111100' movwf command + rlf command,f + rlf command,w + movlw b'11111100' + andwf command,f + +; ---- MODE PROTEGE ON ---- + bcf intcon,gie 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 + ; il faut bouger toutes les pattes du portc sans toucher aux servos + andlw b'00000011' ; on efface les IO + iorwf command,w ; on les met à jour avec la nouvelle valeur movwf portc + + bsf intcon,gie +; ---- MODE PROTEGE OFF ---- + 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 eeadr ; on prépare l'écriture en eeprom + movlw tabval movwf fsr ; on met à jour le pointeur de tableau - movf value,w ; on copie la valeur dans le tableau - movwf indf + btfsc command,6 ; on incrémente si c'est le servo 1 + incf fsr,f + rlf command,f + rlf command,w +; movf value,w ; on copie la valeur dans le tableau + movwf indf ; écriture en eeprom ? ; btfsc command,eeprom_b @@ -411,7 +340,7 @@ again: btfss flags,portvide ; si le portb est vide, alors il faut lancer le sign ;--------------- main: I=0 -WHILE I<=7 +WHILE I<=1 waitnext ;exécute la macro bcf flags,ms2 @@ -422,11 +351,10 @@ WHILE I<=7 ; ---- 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 + movf indf,w + btfss status,z + bsf portc,I ; on lance le servo si sa position n'est pas nulle + bcf flags,portvide ; le port n'est plus vide ; on charge la rtcc pour attendre la première ms @@ -439,9 +367,89 @@ ENDIF bsf intcon,gie ; ---- MODE PROTEGE OFF ---- +I++ +ENDW + +; Envoi d'un octet de synchro + movlw '?' + movwf XmtReg + call txhard + call waittx + +; ENVOI DES DONNEES LOGIQUES +; envoi des entrées comparées +envoi + nop + swapf portb,w +; DEBUG +; movlw '0' + andlw b'11110000' ; les entrées numériques sont sur B0-B3 + iorlw b'00000111' ; les entrées comparées sont la voie 7 + movwf XmtReg + call txhard ; tx version hard + call waittx + movf portb,w +; DEBUG +; movlw '0' + andlw b'11110000' ; les entrées comparées sont sur B4-B7 +; xorlw b'11000000' ; petite inversion de cablage des comparateurs + iorlw b'00000000' ; les entrées comparées sont la voie 0 + movwf XmtReg + call txhard ; tx version hard + call waittx + +; ENVOI DES DONNEES ANALOGIQUES +I=0 +WHILE I<=3 + movlw b'11000111' + andwf adcon0,f + movlw (I*8) + iorwf adcon0,f ; on choisit la voie I + nop + + bsf adcon0,go + wait_ad + admesure +; DEBUG +; movlw '0' + andlw b'11111000' ; les entrées numériques sont sur B0-B3 + iorlw I ; les entrées comparées sont la voie I + movwf XmtReg + call txhard ; tx version hard + call waittx I++ ENDW + call wait20ms goto main +; *** envoi série +txhard + movf XmtReg,w + movwf txreg + return + +waittx + call wait1ms + return + + + +;*** routine d'attente +wait20ms + load .20,counter +loop20 + call wait1ms + decfsz counter,f + goto loop20 + return + +wait1ms + clrf subcounter +loop1 nop + decfsz subcounter,f + goto loop1 + return + + END -- cgit v1.2.3