; Mesure avec un capteur de température numérique DS1620 ; Dialogue via RS232C ; Utilisation de l'USART du 16F628A avec interruptions ; 9600 bauds/s ; 8 bits de données ; Pas de bit de parité ; 1 bit de STOP ; Pas de contrôle de flux ; (C) Fabrice Sincère, septembre 2007 ; IUT Nancy-Brabois ; Version 1.04 ; Microcontrôleur PIC 16F628A ; Langage : assembleur ; Développé avec Microchip MPLAB IDE Errorlevel-302 ; Supprime le message "Ensure that bank bits are correct" List p=16F628A ; processeur utilisé #include __config _CP_OFF & _WDT_OFF & _PWRTE_ON & _HS_OSC & _LVP_OFF & _DATA_CP_OFF & _BOREN_ON & _MCLRE_ON ; bits de configuration : ; code protect OFF ; watchdog timer OFF ; power up timer ON ; oscillateur HS (quartz 20 MHz) ; low voltage program OFF ; data EE read protect OFF ; brown out detect ON ; master clear enable ON ;xxxxxx ; Macro ;xxxxxx bank1 macro ; passage en banque 1 bsf STATUS,RP0 bcf STATUS,RP1 endm bank0 macro ; passage en banque 0 bcf STATUS,RP0 bcf STATUS,RP1 endm ;xxxxxxxxxxxxxxxxxxxxxxxxxx ; Déclaration des variables ;xxxxxxxxxxxxxxxxxxxxxxxxxx CBLOCK 0x070 ; début de la zone des registres d'usage général du 16F628A ; (banque quelconque : 0,1,2 ou 3) ; 0x070 - 0x07F : 16 variables STATUS_TEMP : 1 ; sauvegarde du registre STATUS (routine d'interruption) W_TEMP : 1 ; sauvegarde du registre W (routine d'interruption) octet : 1 ; octet reçu (broche RX de l'UART) octet1 : 1 ; 1er octet reçu : contient le code instruction 8 bits octet2 : 1 ; 2eme octet reçu : ; (0000000 D8) pour les instructions de type WRITE (DS1620) ; (00000000) non utilisé pour les instructions de type READ (DS1620) octet3 : 1 ; 3eme octet reçu : contient le niveau des bits DB7-DB0 : ; (D7 ... D0) pour les instructions de type WRITE (DS1620) ; (00000000) non utilisé pour les instructions de type READ (DS1620) nb_octet_recu : 1 ; nombre d'octets reçus ; (valeur initiale : 0) octet1_tx : 1 ; 1er octet à transmettre vers l'ordinateur octet2_tx : 1 ; 2ème octet à transmettre vers l'ordinateur nb_octet_transmis : 1 ; nombre d'octets transmis ; (valeur initiale : 0) ENDC ;xxxxxxxxxxxxxxxxxxxx ; Démarrage sur reset ;xxxxxxxxxxxxxxxxxxxx org 0x0000 goto initialisation ; xxxxxxxxxxxxxxxxxxxxxxxxxxxxx ; Routine d'interruption ; 2 sources d'interruption : ; - réception (UART) ; - émission (UART) ; xxxxxxxxxxxxxxxxxxxxxxxxxxxxx org 0x0004 ; vecteur d'interruption movwf W_TEMP swapf STATUS,W movwf STATUS_TEMP ; sauvegarde du registre W puis du registre STATUS bank1 btfss PIE1, RCIE goto int1 bank0 btfsc PIR1, RCIF goto reception int1 bank1 btfss PIE1, TXIE goto int2 bank0 btfsc PIR1, TXIF goto emission int2 goto restauration ;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ; Traitement de l'interruption de réception de l'USART ;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx reception bank0 incf nb_octet_recu , f ; on incrémente (nb_octet_recu) movf RCREG , W ; N.B. le flag RCIF est remis à 0 par une lecture du registre RCREG movwf octet ; les 8 bits de données sont transférés dans (octet) movlw D'1' subwf nb_octet_recu , W btfss STATUS , Z goto rec2 ; réception du 1er octet movf octet , W movwf octet1 ; on teste s'il s'agit bien du 1er octet ; (donc valeur 0xAA ou 0x01 ou 0x02 ou 0xA1 ou 0xA2) movlw 0xAA subwf octet1 , W btfsc STATUS , Z goto overrun movlw 0x01 subwf octet1 , W btfsc STATUS , Z goto overrun movlw 0x02 subwf octet1 , W btfsc STATUS , Z goto overrun movlw 0xA1 subwf octet1 , W btfsc STATUS , Z goto overrun movlw 0xA2 subwf octet1 , W btfsc STATUS , Z goto overrun probleme ; il ne s'agit pas du 1er octet clrf nb_octet_recu goto overrun rec2 movlw D'2' subwf nb_octet_recu , W btfss STATUS , Z goto rec3 ; réception du 2ème octet movf octet , W movwf octet2 goto overrun rec3 ; réception du 3ème octet movf octet , W movwf octet3 clrf nb_octet_recu ; On arrive ici quand les 3 octets sont reçus ; Décodage de l'instruction (1er octet : octet1) ; Read Temperature : code instruction 0xAA ; Write TH : code instruction 0x01 ; Write TL : code instruction 0x02 ; Read TH : code instruction 0xA1 ; Read TL : code instruction 0xA2 movlw 0xAA subwf octet1 , W btfss STATUS , Z goto cas2 call ReadTemperature goto cas_fin cas2 movlw 0x01 subwf octet1 , W btfss STATUS , Z goto cas3 call WriteTH clrf octet1_tx clrf octet2_tx goto cas_fin cas3 movlw 0x02 subwf octet1 , W btfss STATUS , Z goto cas4 call WriteTL clrf octet1_tx clrf octet2_tx goto cas_fin cas4 movlw 0xA1 subwf octet1 , W btfss STATUS , Z goto cas5 call ReadTH goto cas_fin cas5 ; c'est donc l'instruction Read TL (0xA2) call ReadTL ; goto cas_fin cas_fin clrf nb_octet_transmis bank1 bsf PIE1 , TXIE ; autorisation de l'interruption d'émission de l'USART bank0 goto overrun ;xxxxxxxxxxxxxxxxxxxxxxxxxxxx ; test d'une erreur d'overrun overrun bank0 btfss RCSTA , OERR goto int1 ; traitement de l'erreur d'overrun ; call erreur1 bcf RCSTA , CREN ; on efface le bit OERR bsf RCSTA , CREN ; on relance la réception goto int1 ; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ; Traitement de l'interruption d'émission de l'USART ; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx emission ; 2 octets à transmettre incf nb_octet_transmis , f ; on incrémente (nb_octet_transmis) movlw D'1' subwf nb_octet_transmis , W btfss STATUS , Z goto emm2 ; émission du 1er octet movf octet1_tx , W ;bank0 movwf TXREG ; transmission ; N.B. le flag TXIF est remis à 0 par une écriture dans le registre TXREG goto int2 emm2 ; émission du 2ème octet movf octet2_tx , W ;bank0 movwf TXREG ; transmission ; N.B. le flag TXIF est remis à 0 par une écriture dans le registre TXREG bank1 bcf PIE1 , TXIE ; interdiction de l'interruption d'émission de l'USART bank0 clrf nb_octet_transmis goto int2 restauration swapf STATUS_TEMP,W ; restauration des registres STATUS puis W movwf STATUS swapf W_TEMP,f swapf W_TEMP,W retfie ; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ; Routine ; Instruction Read Temperature ; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ReadTemperature ; RST = 0 ; CLK = 1 ; RST =1 (RB7 = 1) bsf PORTB , 7 ; CLK = 0 (RB6 = 0) ; pause 200 ns bcf PORTB , 6 nop ; DQ = 0 (bit 0 du code instruction) bcf PORTB , 0 ; CLK = 1 ; pause 200 ns bsf PORTB , 6 nop ; CLK = 0 ; pause 200 ns bcf PORTB , 6 nop ; DQ = 1 (bit 1 du code instruction) bsf PORTB , 0 ; CLK = 1 ; pause 200 ns bsf PORTB , 6 nop ; CLK = 0 ; pause 200 ns bcf PORTB , 6 nop ; DQ = 0 (bit 2 du code instruction) bcf PORTB , 0 ; CLK = 1 ; pause 200 ns bsf PORTB , 6 nop ; CLK = 0 ; pause 200 ns bcf PORTB , 6 nop ; DQ = 1 (bit 3 du code instruction) bsf PORTB , 0 ; CLK = 1 ; pause 200 ns bsf PORTB , 6 nop ; CLK = 0 ; pause 200 ns bcf PORTB , 6 nop ; DQ = 0 (bit 4 du code instruction) bcf PORTB , 0 ; CLK = 1 ; pause 200 ns bsf PORTB , 6 nop ; CLK = 0 ; pause 200 ns bcf PORTB , 6 nop ; DQ = 1 (bit 5 du code instruction) bsf PORTB , 0 ; CLK = 1 ; pause 200 ns bsf PORTB , 6 nop ; CLK = 0 ; pause 200 ns bcf PORTB , 6 nop ; DQ = 0 (bit 6 du code instruction) bcf PORTB , 0 ; CLK = 1 ; pause 200 ns bsf PORTB , 6 nop ; CLK = 0 ; pause 200 ns bcf PORTB , 6 nop ; DQ = 1 (bit 7 du code instruction) bsf PORTB , 0 ; CLK = 1 ; pause 200 ns bsf PORTB , 6 nop ; xxxxxxxx Lecture des 9 bits de données (D8...D0) ; configuration de RB0 en entrée bank1 movlw B'00111111' movwf TRISB bank0 ; lecture bit D0 ; CLK = 0 ; pause 200 ns bcf PORTB , 6 nop btfsc PORTB , 0 bsf octet2_tx , 0 btfss PORTB , 0 bcf octet2_tx , 0 ; CLK = 1 ; pause 200 ns bsf PORTB , 6 nop ; lecture bit D1 ; CLK = 0 ; pause 200 ns bcf PORTB , 6 nop btfsc PORTB , 0 bsf octet2_tx , 1 btfss PORTB , 0 bcf octet2_tx , 1 ; CLK = 1 bsf PORTB , 6 nop ; pause 200 ns ; lecture bit D2 ; CLK = 0 bcf PORTB , 6 nop ; pause 200 ns btfsc PORTB , 0 bsf octet2_tx , 2 btfss PORTB , 0 bcf octet2_tx , 2 ; CLK = 1 bsf PORTB , 6 nop ; pause 200 ns ; lecture bit D3 ; CLK = 0 bcf PORTB , 6 nop ; pause 200 ns btfsc PORTB , 0 bsf octet2_tx , 3 btfss PORTB , 0 bcf octet2_tx , 3 ; CLK = 1 bsf PORTB , 6 nop ; pause 200 ns ; lecture bit D4 ; CLK = 0 bcf PORTB , 6 nop ; pause 200 ns btfsc PORTB , 0 bsf octet2_tx , 4 btfss PORTB , 0 bcf octet2_tx , 4 ; CLK = 1 bsf PORTB , 6 nop ; pause 200 ns ; lecture bit D5 ; CLK = 0 bcf PORTB , 6 nop ; pause 200 ns btfsc PORTB , 0 bsf octet2_tx , 5 btfss PORTB , 0 bcf octet2_tx , 5 ; CLK = 1 bsf PORTB , 6 nop ; pause 200 ns ; lecture bit D6 ; CLK = 0 bcf PORTB , 6 nop ; pause 200 ns btfsc PORTB , 0 bsf octet2_tx , 6 btfss PORTB , 0 bcf octet2_tx , 6 ; CLK = 1 bsf PORTB , 6 nop ; pause 200 ns ; lecture bit D7 ; CLK = 0 bcf PORTB , 6 nop ; pause 200 ns btfsc PORTB , 0 bsf octet2_tx , 7 btfss PORTB , 0 bcf octet2_tx , 7 ; CLK = 1 bsf PORTB , 6 nop ; pause 200 ns ; lecture bit D8 ; CLK = 0 bcf PORTB , 6 nop ; pause 200 ns clrf octet1_tx btfsc PORTB , 0 bsf octet1_tx , 0 btfss PORTB , 0 bcf octet1_tx , 0 ; CLK = 1 bsf PORTB , 6 nop ; pause 200 ns ; RST =0 bcf PORTB , 7 nop ; pause 200 ns ; configuration de RB0 en sortie bank1 movlw B'00111110' movwf TRISB bank0 return ; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ; Routine ; Instruction Write TH ; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx WriteTH ; (RST = 0) ; CLK =1 (RB6 = 1) bsf PORTB , 6 ; RST =1 (RB7 = 1) bsf PORTB , 7 ; CLK = 0 (RB6 = 0) ; pause 200 ns bcf PORTB , 6 nop ; DQ = 1 (bit 0 du code instruction) (RB0 = 0) bsf PORTB , 0 ; CLK = 1 ; pause 200 ns bsf PORTB , 6 nop ; CLK = 0 ; pause 200 ns bcf PORTB , 6 nop ; DQ = 0 (bit 1 du code instruction) bcf PORTB , 0 ; CLK = 1 ; pause 200 ns bsf PORTB , 6 nop ; CLK = 0 ; pause 200 ns bcf PORTB , 6 nop ; DQ = 0 (bit 2 du code instruction) bcf PORTB , 0 ; CLK = 1 ; pause 200 ns bsf PORTB , 6 nop ; CLK = 0 ; pause 200 ns bcf PORTB , 6 nop ; DQ = 0 (bit 3 du code instruction) bcf PORTB , 0 ; CLK = 1 ; pause 200 ns bsf PORTB , 6 nop ; CLK = 0 ; pause 200 ns bcf PORTB , 6 nop ; DQ = 0 (bit 4 du code instruction) bcf PORTB , 0 ; CLK = 1 ; pause 200 ns bsf PORTB , 6 nop ; CLK = 0 ; pause 200 ns bcf PORTB , 6 nop ; DQ = 0 (bit 5 du code instruction) bcf PORTB , 0 ; CLK = 1 ; pause 200 ns bsf PORTB , 6 nop ; CLK = 0 ; pause 200 ns bcf PORTB , 6 nop ; DQ = 0 (bit 6 du code instruction) bcf PORTB , 0 ; CLK = 1 ; pause 200 ns bsf PORTB , 6 nop ; CLK = 0 ; pause 200 ns bcf PORTB , 6 nop ; DQ = 0 (bit 7 du code instruction) bcf PORTB , 0 ; CLK = 1 ; pause 200 ns bsf PORTB , 6 nop ; 9 bits de données (D8...D0) ; bit D0 bcf PORTB , 6 ; CLK = 0 nop ; pause 200 ns btfsc octet3 , 0 bsf PORTB , 0 btfss octet3 , 0 bcf PORTB , 0 bsf PORTB , 6 ; CLK = 1 nop ; pause 200 ns ; bit D1 bcf PORTB , 6 ; CLK = 0 nop ; pause 200 ns btfsc octet3 , 1 bsf PORTB , 0 btfss octet3 , 1 bcf PORTB , 0 bsf PORTB , 6 ; CLK = 1 nop ; pause 200 ns ; bit D2 bcf PORTB , 6 ; CLK = 0 nop ; pause 200 ns btfsc octet3 , 2 bsf PORTB , 0 btfss octet3 , 2 bcf PORTB , 0 bsf PORTB , 6 ; CLK = 1 nop ; pause 200 ns ; bit D3 bcf PORTB , 6 ; CLK = 0 nop ; pause 200 ns btfsc octet3 , 3 bsf PORTB , 0 btfss octet3 , 3 bcf PORTB , 0 bsf PORTB , 6 ; CLK = 1 nop ; pause 200 ns ; bit D4 bcf PORTB , 6 ; CLK = 0 nop ; pause 200 ns btfsc octet3 , 4 bsf PORTB , 0 btfss octet3 , 4 bcf PORTB , 0 bsf PORTB , 6 ; CLK = 1 nop ; pause 200 ns ; bit D5 bcf PORTB , 6 ; CLK = 0 nop ; pause 200 ns btfsc octet3 , 5 bsf PORTB , 0 btfss octet3 , 5 bcf PORTB , 0 bsf PORTB , 6 ; CLK = 1 nop ; pause 200 ns ; bit D6 bcf PORTB , 6 ; CLK = 0 nop ; pause 200 ns btfsc octet3 , 6 bsf PORTB , 0 btfss octet3 , 6 bcf PORTB , 0 bsf PORTB , 6 ; CLK = 1 nop ; pause 200 ns ; bit D7 bcf PORTB , 6 ; CLK = 0 nop ; pause 200 ns btfsc octet3 , 7 bsf PORTB , 0 btfss octet3 , 7 bcf PORTB , 0 bsf PORTB , 6 ; CLK = 1 nop ; pause 200 ns ; bit D8 bcf PORTB , 6 ; CLK = 0 nop ; pause 200 ns btfsc octet2 , 0 bsf PORTB , 0 btfss octet2 , 0 bcf PORTB , 0 bsf PORTB , 6 ; CLK = 1 nop ; pause 200 ns ; RST =0 bcf PORTB , 7 ; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ; pause de 13 ms (écriture dans l'EEPROM du DS1620 ; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx clrf TMR0 bcf INTCON , T0IF ; on efface le drapeau attente btfss INTCON , T0IF goto attente return ; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ; Routine ; Instruction Write TL WriteTL ; (RST = 0) ; CLK =1 (RB6 = 1) bsf PORTB , 6 ; RST =1 (RB7 = 1) bsf PORTB , 7 ; CLK = 0 (RB6 = 0) ; pause 200 ns bcf PORTB , 6 nop ; DQ = 0 (bit 0 du code instruction) (RB0 = 0) bcf PORTB , 0 ; CLK = 1 ; pause 200 ns bsf PORTB , 6 nop ; CLK = 0 ; pause 200 ns bcf PORTB , 6 nop ; DQ = 1 (bit 1 du code instruction) bsf PORTB , 0 ; CLK = 1 ; pause 200 ns bsf PORTB , 6 nop ; CLK = 0 ; pause 200 ns bcf PORTB , 6 nop ; DQ = 0 (bit 2 du code instruction) bcf PORTB , 0 ; CLK = 1 ; pause 200 ns bsf PORTB , 6 nop ; CLK = 0 ; pause 200 ns bcf PORTB , 6 nop ; DQ = 0 (bit 3 du code instruction) bcf PORTB , 0 ; CLK = 1 ; pause 200 ns bsf PORTB , 6 nop ; CLK = 0 ; pause 200 ns bcf PORTB , 6 nop ; DQ = 0 (bit 4 du code instruction) bcf PORTB , 0 ; CLK = 1 ; pause 200 ns bsf PORTB , 6 nop ; CLK = 0 ; pause 200 ns bcf PORTB , 6 nop ; DQ = 0 (bit 5 du code instruction) bcf PORTB , 0 ; CLK = 1 ; pause 200 ns bsf PORTB , 6 nop ; CLK = 0 ; pause 200 ns bcf PORTB , 6 nop ; DQ = 0 (bit 6 du code instruction) bcf PORTB , 0 ; CLK = 1 ; pause 200 ns bsf PORTB , 6 nop ; CLK = 0 ; pause 200 ns bcf PORTB , 6 nop ; DQ = 0 (bit 7 du code instruction) bcf PORTB , 0 ; CLK = 1 ; pause 200 ns bsf PORTB , 6 nop ; 9 bits de données (D8...D0) ; bit D0 bcf PORTB , 6 ; CLK = 0 nop ; pause 200 ns btfsc octet3 , 0 bsf PORTB , 0 btfss octet3 , 0 bcf PORTB , 0 bsf PORTB , 6 ; CLK = 1 nop ; pause 200 ns ; bit D1 bcf PORTB , 6 ; CLK = 0 nop ; pause 200 ns btfsc octet3 , 1 bsf PORTB , 0 btfss octet3 , 1 bcf PORTB , 0 bsf PORTB , 6 ; CLK = 1 nop ; pause 200 ns ; bit D2 bcf PORTB , 6 ; CLK = 0 nop ; pause 200 ns btfsc octet3 , 2 bsf PORTB , 0 btfss octet3 , 2 bcf PORTB , 0 bsf PORTB , 6 ; CLK = 1 nop ; pause 200 ns ; bit D3 bcf PORTB , 6 ; CLK = 0 nop ; pause 200 ns btfsc octet3 , 3 bsf PORTB , 0 btfss octet3 , 3 bcf PORTB , 0 bsf PORTB , 6 ; CLK = 1 nop ; pause 200 ns ; bit D4 bcf PORTB , 6 ; CLK = 0 nop ; pause 200 ns btfsc octet3 , 4 bsf PORTB , 0 btfss octet3 , 4 bcf PORTB , 0 bsf PORTB , 6 ; CLK = 1 nop ; pause 200 ns ; bit D5 bcf PORTB , 6 ; CLK = 0 nop ; pause 200 ns btfsc octet3 , 5 bsf PORTB , 0 btfss octet3 , 5 bcf PORTB , 0 bsf PORTB , 6 ; CLK = 1 nop ; pause 200 ns ; bit D6 bcf PORTB , 6 ; CLK = 0 nop ; pause 200 ns btfsc octet3 , 6 bsf PORTB , 0 btfss octet3 , 6 bcf PORTB , 0 bsf PORTB , 6 ; CLK = 1 nop ; pause 200 ns ; bit D7 bcf PORTB , 6 ; CLK = 0 nop ; pause 200 ns btfsc octet3 , 7 bsf PORTB , 0 btfss octet3 , 7 bcf PORTB , 0 bsf PORTB , 6 ; CLK = 1 nop ; pause 200 ns ; bit D8 bcf PORTB , 6 ; CLK = 0 nop ; pause 200 ns btfsc octet2 , 0 bsf PORTB , 0 btfss octet2 , 0 bcf PORTB , 0 bsf PORTB , 6 ; CLK = 1 nop ; pause 200 ns ; RST =0 bcf PORTB , 7 ; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ; pause de 13 ms (écriture dans l'EEPROM du DS1620 ; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx clrf TMR0 bcf INTCON , T0IF ; on efface le drapeau attente2 btfss INTCON , T0IF goto attente2 return ; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ; Routine ; Instruction Read TH ; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ReadTH ; RST = 0 ; CLK = 1 ; RST =1 (RB7 = 1) bsf PORTB , 7 ; CLK = 0 (RB6 = 0) ; pause 200 ns bcf PORTB , 6 nop ; DQ = 1 (bit 0 du code instruction) bsf PORTB , 0 ; CLK = 1 ; pause 200 ns bsf PORTB , 6 nop ; CLK = 0 ; pause 200 ns bcf PORTB , 6 nop ; DQ = 0 (bit 1 du code instruction) bcf PORTB , 0 ; CLK = 1 ; pause 200 ns bsf PORTB , 6 nop ; CLK = 0 ; pause 200 ns bcf PORTB , 6 nop ; DQ = 0 (bit 2 du code instruction) bcf PORTB , 0 ; CLK = 1 ; pause 200 ns bsf PORTB , 6 nop ; CLK = 0 ; pause 200 ns bcf PORTB , 6 nop ; DQ = 0 (bit 3 du code instruction) bcf PORTB , 0 ; CLK = 1 ; pause 200 ns bsf PORTB , 6 nop ; CLK = 0 ; pause 200 ns bcf PORTB , 6 nop ; DQ = 0 (bit 4 du code instruction) bcf PORTB , 0 ; CLK = 1 ; pause 200 ns bsf PORTB , 6 nop ; CLK = 0 ; pause 200 ns bcf PORTB , 6 nop ; DQ = 1 (bit 5 du code instruction) bsf PORTB , 0 ; CLK = 1 ; pause 200 ns bsf PORTB , 6 nop ; CLK = 0 ; pause 200 ns bcf PORTB , 6 nop ; DQ = 0 (bit 6 du code instruction) bcf PORTB , 0 ; CLK = 1 ; pause 200 ns bsf PORTB , 6 nop ; CLK = 0 ; pause 200 ns bcf PORTB , 6 nop ; DQ = 1 (bit 7 du code instruction) bsf PORTB , 0 ; CLK = 1 ; pause 200 ns bsf PORTB , 6 nop ; xxxxxxxx Lecture des 9 bits de données (D8...D0) ; configuration de RB0 en entrée bank1 movlw B'00111111' movwf TRISB bank0 ; lecture bit D0 ; CLK = 0 ; pause 200 ns bcf PORTB , 6 nop btfsc PORTB , 0 bsf octet2_tx , 0 btfss PORTB , 0 bcf octet2_tx , 0 ; CLK = 1 ; pause 200 ns bsf PORTB , 6 nop ; lecture bit D1 ; CLK = 0 ; pause 200 ns bcf PORTB , 6 nop btfsc PORTB , 0 bsf octet2_tx , 1 btfss PORTB , 0 bcf octet2_tx , 1 ; CLK = 1 bsf PORTB , 6 nop ; pause 200 ns ; lecture bit D2 ; CLK = 0 bcf PORTB , 6 nop ; pause 200 ns btfsc PORTB , 0 bsf octet2_tx , 2 btfss PORTB , 0 bcf octet2_tx , 2 ; CLK = 1 bsf PORTB , 6 nop ; pause 200 ns ; lecture bit D3 ; CLK = 0 bcf PORTB , 6 nop ; pause 200 ns btfsc PORTB , 0 bsf octet2_tx , 3 btfss PORTB , 0 bcf octet2_tx , 3 ; CLK = 1 bsf PORTB , 6 nop ; pause 200 ns ; lecture bit D4 ; CLK = 0 bcf PORTB , 6 nop ; pause 200 ns btfsc PORTB , 0 bsf octet2_tx , 4 btfss PORTB , 0 bcf octet2_tx , 4 ; CLK = 1 bsf PORTB , 6 nop ; pause 200 ns ; lecture bit D5 ; CLK = 0 bcf PORTB , 6 nop ; pause 200 ns btfsc PORTB , 0 bsf octet2_tx , 5 btfss PORTB , 0 bcf octet2_tx , 5 ; CLK = 1 bsf PORTB , 6 nop ; pause 200 ns ; lecture bit D6 ; CLK = 0 bcf PORTB , 6 nop ; pause 200 ns btfsc PORTB , 0 bsf octet2_tx , 6 btfss PORTB , 0 bcf octet2_tx , 6 ; CLK = 1 bsf PORTB , 6 nop ; pause 200 ns ; lecture bit D7 ; CLK = 0 bcf PORTB , 6 nop ; pause 200 ns btfsc PORTB , 0 bsf octet2_tx , 7 btfss PORTB , 0 bcf octet2_tx , 7 ; CLK = 1 bsf PORTB , 6 nop ; pause 200 ns ; lecture bit D8 ; CLK = 0 bcf PORTB , 6 nop ; pause 200 ns clrf octet1_tx btfsc PORTB , 0 bsf octet1_tx , 0 btfss PORTB , 0 bcf octet1_tx , 0 ; CLK = 1 bsf PORTB , 6 nop ; pause 200 ns ; RST =0 bcf PORTB , 7 nop ; pause 200 ns ; configuration de RB0 en sortie bank1 movlw B'00111110' movwf TRISB bank0 return ; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ; Routine ; Instruction Read TL ; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ReadTL ; RST = 0 ; CLK = 1 ; RST =1 (RB7 = 1) bsf PORTB , 7 ; CLK = 0 (RB6 = 0) ; pause 200 ns bcf PORTB , 6 nop ; DQ = 0 (bit 0 du code instruction) bcf PORTB , 0 ; CLK = 1 ; pause 200 ns bsf PORTB , 6 nop ; CLK = 0 ; pause 200 ns bcf PORTB , 6 nop ; DQ = 1 (bit 1 du code instruction) bsf PORTB , 0 ; CLK = 1 ; pause 200 ns bsf PORTB , 6 nop ; CLK = 0 ; pause 200 ns bcf PORTB , 6 nop ; DQ = 0 (bit 2 du code instruction) bcf PORTB , 0 ; CLK = 1 ; pause 200 ns bsf PORTB , 6 nop ; CLK = 0 ; pause 200 ns bcf PORTB , 6 nop ; DQ = 0 (bit 3 du code instruction) bcf PORTB , 0 ; CLK = 1 ; pause 200 ns bsf PORTB , 6 nop ; CLK = 0 ; pause 200 ns bcf PORTB , 6 nop ; DQ = 0 (bit 4 du code instruction) bcf PORTB , 0 ; CLK = 1 ; pause 200 ns bsf PORTB , 6 nop ; CLK = 0 ; pause 200 ns bcf PORTB , 6 nop ; DQ = 1 (bit 5 du code instruction) bsf PORTB , 0 ; CLK = 1 ; pause 200 ns bsf PORTB , 6 nop ; CLK = 0 ; pause 200 ns bcf PORTB , 6 nop ; DQ = 0 (bit 6 du code instruction) bcf PORTB , 0 ; CLK = 1 ; pause 200 ns bsf PORTB , 6 nop ; CLK = 0 ; pause 200 ns bcf PORTB , 6 nop ; DQ = 1 (bit 7 du code instruction) bsf PORTB , 0 ; CLK = 1 ; pause 200 ns bsf PORTB , 6 nop ; xxxxxxxx Lecture des 9 bits de données (D8...D0) ; configuration de RB0 en entrée bank1 movlw B'00111111' movwf TRISB bank0 ; lecture bit D0 ; CLK = 0 ; pause 200 ns bcf PORTB , 6 nop btfsc PORTB , 0 bsf octet2_tx , 0 btfss PORTB , 0 bcf octet2_tx , 0 ; CLK = 1 ; pause 200 ns bsf PORTB , 6 nop ; lecture bit D1 ; CLK = 0 ; pause 200 ns bcf PORTB , 6 nop btfsc PORTB , 0 bsf octet2_tx , 1 btfss PORTB , 0 bcf octet2_tx , 1 ; CLK = 1 bsf PORTB , 6 nop ; pause 200 ns ; lecture bit D2 ; CLK = 0 bcf PORTB , 6 nop ; pause 200 ns btfsc PORTB , 0 bsf octet2_tx , 2 btfss PORTB , 0 bcf octet2_tx , 2 ; CLK = 1 bsf PORTB , 6 nop ; pause 200 ns ; lecture bit D3 ; CLK = 0 bcf PORTB , 6 nop ; pause 200 ns btfsc PORTB , 0 bsf octet2_tx , 3 btfss PORTB , 0 bcf octet2_tx , 3 ; CLK = 1 bsf PORTB , 6 nop ; pause 200 ns ; lecture bit D4 ; CLK = 0 bcf PORTB , 6 nop ; pause 200 ns btfsc PORTB , 0 bsf octet2_tx , 4 btfss PORTB , 0 bcf octet2_tx , 4 ; CLK = 1 bsf PORTB , 6 nop ; pause 200 ns ; lecture bit D5 ; CLK = 0 bcf PORTB , 6 nop ; pause 200 ns btfsc PORTB , 0 bsf octet2_tx , 5 btfss PORTB , 0 bcf octet2_tx , 5 ; CLK = 1 bsf PORTB , 6 nop ; pause 200 ns ; lecture bit D6 ; CLK = 0 bcf PORTB , 6 nop ; pause 200 ns btfsc PORTB , 0 bsf octet2_tx , 6 btfss PORTB , 0 bcf octet2_tx , 6 ; CLK = 1 bsf PORTB , 6 nop ; pause 200 ns ; lecture bit D7 ; CLK = 0 bcf PORTB , 6 nop ; pause 200 ns btfsc PORTB , 0 bsf octet2_tx , 7 btfss PORTB , 0 bcf octet2_tx , 7 ; CLK = 1 bsf PORTB , 6 nop ; pause 200 ns ; lecture bit D8 ; CLK = 0 bcf PORTB , 6 nop ; pause 200 ns clrf octet1_tx btfsc PORTB , 0 bsf octet1_tx , 0 btfss PORTB , 0 bcf octet1_tx , 0 ; CLK = 1 bsf PORTB , 6 nop ; pause 200 ns ; RST =0 bcf PORTB , 7 nop ; pause 200 ns ; configuration de RB0 en sortie bank1 movlw B'00111110' movwf TRISB bank0 return ;xxxxxxxxxxxxxxx ; Initialisation ;xxxxxxxxxxxxxxx initialisation bank0 clrf PORTA ; mise à 0 des sorties du port A clrf PORTB ; mise à 0 des sorties du port B movlw B'00000111' movwf CMCON ; inactivation des comparateurs analogiques bank1 movlw B'11010111' movwf OPTION_REG ; bit 7 (/RBPU) = 1 : valeur par défaut (option non utilisée) ; bit 6 (INTEDG) = 1 : valeur par défaut (option non utilisée) ; bit 5 (T0CS) = 0 : l'horloge interne est l'horloge du timer0 ; bit 4 (T0SE) = 1 : valeur par défaut (option non utilisée) ; bit 3 (PSA) = 0 ; bit 2 (PS2) = 1 ; bit 1 (PS1) = 1 ; bit 0 (PS0) = 1 ; Prescaler du Timer0 = 1:256 ; Watchdog sans prescaler (1:1) ; le timer0 déborde toutes les 256*256*0,2 µs # 13 ms movlw B'11111111' movwf TRISA ; bits 0 à 7 du port A (RA0 à RA7) = 1 : configuration en entrée, par exemple movlw B'00111110' movwf TRISB ; bit 0 du port B (RB0) = 0 : configuration en sortie (broche DQ, capteur DS1620) ; bit 1 du port B (RB1) = 1 : configuration en entrée (RX : USART) ; bit 2 du port B (RB2) = 1 : configuration en entrée (TX : USART) ; bit 3 du port B (RB3) = 1 : configuration en entrée, par exemple ; bit 4 du port B (RB4) = 1 : configuration en entrée, par exemple ; bit 5 du port B (RB5) = 1 : configuration en entrée, par exemple ; bit 6 du port B (RB6) = 0 : configuration en sortie (broche CLK, capteur DS1620) ; bit 7 du port B (RB7) = 0 : configuration en sortie (broche RST, capteur DS1620) movlw D'129' movwf SPBRG ; (SPBRG) = D'129' movlw B'00100100' movwf TXSTA ; bit 7 (CSRC) = 0 (non utilisé : 0 par exemple) ; bit 6 (TX9) = 0 : 8 bits de transmission ; bit 5 (TXEN) = 1 : autorise la réception ; bit 4 (SYNC) = 0 : mode asynchrone ; bit 3 = 0 (non implémenté) ; bit 2 (BRGH) = 1 : mode asynchrone haute vitesse ; bit 1 (TRMT) = 0 (en lecture seule) ; bit 0 (TX9D) = 0 (non utilisé : 0 par exemple) bank0 movlw B'10010000' movwf RCSTA ; bit 7 (SPEN) = 1 : utilisation du port série ; bit 6 (RX9) = 0 : 8 bits de réception ; bit 5 (SREN) = 0 (non utilisé : 0 par exemple) ; bit 4 (CREN) = 1 : autorise la réception ; bit 3 (ADEN) = 0 (non utilisé : 0 par exemple) ; bit 2 (FERR) = 0 (en lecture seule) ; bit 1 (OERR) = 0 (en lecture seule) ; bit 0 (RX9D) = 0 (non utilisé : 0 par exemple) clrf PORTA ; mise à 0 des sorties du port A clrf PORTB ; mise à 0 des sorties du port B clrf nb_octet_recu clrf nb_octet_transmis bank1 bsf INTCON, GIE ; autorisation globale des interruptions bsf INTCON , PEIE ; autorisation des interruptions des périphériques bsf PIE1 , RCIE ; autorisation de l'interruption de réception de l'USART bcf PIE1 , TXIE ; interdiction de l'interruption d'émission de l'USART bank0 ; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ; Configuration du DS1620 ; Instruction Write Config ; Code instruction : 0x0C = 00001100 ; Données : 0x02 = 00000010 (CPU = 1, 1SHOT = 0) ; (RST = 0) ; CLK =1 (RB6 = 1) bsf PORTB , 6 ; RST =1 (RB7 = 1) bsf PORTB , 7 ; CLK = 0 (RB6 = 0) ; pause 200 ns bcf PORTB , 6 nop ; DQ = 0 (bit 0 du code instruction) (RB0 = 0) bcf PORTB , 0 ; CLK = 1 ; pause 200 ns bsf PORTB , 6 nop ; CLK = 0 ; pause 200 ns bcf PORTB , 6 nop ; DQ = 0 (bit 1 du code instruction) bcf PORTB , 0 ; CLK = 1 ; pause 200 ns bsf PORTB , 6 nop ; CLK = 0 ; pause 200 ns bcf PORTB , 6 nop ; DQ = 1 (bit 2 du code instruction) bsf PORTB , 0 ; CLK = 1 ; pause 200 ns bsf PORTB , 6 nop ; CLK = 0 ; pause 200 ns bcf PORTB , 6 nop ; DQ = 1 (bit 3 du code instruction) bsf PORTB , 0 ; CLK = 1 ; pause 200 ns bsf PORTB , 6 nop ; CLK = 0 ; pause 200 ns bcf PORTB , 6 nop ; DQ = 0 (bit 4 du code instruction) bcf PORTB , 0 ; CLK = 1 ; pause 200 ns bsf PORTB , 6 nop ; CLK = 0 ; pause 200 ns bcf PORTB , 6 nop ; DQ = 0 (bit 5 du code instruction) bcf PORTB , 0 ; CLK = 1 ; pause 200 ns bsf PORTB , 6 nop ; CLK = 0 ; pause 200 ns bcf PORTB , 6 nop ; DQ = 0 (bit 6 du code instruction) bcf PORTB , 0 ; CLK = 1 ; pause 200 ns bsf PORTB , 6 nop ; CLK = 0 ; pause 200 ns bcf PORTB , 6 nop ; DQ = 0 (bit 7 du code instruction) bcf PORTB , 0 ; CLK = 1 ; pause 200 ns bsf PORTB , 6 nop ; 8 bits de données (D7...D0) ; bit D0 bcf PORTB , 6 ; CLK = 0 nop ; pause 200 ns ; D0 = 0 bcf PORTB , 0 bsf PORTB , 6 ; CLK = 1 nop ; pause 200 ns ; bit D1 bcf PORTB , 6 ; CLK = 0 nop ; pause 200 ns ; D1 = 1 bsf PORTB , 0 bsf PORTB , 6 ; CLK = 1 nop ; pause 200 ns ; bit D2 bcf PORTB , 6 ; CLK = 0 nop ; pause 200 ns ; D2 = 0 bcf PORTB , 0 bsf PORTB , 6 ; CLK = 1 nop ; pause 200 ns ; bit D3 bcf PORTB , 6 ; CLK = 0 nop ; pause 200 ns ; D3 = 0 bcf PORTB , 0 bsf PORTB , 6 ; CLK = 1 nop ; pause 200 ns ; bit D4 bcf PORTB , 6 ; CLK = 0 nop ; pause 200 ns ; D4 = 0 bcf PORTB , 0 bsf PORTB , 6 ; CLK = 1 nop ; pause 200 ns ; bit D5 bcf PORTB , 6 ; CLK = 0 nop ; pause 200 ns ; D5 = 0 bcf PORTB , 0 bsf PORTB , 6 ; CLK = 1 nop ; pause 200 ns ; bit D6 bcf PORTB , 6 ; CLK = 0 nop ; pause 200 ns ; D6 = 0 bcf PORTB , 0 bsf PORTB , 6 ; CLK = 1 nop ; pause 200 ns ; bit D7 bcf PORTB , 6 ; CLK = 0 nop ; pause 200 ns ; D7 = 0 bcf PORTB , 0 bsf PORTB , 6 ; CLK = 1 nop ; pause 200 ns ; RST =0 bcf PORTB , 7 ; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ; pause de 13 ms (écriture dans l'EEPROM du DS1620 ; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx clrf TMR0 bcf INTCON , T0IF ; on efface le drapeau attente1 btfss INTCON , T0IF goto attente1 ; fin de l'instruction Write Config ; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ; Configuration du DS1620 ; Instruction Start Convert T ; Code instruction : 0xEE = 1110 1110 ; RST = 0 ; (CLK =1) (RB6 = 1) ; RST =1 (RB7 = 1) bsf PORTB , 7 ; CLK = 0 (RB6 = 0) ; pause 200 ns bcf PORTB , 6 nop ; DQ = 0 (bit 0 du code instruction) (RB0 = 0) bcf PORTB , 0 ; CLK = 1 ; pause 200 ns bsf PORTB , 6 nop ; CLK = 0 ; pause 200 ns bcf PORTB , 6 nop ; DQ = 1 (bit 1 du code instruction) bsf PORTB , 0 ; CLK = 1 ; pause 200 ns bsf PORTB , 6 nop ; CLK = 0 ; pause 200 ns bcf PORTB , 6 nop ; DQ = 1 (bit 2 du code instruction) bsf PORTB , 0 ; CLK = 1 ; pause 200 ns bsf PORTB , 6 nop ; CLK = 0 ; pause 200 ns bcf PORTB , 6 nop ; DQ = 1 (bit 3 du code instruction) bsf PORTB , 0 ; CLK = 1 ; pause 200 ns bsf PORTB , 6 nop ; CLK = 0 ; pause 200 ns bcf PORTB , 6 nop ; DQ = 0 (bit 4 du code instruction) bcf PORTB , 0 ; CLK = 1 ; pause 200 ns bsf PORTB , 6 nop ; CLK = 0 ; pause 200 ns bcf PORTB , 6 nop ; DQ = 1 (bit 5 du code instruction) bsf PORTB , 0 ; CLK = 1 ; pause 200 ns bsf PORTB , 6 nop ; CLK = 0 ; pause 200 ns bcf PORTB , 6 nop ; DQ = 1 (bit 6 du code instruction) bsf PORTB , 0 ; CLK = 1 ; pause 200 ns bsf PORTB , 6 nop ; CLK = 0 ; pause 200 ns bcf PORTB , 6 nop ; DQ = 1 (bit 7 du code instruction) bsf PORTB , 0 ; CLK = 1 ; pause 200 ns bsf PORTB , 6 nop ; RST =0 ; pause 200 ns bcf PORTB , 7 nop ; fin de l'instruction Start Convert T ; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx goto debut_programme ;xxxxxxxxxxxxxxxxxxxxx ; Programme principal ;xxxxxxxxxxxxxxxxxxxxx debut_programme goto debut_programme ; on attend une interruption (USART) END