[PIC 16F877] Communication série asynchrone
Répondre à la discussion
Affichage des résultats 1 à 5 sur 5

[PIC 16F877] Communication série asynchrone



  1. #1
    Elbuey76

    [PIC 16F877] Communication série asynchrone


    ------

    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:

    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
    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.

    Si quelqu'un a une idée et qu'il peut voler a mon secours, je lui en serai reconnaissant !

    Merci a tous.

    -----
    Dernière modification par Elbuey76 ; 09/03/2009 à 21h27.

  2. #2
    Elbuey76

    Re : [PIC 16F877] Communication série asynchrone

    Dans la datasheet j'ai lu qu'il fallait mettre les broches TX et RX en entrée, c'est chose faite mais ca ne marche toujours pas, j'ai l'impression que le programme reste bloqué dans la boucle:

    Code:
    start
       
        btfss PIR1, RCIF        ; test si un octet est recu
        goto  start             ; non, on retourne a start
    Donc que l'octet recu ne doit pas bien etre stocké dans RCREG, surement que le USART est mal configuré, quelqu'un a une idée ?

    Merci.

  3. #3
    invite74b5b8f7

    Re : [PIC 16F877] Communication série asynchrone

    Salut,

    Oú est ta routine d´interruption?

  4. #4
    Elbuey76

    Re : [PIC 16F877] Communication série asynchrone

    Il n'y en a pas, en faite je scrute RCIF et j'attend qu'il passe a 1. J'ai avancé un peu dans le probleme, quand je debug, au niveau de l'instruction "btfss PIR1, RCIF", le programme effectue un test du bit RCIE du registre PIE1 au lieu du bit RCIF du registre PIR1. Mais ce fameux bit RCIE, je l'ai mis a 1 avant pour valider les interruptions de RCIF, donc le test est toujours positif et je rentre dans ma boucle comme si je venais de recevoir une donné serie alors que non.

    Quelqu'un peut m'éclairer ?

  5. A voir en vidéo sur Futura
  6. #5
    DavidDB

    Re : [PIC 16F877] Communication série asynchrone

    Salut,

    movf octet_recu,PORTB ;traitement
    Tu as testé cette ligne en mode simulation???

    Sur 16F il faut d'abord placer "octet_recu" dans W et ensuite placer W sur le portB :
    Code:
    movf octet_recu, W
    movwf PORTB
    David.

Discussions similaires

  1. communication pic 16f877+RS232
    Par invite817b2e6f dans le forum Électronique
    Réponses: 9
    Dernier message: 17/09/2013, 10h06
  2. Communication PIC <-> PC port série
    Par Toufinet dans le forum Électronique
    Réponses: 7
    Dernier message: 27/05/2010, 15h13
  3. aide pour PIC 16F877 vers PC via port serie (transfert de données)
    Par invite1c4b6700 dans le forum Électronique
    Réponses: 8
    Dernier message: 08/05/2009, 01h47
  4. communication rs232 avec pic 16f877 pour la commande de relais
    Par invite513767d8 dans le forum Électronique
    Réponses: 0
    Dernier message: 19/07/2008, 08h54
  5. Communication serie Pic<->Pc
    Par MicroPuce dans le forum Électronique
    Réponses: 14
    Dernier message: 11/06/2004, 18h06
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...