pietro10
Junior Member level 1
usart
hello
a person could look my code for me correcting my mistake
Part-mail works
the code must be operated in the mode USART receiving PIC16F88, 9600 / s, 8 data bits, no parity bit, 1 Stop bit No hyperterminal software flow control
diode + resistor is connected to portRA1 and lights if the capital letter B and A is pressed to turn it off
hello
a person could look my code for me correcting my mistake
Part-mail works
the code must be operated in the mode USART receiving PIC16F88, 9600 / s, 8 data bits, no parity bit, 1 Stop bit No hyperterminal software flow control
diode + resistor is connected to portRA1 and lights if the capital letter B and A is pressed to turn it off
Code:
; Utilisation de l'USART du 16F88 avec interruption
; 9600 bauds/s 8 bits de données Pas de bit de parité
; 1 bit de STOP Pas de contrôle de flux
; 2010
; version 1.0
; microcontrôleur PIC 16F88
; développé avec Microchip MPLAB IDE
ERRORLEVEL -302 ;remove message about using proper bank ERRORLEVEL -302;
List p=16F88 ; processeur utilisé
#include <p16F88.inc>
__CONFIG _CONFIG1, _CP_OFF & _CCP1_RB3 & _DEBUG_OFF & _WRT_PROTECT_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _MCLR_ON & _PWRTE_ON & _WDT_ON & _HS_OSC
__CONFIG _CONFIG2, _IESO_OFF & _FCMEN_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
;xxxxxxxxxxxxxxxxxxxxxxxxx
; déclaration de variables
;xxxxxxxxxxxxxxxxxxxxxxxxx
CBLOCK H'070' ; début de la zone des registres d'usage général du 16F88
STATUS_TEMP : 1 ; sauvegarde du registre STATUS (routine d'interruption)
W_TEMP : 1 ; sauvegarde du registre W (routine d'interruption)
donnee : 1 ; 8 bits de données
pointerDonnee: 1
ENDC
;xxxxxxxxxxxxxxxxxxxx
; démarrage sur reset
;xxxxxxxxxxxxxxxxxxxx
org 0x0000
goto initialisation
; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
; Routine d'interruption
; 1 source d'interruption : réception (USART)
; 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 suite
bank0
btfsc PIR1, RCIF
goto reception
suite
goto restauration
reception
bank0
movlw pointerDonnee
movwf FSR
movf RCREG , W ; le flag RCIF est remis à 0 par une lecture du registre RCREG
movwf INDF ; les 8 bits de données sont transféres dans un registre d'usage général
; xxxxxxxxxxxxxxxxxxxxxxxxxxx
; test d'une erreur d'overrun
;xxxxxxxxxxxxxxxxxxxxxxxxxxxx
btfss RCSTA , OERR
goto restauration; traitement de l'erreur d'overrun
bcf RCSTA , OERR ; on efface le bit OERR
bsf RCSTA , CREN ; on relance la réception
goto restauration
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 0x70 ; B'111 0000' on efface la memoire
movwf FSR
init
clrf INDF
incf FSR,f
btfss FSR,3 ; B'111 1111'
goto init
bank1
movlw B'11111101'
movwf TRISA
; bit 1 du port A (RA1) = 0 : configuration en sortie (LED )
movlw B'00100100'
movwf TRISB
; bit 5 du port B = 1 : configuration en entrée (TX : USART)
; bit 2 du port B = 1 : configuration en entrée (RX : USART)
movlw B'01100000';horloge 4MHZ quartz
movwf OSCCON
movlw B'00000111'; RBPU b7 : 0= Résistance rappel +5V en service
movwf OPTION_REG ; INTEDG b6 : 1= Interrupt sur front montant de RB0
; 0= Interrupt sur front descendant de RB0
; TOCS b5 : 1= source clock = transition sur RA4
; 0= horloge interne
; TOSE b4 : 1= Sélection front descendant RA4(si B5=1)
; 0= Sélection front montant RA4
; PSA b3 : 1= Assignation prédiviseur sur Watchdog
; 0= Assignation prédiviseur sur Tmr0
; PS2/PS0 b2/b0 valeur du prédiviseur
; 000 = 1/1 (watchdog) ou 1/2 (tmr0)
; 001 = 1/2 1/4
; 010 = 1/4 1/8
; 011 = 1/8 1/16
; 100 = 1/16 1/32
; 101 = 1/32 1/64
; 110 = 1/64 1/128
; 111 = 1/128 1/256
movlw B'00000111';configurer le mode 111 pour utiliser RA0 RA1 RA2 RA3 en I/Ovation des comparateurs analogiques
movwf CMCON
movlw B'01000000'; GIE b7 : masque autorisation générale interrupt
movwf INTCON ; ne pas mettre ce bit à 1 ici
; sera mis en temps utile
; PEIE b6 : masque autorisation générale périphériques
; TMR0IE b5 : masque interruption tmr0
; INTE b4 : masque interuption RB0/Int
; RBIE b3 : masque interruption RB4/RB7
; TMR0IF b2 : flag tmr0
; INTF b1 : flag RB0/Int
; RBIF b0 : flag interruption RB4/RB7
movlw B'00100000'; RESERVED b7 : réservé, laisser à 0
movwf PIE1 ; ADIE b6 : masque interrupt convertisseur A/D
; RCIE b5 : masque interrupt réception USART
; TXIE b4 : masque interrupt transmission USART
; SSPIE b3 : masque interrupt port série synchrone
; CCP1IE b2 : masque interrupt CCP1
; TMR2IE b1 : masque interrupt TMR2 = PR2
; TMR1IE b0 : masque interrupt débordement tmr1
movlw D'25'
movwf SPBRG ; (SPBRG) = D'25'
movlw B'00000100'
movwf TXSTA
; bit 7 (CSRC) = 0 (non utilisé : 0 par exemple)
; bit 6 (TX9) = 0 (non utilisé : 0 par exemple)
; bit 5 (TXEN) = 0 (non utilisé : 0 par exemple)
; bit 4 (SYNC) = 0 : mode asynchrone
; bit 3 = 0 (non implémenté)
; bit 2 (BRGH) = 1 : mode asynchrone haute vitesse
; bit 1 (TRMT) = 0 (non utilisé : 0 par exemple)
; 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 donnee
clrf pointerDonnee
movlw donnee
movwf pointerDonnee
bank1
bsf PIE1 , RCIE ; autorisation de l'interruption de réception de l'USART
bsf INTCON , PEIE ; autorisation des interruptions des périphériques
bsf INTCON, GIE ; autorisation globale des interruptions
bank0
goto debut_programme
;xxxxxxxxxxxxxxxxxxxxx
; programme principal
;xxxxxxxxxxxxxxxxxxxxx
debut_programme
movlw B'01000001' ; (code ASCII de A= B'0100 0001')
subwf donnee,W
btfsc STATUS,Z
goto afficheA ; donnee = 'A'
movlw B'01000010' ; (code ASCII de B= B'0100 0010')
subwf donnee,W
btfsc STATUS,Z
goto afficheB ;
goto debut_programme
afficheA
bcf PORTA,1;RA1 est aux 0VDC si on appuis sur la touche A
goto debut_programme
afficheB
bsf PORTA,1;RA1 est aux 0VDC si on appuis sur la touche B
goto debut_programme ; on attend l'interruption de réception (USART)
END