; Programmateur d'eeprom 93xx 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, juin 2007 ; IUT Nancy-Brabois ; version 1.03 ; 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_OFF & _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 OFF ;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 octet2 : 1 ; 2eme octet reçu octet3 : 1 ; 3eme et dernier octet reçu nb_octet_recu : 1 ; nombre d'octets reçus ; (valeur initiale : 0) opcode : 1 ; contient les 4 premiers bits après le start bit ; (000010xx) -> READ ; (00000011) -> EWEN ; (000011xx) -> ERASE ; (00000010) -> ERAL ; (000001xx) -> WRITE ; (00000001) -> WRAL ; (00000000) -> EWDS opcode_tx :1 ; octet transmis en fin d'instruction ; READ (non utilisé) ; (00000001) -> EWEN ; (00000010) -> ERASE ; (00000011) -> ERAL ; (00000100) -> WRITE ; (00000101) -> WRAL ; (00000110) -> EWDS type_instruction : 1 ; (00000001) EWEN ou EWDS ; (00000010) ERASE, ERAL, WRITE ou WRAL ; (00000100) READ octet_tx : 1 ; 8 bits de données à transmettre (instruction READ) ENDC ;xxxxxxxxxxxxxxxxxxxx ; Démarrage sur reset ;xxxxxxxxxxxxxxxxxxxx org 0x0000 goto initialisation ; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ; Routine d'interruption ; 2 sources d'interruption : ; - réception (UART) ; - émission (UART) ; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 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 ; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 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 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 bsf PORTA, 0 ; CS = 1 ; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ; détection du type d'instruction clrf opcode ; détection du premier bit non nul (Start bit) btfsc octet1, 5 ; les 2 premiers bits sont nécessairement à 0 ; donc inutile de les tester goto int3 btfsc octet1, 4 goto int4 btfsc octet1, 3 goto int5 btfsc octet1, 2 goto int6 btfsc octet1, 1 goto int7 btfsc octet1, 0 goto int8 btfsc octet2, 7 goto int9 btfsc octet2, 6 goto int10 btfsc octet2, 5 goto int11 btfsc octet2, 4 goto int12 btfsc octet2, 3 goto int13 btfsc octet2, 2 goto int14 goto int15 ;xxxxxxxxxxxxxxxx int3 btfsc octet1 , 4 bsf opcode , 3 btfss octet1 , 4 bcf opcode , 3 btfsc octet1 , 3 bsf opcode , 2 btfss octet1 , 3 bcf opcode , 2 btfsc octet1 , 2 bsf opcode , 1 btfss octet1 , 2 bcf opcode , 1 btfsc octet1 , 1 bsf opcode , 0 btfss octet1 , 1 bcf opcode , 0 call instruc goto bit3 int4 btfsc octet1 , 3 bsf opcode , 3 btfss octet1 , 3 bcf opcode , 3 btfsc octet1 , 2 bsf opcode , 2 btfss octet1 , 2 bcf opcode , 2 btfsc octet1 , 1 bsf opcode , 1 btfss octet1 , 1 bcf opcode , 1 btfsc octet1 , 0 bsf opcode , 0 btfss octet1 , 0 bcf opcode , 0 call instruc goto bit4 int5 btfsc octet1 , 2 bsf opcode , 3 btfss octet1 , 2 bcf opcode , 3 btfsc octet1 , 1 bsf opcode , 2 btfss octet1 , 1 bcf opcode , 2 btfsc octet1 , 0 bsf opcode , 1 btfss octet1 , 0 bcf opcode , 1 btfsc octet2 , 7 bsf opcode , 0 btfss octet2 , 7 bcf opcode , 0 call instruc goto bit5 int6 btfsc octet1 , 1 bsf opcode , 3 btfss octet1 , 1 bcf opcode , 3 btfsc octet1 , 0 bsf opcode , 2 btfss octet1 , 0 bcf opcode , 2 btfsc octet2 , 7 bsf opcode , 1 btfss octet2 , 7 bcf opcode , 1 btfsc octet2 , 6 bsf opcode , 0 btfss octet2 , 6 bcf opcode , 0 call instruc goto bit6 int7 btfsc octet1 , 0 bsf opcode , 3 btfss octet1 , 0 bcf opcode , 3 btfsc octet2 , 7 bsf opcode , 2 btfss octet2 , 7 bcf opcode , 2 btfsc octet2 , 6 bsf opcode , 1 btfss octet2 , 6 bcf opcode , 1 btfsc octet2 , 5 bsf opcode , 0 btfss octet2 , 5 bcf opcode , 0 call instruc goto bit7 int8 btfsc octet2 , 7 bsf opcode , 3 btfss octet2 , 7 bcf opcode , 3 btfsc octet2 , 6 bsf opcode , 2 btfss octet2 , 6 bcf opcode , 2 btfsc octet2 , 5 bsf opcode , 1 btfss octet2 , 5 bcf opcode , 1 btfsc octet2 , 4 bsf opcode , 0 btfss octet2 , 4 bcf opcode , 0 call instruc goto bit8 int9 btfsc octet2 , 6 bsf opcode , 3 btfss octet2 , 6 bcf opcode , 3 btfsc octet2 , 5 bsf opcode , 2 btfss octet2 , 5 bcf opcode , 2 btfsc octet2 , 4 bsf opcode , 1 btfss octet2 , 4 bcf opcode , 1 btfsc octet2 , 3 bsf opcode , 0 btfss octet2 , 3 bcf opcode , 0 call instruc goto bit9 int10 btfsc octet2 , 5 bsf opcode , 3 btfss octet2 , 5 bcf opcode , 3 btfsc octet2 , 4 bsf opcode , 2 btfss octet2 , 4 bcf opcode , 2 btfsc octet2 , 3 bsf opcode , 1 btfss octet2 , 3 bcf opcode , 1 btfsc octet2 , 2 bsf opcode , 0 btfss octet2 , 2 bcf opcode , 0 call instruc goto bit10 int11 btfsc octet2 , 4 bsf opcode , 3 btfss octet2 , 4 bcf opcode , 3 btfsc octet2 , 3 bsf opcode , 2 btfss octet2 , 3 bcf opcode , 2 btfsc octet2 , 2 bsf opcode , 1 btfss octet2 , 2 bcf opcode , 1 btfsc octet2 , 1 bsf opcode , 0 btfss octet2 , 1 bcf opcode , 0 call instruc goto bit11 int12 btfsc octet2 , 3 bsf opcode , 3 btfss octet2 , 3 bcf opcode , 3 btfsc octet2 , 2 bsf opcode , 2 btfss octet2 , 2 bcf opcode , 2 btfsc octet2 , 1 bsf opcode , 1 btfss octet2 , 1 bcf opcode , 1 btfsc octet2 , 0 bsf opcode , 0 btfss octet2 , 0 bcf opcode , 0 call instruc goto bit12 int13 btfsc octet2 , 2 bsf opcode , 3 btfss octet2 , 2 bcf opcode , 3 btfsc octet2 , 1 bsf opcode , 2 btfss octet2 , 1 bcf opcode , 2 btfsc octet2 , 0 bsf opcode , 1 btfss octet2 , 0 bcf opcode , 1 btfsc octet3 , 7 bsf opcode , 0 btfss octet3 , 7 bcf opcode , 0 call instruc goto bit13 int14 btfsc octet2 , 1 bsf opcode , 3 btfss octet2 , 1 bcf opcode , 3 btfsc octet2 , 0 bsf opcode , 2 btfss octet2 , 0 bcf opcode , 2 btfsc octet3 , 7 bsf opcode , 1 btfss octet3 , 7 bcf opcode , 1 btfsc octet3 , 6 bsf opcode , 0 btfss octet3 , 6 bcf opcode , 0 call instruc goto bit14 int15 btfsc octet2 , 0 bsf opcode , 3 btfss octet2 , 0 bcf opcode , 3 btfsc octet3 , 7 bsf opcode , 2 btfss octet3 , 7 bcf opcode , 2 btfsc octet3 , 6 bsf opcode , 1 btfss octet3 , 6 bcf opcode , 1 btfsc octet3 , 5 bsf opcode , 0 btfss octet3 , 5 bcf opcode , 0 call instruc goto bit15 ; xxxxxxxxxxxxxxxxxxxxxxxxxxx ; Communication avec l'eeprom ; xxxxxxxxxxxxxxxxxxxxxxxxxxx bit3 ; bit 5 du premier octet bcf PORTA, 1 ; CLK = 0 btfsc octet1 , 5 bsf PORTA , 2 ; DI = 1 btfss octet1 , 5 bcf PORTA , 2 ; DI = 0 bsf PORTA, 1 ; CLK = 1 nop ; une petite pause de 200 ns (car l'eeprom est moins rapide ...) bit4 ; bit 4 du premier octet bcf PORTA, 1 ; CLK = 0 btfsc octet1 , 4 bsf PORTA , 2 ; DI = 1 btfss octet1 , 4 bcf PORTA , 2 ; DI = 0 bsf PORTA, 1 ; CLK = 1 nop ; une petite pause de 200 ns bit5 ; bit 3 du premier octet bcf PORTA, 1 ; CLK = 0 btfsc octet1 , 3 bsf PORTA , 2 ; DI = 1 btfss octet1 , 3 bcf PORTA , 2 ; DI = 0 bsf PORTA, 1 ; CLK = 1 nop ; une petite pause de 200 ns bit6 ; bit 2 du premier octet bcf PORTA, 1 ; CLK = 0 btfsc octet1 , 2 bsf PORTA , 2 ; DI = 1 btfss octet1 , 2 bcf PORTA , 2 ; DI = 0 bsf PORTA, 1 ; CLK = 1 nop ; une petite pause de 200 ns bit7 ; bit 1 du premier octet bcf PORTA, 1 ; CLK = 0 btfsc octet1 , 1 bsf PORTA , 2 ; DI = 1 btfss octet1 , 1 bcf PORTA , 2 ; DI = 0 bsf PORTA, 1 ; CLK = 1 nop ; une petite pause de 200 ns bit8 ; bit 0 du premier octet bcf PORTA, 1 ; CLK = 0 btfsc octet1 , 0 bsf PORTA , 2 ; DI = 1 btfss octet1 , 0 bcf PORTA , 2 ; DI = 0 bsf PORTA, 1 ; CLK = 1 nop ; une petite pause de 200 ns bit9 ; bit 7 du 2ème octet bcf PORTA, 1 ; CLK = 0 btfsc octet2 , 7 bsf PORTA , 2 ; DI = 1 btfss octet2 , 7 bcf PORTA , 2 ; DI = 0 bsf PORTA, 1 ; CLK = 1 nop ; une petite pause de 200 ns bit10 ; bit 6 du 2ème octet bcf PORTA, 1 ; CLK = 0 btfsc octet2 , 6 bsf PORTA , 2 ; DI = 1 btfss octet2 , 6 bcf PORTA , 2 ; DI = 0 bsf PORTA, 1 ; CLK = 1 nop ; une petite pause de 200 ns bit11 ; bit 5 du 2ème octet bcf PORTA, 1 ; CLK = 0 btfsc octet2 , 5 bsf PORTA , 2 ; DI = 1 btfss octet2 , 5 bcf PORTA , 2 ; DI = 0 bsf PORTA, 1 ; CLK = 1 nop ; une petite pause de 200 ns bit12 ; bit 4 du 2ème octet bcf PORTA, 1 ; CLK = 0 btfsc octet2 , 4 bsf PORTA , 2 ; DI = 1 btfss octet2 , 4 bcf PORTA , 2 ; DI = 0 bsf PORTA, 1 ; CLK = 1 nop ; une petite pause de 200 ns bit13 ; bit 3 du 2ème octet bcf PORTA, 1 ; CLK = 0 btfsc octet2 , 3 bsf PORTA , 2 ; DI = 1 btfss octet2 , 3 bcf PORTA , 2 ; DI = 0 bsf PORTA, 1 ; CLK = 1 nop ; une petite pause de 200 ns bit14 ; bit 2 du 2ème octet bcf PORTA, 1 ; CLK = 0 btfsc octet2 , 2 bsf PORTA , 2 ; DI = 1 btfss octet2 , 2 bcf PORTA , 2 ; DI = 0 bsf PORTA, 1 ; CLK = 1 nop ; une petite pause de 200 ns bit15 ; bit 1 du 2ème octet bcf PORTA, 1 ; CLK = 0 btfsc octet2 , 1 bsf PORTA , 2 ; DI = 1 btfss octet2 , 1 bcf PORTA , 2 ; DI = 0 bsf PORTA, 1 ; CLK = 1 nop ; une petite pause de 200 ns bit16 ; bit 0 du 2ème octet bcf PORTA, 1 ; CLK = 0 btfsc octet2 , 0 bsf PORTA , 2 ; DI = 1 btfss octet2 , 0 bcf PORTA , 2 ; DI = 0 bsf PORTA, 1 ; CLK = 1 nop ; une petite pause de 200 ns bit17 ; bit 7 du 3ème octet bcf PORTA, 1 ; CLK = 0 btfsc octet3 , 7 bsf PORTA , 2 ; DI = 1 btfss octet3 , 7 bcf PORTA , 2 ; DI = 0 bsf PORTA, 1 ; CLK = 1 nop ; une petite pause de 200 ns bit18 ; bit 6 du 3ème octet bcf PORTA, 1 ; CLK = 0 btfsc octet3 , 6 bsf PORTA , 2 ; DI = 1 btfss octet3 , 6 bcf PORTA , 2 ; DI = 0 bsf PORTA, 1 ; CLK = 1 nop ; une petite pause de 200 ns bit19 ; bit 5 du 3ème octet bcf PORTA, 1 ; CLK = 0 btfsc octet3 , 5 bsf PORTA , 2 ; DI = 1 btfss octet3 , 5 bcf PORTA , 2 ; DI = 0 bsf PORTA, 1 ; CLK = 1 nop ; une petite pause de 200 ns bit20 ; bit 4 du 3ème octet bcf PORTA, 1 ; CLK = 0 btfsc octet3 , 4 bsf PORTA , 2 ; DI = 1 btfss octet3 , 4 bcf PORTA , 2 ; DI = 0 bsf PORTA, 1 ; CLK = 1 nop ; une petite pause de 200 ns bit21 ; bit 3 du 3ème octet bcf PORTA, 1 ; CLK = 0 btfsc octet3 , 3 bsf PORTA , 2 ; DI = 1 btfss octet3 , 3 bcf PORTA , 2 ; DI = 0 bsf PORTA, 1 ; CLK = 1 nop ; une petite pause de 200 ns bit22 ; bit 2 du 3ème octet bcf PORTA, 1 ; CLK = 0 btfsc octet3 , 2 bsf PORTA , 2 ; DI = 1 btfss octet3 , 2 bcf PORTA , 2 ; DI = 0 bsf PORTA, 1 ; CLK = 1 nop ; une petite pause de 200 ns bit23 ; bit 1 du 3ème octet bcf PORTA, 1 ; CLK = 0 btfsc octet3 , 1 bsf PORTA , 2 ; DI = 1 btfss octet3 , 1 bcf PORTA , 2 ; DI = 0 bsf PORTA, 1 ; CLK = 1 nop ; une petite pause de 200 ns bit24 ; bit 0 du 3ème octet bcf PORTA, 1 ; CLK = 0 btfsc octet3 , 0 bsf PORTA , 2 ; DI = 1 btfss octet3 , 0 bcf PORTA , 2 ; DI = 0 bsf PORTA , 1 ; CLK = 1 ;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ; instructions ERASE, ERAL, WRITE ou WRAL ? btfss type_instruction , 1 goto cas1 ; non bcf PORTA , 2 ; DI = 0 bcf PORTA , 1 ; CLK = 0 bcf PORTA , 0 ; CS = 0 nop ; pause 200 ns nop ; pause 200 ns bsf PORTA , 0 ; CS = 1 nop ; on attend que DO passe à 1 (quelques ms) wait btfss PORTA, 3 goto wait bcf PORTA , 0 ; CS = 0 bank1 bsf PIE1 , TXIE ; autorisation de l'interruption d'émission de l'USART bank0 goto overrun ;xxxxxxxxxxxxxxxxx ; instruction READ ? cas1 btfss type_instruction , 2 goto cas2 ; non ; lecture des 8 bits de données clrf octet_tx bcf PORTA , 2 ; DI = 0 bcf PORTA , 1 ; CLK = 0 nop ; dummy bit bsf PORTA , 1 ; CLK = 1 nop bcf PORTA, 1 ; CLK = 0 btfsc PORTA , 3 ; lecture DO bsf octet_tx , 7 ; D7 = 1 bsf PORTA, 1 ; CLK = 1 nop ; une petite pause de 200 ns bcf PORTA, 1 ; CLK = 0 btfsc PORTA , 3 bsf octet_tx , 6 ; D6 = 1 bsf PORTA, 1 ; CLK = 1 nop ; une petite pause de 200 ns bcf PORTA, 1 ; CLK = 0 btfsc PORTA , 3 bsf octet_tx , 5 ; D5 = 1 bsf PORTA, 1 ; CLK = 1 nop ; une petite pause de 200 ns bcf PORTA, 1 ; CLK = 0 btfsc PORTA , 3 bsf octet_tx , 4 ; D4 = 1 bsf PORTA, 1 ; CLK = 1 nop ; une petite pause de 200 ns bcf PORTA, 1 ; CLK = 0 btfsc PORTA , 3 bsf octet_tx , 3 ; D3 = 1 bsf PORTA, 1 ; CLK = 1 nop bcf PORTA, 1 ; CLK = 0 btfsc PORTA , 3 bsf octet_tx , 2 ; D2 = 1 bsf PORTA, 1 ; CLK = 1 nop bcf PORTA, 1 ; CLK = 0 btfsc PORTA , 3 bsf octet_tx , 1 ; D1 = 1 bsf PORTA, 1 ; CLK = 1 nop bcf PORTA, 1 ; CLK = 0 btfsc PORTA , 3 bsf octet_tx , 0 ; D0 = 1 bcf PORTA, 0 ; CS = 0 bank1 bsf PIE1 , TXIE ; autorisation de l'interruption d'émission de l'USART bank0 goto overrun ; xxxxxxxxxxxxxxxxxxxxxxxx ; instructions EWEN ou EWDS cas2 bcf PORTA , 2 ; DI = 0 bcf PORTA, 1 ; CLK = 0 bcf PORTA, 0 ; CS = 0 bank1 bsf PIE1 , TXIE ; autorisation de l'interruption d'émission de l'USART bank0 goto overrun ;xxxxxxxxxxxxxxxxxxxxxxxxxxxx overrun ; test d'une erreur d'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 btfss type_instruction , 2 ; teste si instruction READ goto em0 movf octet_tx , W ; les 8 bits de données à transmettre sont placés dans W goto em1 em0 movf opcode_tx , W ; les 8 bits de données à transmettre sont placés dans W em1 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'11111000' movwf TRISA ; bit 0 du port A (RA0) = 0 : configuration en sortie (broche CS de l'eeprom) ; bit 1 du port A (RA1) = 0 : configuration en sortie (broche CLK de l'eeprom) ; bit 2 du port A (RA2) = 0 : configuration en sortie (broche DI de l'eeprom) ; bit 3 du port A (RA3) = 1 : configuration en entrée (broche DO de l'eeprom) ; bits 4 à 7 du port A (RA4 à RA7) = 1 : configuration en entrée, par exemple movlw B'11111111' movwf TRISB ; bit 0 du port B (RB0) = 1 : configuration en entrée, par exemple ; 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) = 1 : configuration en entrée, par exemple ; bit 7 du port B (RB7) = 1 : configuration en entrée, par exemple 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 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 ;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ; Sous-Programme "instruc" ; A partir de (opcode) ; on construit (type_instruction) et (opcode_tx) ;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx instruc ; teste si instruction EWEN opcode =(00000011) movlw B'00000011' subwf opcode , W btfss STATUS , Z goto ewds movlw B'00000001' movwf opcode_tx movlw B'00000001' movwf type_instruction return ; teste si instruction EWDS opcode = (00000000) ewds movlw B'00000000' subwf opcode , W btfss STATUS , Z goto eral movlw B'00000110' movwf opcode_tx movlw B'00000001' movwf type_instruction return ; teste si instruction ERAL opcode = (00000010) eral movlw B'00000010' subwf opcode , W btfss STATUS , Z goto wral movlw B'00000011' movwf opcode_tx movlw B'00000010' movwf type_instruction return ; teste si instruction WRAL opcode = (00000001) wral movlw B'00000001' subwf opcode , W btfss STATUS , Z goto erase movlw B'00000101' movwf opcode_tx movlw B'00000010' movwf type_instruction return ; teste si instruction ERASE opcode = (000011xx) erase movf opcode , W andlw B'00001100' ; masque sublw B'00001100' btfss STATUS , Z goto write movlw B'00000010' movwf opcode_tx movlw B'00000010' movwf type_instruction return ; teste si instruction WRITE opcode = (0000001xx) write movf opcode , W andlw B'00000100' ; masque sublw B'00000100' btfss STATUS , Z goto read movlw B'00000100' movwf opcode_tx movlw B'00000010' movwf type_instruction return read movlw B'00000100' movwf type_instruction return ;xxxxxxxxxxxxxxxxxxxxx ; Programme principal ;xxxxxxxxxxxxxxxxxxxxx debut_programme goto debut_programme ; on attend une interruption (USART) END