; Programmateur d'eeprom 93xx (en 3 fils) via RS232 ; Utilisation de l'USART du 16F88 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.01 ; microcontrôleur PIC 16F88 ; langage : assembleur ; développé avec Microchip MPLAB IDE Errorlevel-302 ; Supprime le message "Ensure that bank bits are correct" List p=16F88 ; processeur utilisé #include ;Program Configuration Register 1 __CONFIG _CONFIG1, _CP_OFF & _CCP1_RB0 & _DEBUG_OFF & _WRT_PROTECT_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _MCLR_ON & _PWRTE_ON & _WDT_OFF & _HS_OSC ;bits de configuration : ; Code protection OFF ; CCP1 function on RB0 ; In-Circuit Debugger OFF ; FLASH Program Memory Write protection OFF ; Data EE Memory Code Protection OFF ; Low Voltage Programming OFF ; Brown-out Reset OFF ; RA5/MCLR pin function is MCLR ; Power-up Timer ON ; Watchdog Timer OFF ; HS oscillator (quartz 20 MHz) ;Program Configuration Register 2 __CONFIG _CONFIG2, _IESO_OFF & _FCMEN_OFF ;bits de configuration : ;Internal External Switch Over mode OFF ;Fail-Safe Clock Monitor OFF ;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 RA2input macro ; configuration de la broche RA2 en entrée ; (lecture de la sortie DO de l'eeprom) bsf STATUS,RP0 ; passage en banque 1 bsf TRISA , 2 ; configuration de la broche RA2 en entrée bcf STATUS,RP0 ; passage en banque 0 endm RA2output macro ; configuration de la broche RA2 en sortie ; (écriture sur l'entrée DI de l'eeprom) bsf STATUS,RP0 ; passage en banque 1 bcf TRISA , 2 ; configuration de la broche RA2 en sortie bcf STATUS,RP0 ; passage en banque 0 endm ;xxxxxxxxxxxxxxxxxxxxxxxxxx ; Déclaration des variables ;xxxxxxxxxxxxxxxxxxxxxxxxxx CBLOCK 0x070 ; début de la zone des registres d'usage général du 16F88 ; (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 RA2input bsf PORTA , 0 ; CS = 1 nop ; on attend que DO passe à 1 (quelques ms) wait btfss PORTA, 2 ; lecture DO goto wait bcf PORTA , 0 ; CS = 0 RA2output 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 RA2input bcf PORTA, 1 ; CLK = 0 btfsc PORTA , 2 ; 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 , 2 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 , 2 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 , 2 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 , 2 bsf octet_tx , 3 ; D3 = 1 bsf PORTA, 1 ; CLK = 1 nop bcf PORTA, 1 ; CLK = 0 btfsc PORTA , 2 bsf octet_tx , 2 ; D2 = 1 bsf PORTA, 1 ; CLK = 1 nop bcf PORTA, 1 ; CLK = 0 btfsc PORTA , 2 bsf octet_tx , 1 ; D1 = 1 bsf PORTA, 1 ; CLK = 1 nop bcf PORTA, 1 ; CLK = 0 btfsc PORTA , 2 bsf octet_tx , 0 ; D0 = 1 bcf PORTA, 0 ; CS = 0 RA2output 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 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) ; bits 3 à 7 du port A (RA3 à 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, par exemple ; bit 2 du port B (RB2) = 1 : configuration en entrée (RX : 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 (TX : USART) ; 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 B'11111000' movwf ANSEL ; les broches RA0/AN0 , RA1/AN1 et RA2/AN2 sont configurées ; comme entrée/sortie de type numérique 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 (ADDEN) = 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