Bonjour
je programme avec mplab et en assembleur pour communiquer avec un pic 16f877a
la reception ce fait sans pb mais l emission j ai des soucis avec si qlq1 peu m aider la dessus
je recois le carcatére null
Merci
Code:list P=16F877A ; processeur utilisé #include<P16F877A.inc> __config _CP_OFF & _WDT_OFF & _PWRTE_ON & _HS_OSC & _LVP_OFF & _BOREN_ON ;bits de configuration : ;code protect OFF ;watchdog timer OFF ;power up timer ON (72 ms : cela permet d'initialiser l'afficheur LCD) ;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) REGISTRE_R :1 octet_tx:1 compt:1 compt1:1 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 int1 goto restauration ; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ; Traitement de l'interruption de reception de l'USART ; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx reception bank0 movf RCREG , W movwf REGISTRE_R ; les 8 bits de données sont transférés dans un registre d'usage général bcf STATUS , RP0 ; passage en banque 0 btfss RCSTA , OERR ; test d'une erreur d'overrun goto int1 ; traitement de l'erreur d'overrun 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 ,0 ; 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 movf TXREG,1 ; bank1 ;WtHere btfss TXSTA,TRMT ; (1) transmission is complete if hi ; goto WtHere ;bank0 bcf PIE1 , TXIE ; interdiction de l'interruption d'émission de l'USART goto restauration restauration swapf STATUS_TEMP,W ; restauration des registres STATUS puis W movwf STATUS swapf W_TEMP,f swapf W_TEMP,W retfie ;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ; Routine kika ; ;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx kika bank0 bsf PORTD,0 bcf PORTD,1 movwf compt1 clrw addlw 0x31 movwf octet_tx movf compt1,0 bank1 bSf PIE1 , TXIE ; AUTORISER de l'interruption d'émission de l'USART ; goto emission return kika1 bank0 bsf PORTD,1 bcf PORTD,0 movwf compt1 clrw addlw 0x32 movwf octet_tx movf compt1,0 bank1 bSf PIE1 , TXIE ; AUTORISER de l'interruption d'émission de l'USART return ;xxxxxxxxxxxxxxx ; Initialisation ;xxxxxxxxxxxxxxx initialisation movlw B'00000111' movwf CMCON ; inactivation des comparateurs analogiques bank1 movlw B'11110000' movwf TRISC movlw B'00000000' movwf TRISD movlw D'8' movwf SPBRG movlw B'00100000' 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 PORTC ; mise à 0 des sorties du port A clrf PORTD ; mise à 0 des sorties du port B 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 CLRF REGISTRE_R goto debut_programme ;xxxxxxxxxxxxxxxxxxxxx ; Programme principal ;xxxxxxxxxxxxxxxxxxxxx debut_programme ; c la partie reception ca marche tres bien ; movf REGISTRE_R,1 ; btfsc STATUS,Z ; goto debut_programme ; on attend une interruption (USART) ; movwf compt1 ; movf REGISTRE_R,0 ; sublw 0x61 ; btfsc STATUS,Z ; call kika ; movf REGISTRE_R,0; ; sublw 0x63 ; btfsc STATUS,Z ; call kika1 ; movf compt1,0 ;goto debut_programme ; END ; emission btfsc PORTC,5 goto debut_programme movwf compt1 clrw addlw 0x31 movwf octet_tx movf compt1,0 movwf compt1 bank1 bsf PIE1 , TXIE ; autorisé de l'interruption d'émission de l'USART bank0 clrw addlw 0x32 movwf octet_tx movf compt1,0 bank1 bsf PIE1 , TXIE ; autorisé l'interruption d'émission de l'USART bank0 goto debut_programme end
-----