; Générateur de signaux logiques (10 sorties) ; Commande via RS232 ; 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, juillet 2007 ; IUT Nancy-Brabois ; Version 1.01 ; 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 niveau des sorties 9 et 10 ; (000000 voie10 voie9) octet2 : 1 ; 2eme octet reçu : contient le niveau des sorties 1 à 8 ; (voie8 ... voie1) nb_octet_recu : 1 ; nombre d'octets reçus ; (valeur initiale : 0) octet_tx : 1 ; 8 bits de données à transmettre ; (octet de validation : j'ai choisi : 0x55) PORTA_comp : 1 ; niveaux du port A PORTB_comp : 1 ; niveaux du port B 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 goto overrun rec2 ; réception du 2ème octet movf octet , W movwf octet2 clrf nb_octet_recu ; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ; Mise à jour du niveau des sorties ; Remarque : les sorties ne sont pas mises à jour en même temps ; Sorties du port A, puis sorties du port B (2 cycles = 0,4 µs plus tard) clrf PORTA_comp clrf PORTB_comp ; voie 10 (RA3) btfsc octet1 , 1 bsf PORTA_comp , 3 btfss octet1 , 1 bcf PORTA_comp , 3 ; voie 9 (RA2) btfsc octet1 , 0 bsf PORTA_comp , 2 btfss octet1 , 0 bcf PORTA_comp , 2 ; voie 8 (RA1) btfsc octet2 , 7 bsf PORTA_comp , 1 btfss octet2 , 7 bcf PORTA_comp , 1 ; voie 7 (RA0) btfsc octet2 , 6 bsf PORTA_comp , 0 btfss octet2 , 6 bcf PORTA_comp , 0 ; voie 6 (RB7) btfsc octet2 , 5 bsf PORTB_comp , 7 btfss octet2 , 5 bcf PORTB_comp , 7 ; voie 5 (RB6) btfsc octet2 , 4 bsf PORTB_comp , 6 btfss octet2 , 4 bcf PORTB_comp , 6 ; voie 4 (RB5) btfsc octet2 , 3 bsf PORTB_comp , 5 btfss octet2 , 3 bcf PORTB_comp , 5 ; voie 3 (RB4) btfsc octet2 , 2 bsf PORTB_comp , 4 btfss octet2 , 2 bcf PORTB_comp , 4 ; voie 2 (RB3) btfsc octet2 , 1 bsf PORTB_comp , 3 btfss octet2 , 1 bcf PORTB_comp , 3 ; voie 1 (RB0) btfsc octet2 , 0 bsf PORTB_comp , 0 btfss octet2 , 0 bcf PORTB_comp , 0 movf PORTA_comp , W movwf PORTA ; mise à jour des sorties du port A movf PORTB_comp , W movwf PORTB ; mise à jour des sorties du port B ; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 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 movf octet_tx , W ; les 8 bits de données à transmettre sont placés dans 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 goto int2 restauration swapf STATUS_TEMP,W ; restauration des registres STATUS puis W movwf STATUS swapf W_TEMP,f swapf W_TEMP,W retfie ;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'11110000' movwf TRISA ; bit 0 du port A (RA0) = 0 : configuration en sortie (voie 7) ; bit 1 du port A (RA1) = 0 : configuration en sortie (voie 8) ; bit 2 du port A (RA2) = 0 : configuration en sortie (voie 9) ; bit 3 du port A (RA3) = 0 : configuration en sortie (voie 10) ; bits 4 à 7 du port A (RA4 à RA7) = 1 : configuration en entrée, par exemple movlw B'00000110' movwf TRISB ; bit 0 du port B (RB0) = 0 : configuration en sortie (voie 1) ; 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) = 0 : configuration en sortie (voie 2) ; bit 4 du port B (RB4) = 0 : configuration en sortie (voie 3) ; bit 5 du port B (RB5) = 0 : configuration en sortie (voie 4) ; bit 6 du port B (RB6) = 0 : configuration en sortie (voie 5) ; bit 7 du port B (RB7) = 0 : configuration en sortie (voie 6) 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 movlw 0x55 movwf octet_tx 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 goto debut_programme ;xxxxxxxxxxxxxxxxxxxxx ; Programme principal ;xxxxxxxxxxxxxxxxxxxxx debut_programme goto debut_programme ; on attend une interruption (USART) END