Bonjour,
J'ai un petit projet en cours, j'ai réalisé un programme qui tourne sous windows, ce programme envoie 1 octect par port serie.
Le but est de recuperer l'octet envoyé avec un PIC 16F877 et d'afficher cette valeur en binaire sur un port.
Mon logiciel PC marche correctement, la valeur est correctement envoyée. La programmation et la mise en oeuvre du PIC fonctionne egalement car j'ai testé avec un programme simple.
Le probleme c'est que je n'arrive pas a recevoir l'octet.
Voici mon code:
Voila, je pense que l'erreur vient des registres INTCON, PIE1, PIR1, etc... les interruptions quoi, je pense que j'ai du oublier de faire quelque chose.Code:LIST p=16F877A ; Définition de processeur #include <p16F877A.inc> ; fichier include __CONFIG _CP_OFF & _DEBUG_OFF & _WRT_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _PWRTE_OFF & _WDT_OFF & _HS_OSC ;***************************************************************************** ; MACRO * ;***************************************************************************** ; Changement de banques ; ---------------------- BANK0 macro ; passer en banque0 bcf STATUS,RP0 bcf STATUS,RP1 endm BANK1 macro ; passer en banque1 bsf STATUS,RP0 bcf STATUS,RP1 endm BANK2 macro ; passer en banque2 bcf STATUS,RP0 bsf STATUS,RP1 endm BANK3 macro ; passer en banque3 bsf STATUS,RP0 bsf STATUS,RP1 endm ;zone variables******************************************************************** CBLOCK 0x20 octet_recu:1 ; variable contenant la valeur des secondes ENDC ORG 0x0000 goto init ;***************************************************************************** ;***************************************************************************** ;***************************************************************************** ; PROGRAMME PRINCIPAL * ;***************************************************************************** ;***************************************************************************** ;***************************************************************************** ;***************************************************************************** ; INITIALISATIONS * ;***************************************************************************** init BANK1 ; on passe dans la banque n°1 movlw b'00000000' movwf TRISB ; on met RB7 en sortie movlw b'00000100' movwf TXSTA ; emission sur 8 bits, asynchrone, grande vitesse movlw 0x81 ; valeur calculée pour 9615 bauds movwf SPBRG ; dans baud rate generator movlw b'11000000' movwf INTCON ; autorisation des interruptions movlw b'00100000' movwf PIE1 ; autorisation d'interruptions lors de la reception BANK0 ; on passe dans la banque n°0 movlw b'10010000' ; mode USART en service, reception sur 8 bits, movwf RCSTA ; et reception continue en service ;***************************************************************************** ; debut * ;***************************************************************************** movlw b'00000000' movwf PORTB ; effacement du portB start btfss PIR1, RCIF ; test si un octet est recu goto start ; non, on retourne a start btfsc RCSTA,FERR ; oui, on test si on a une erreur de frame goto err_frame ; oui, on va traiter l'erreur a err_frame movf RCREG,w ; non, on lit l'octet reçu movwf octet_recu ; l'octet est placé dans sa variable octet_recu movf octet_recu,PORTB ;traitement goto start err_frame movf RCREG,w ; on lit l'octet reçu goto start RETURN END
Si quelqu'un a une idée et qu'il peut voler a mon secours, je lui en serai reconnaissant !
Merci a tous.
-----