PIC problème lecture uart
Répondre à la discussion
Affichage des résultats 1 à 11 sur 11

PIC problème lecture uart



  1. #1
    mmarc2007

    PIC problème lecture uart


    ------

    Bonjour,

    J'ai un ptit problème de lecture sur l'UART d'un pic 16f877.

    J'ai une fonction qui me permet de lire l'entrée de l'uart.

    Dans l'ensemble ça fonctionne plutôt bien sauf lorsque le flux d'informations reçues sur l'UART est trop important.

    Tout d'abord voila les fonctions de réception :

    Code:
    //reception d'un caractere
    unsigned char getch() {
    	/* retrieve one byte */
    	while(!RCIF)	/* on attend des données */
    		continue;
    	return RCREG;	
    }
    
    
    //lecture de l'usart jusqu'a depassement de la taille indiquée ou retour chariot
    void string_in(char * s, int taille){
    	int i=0;
    	while(i<taille){
    	s[i]=getch();
    	if(s[i]=='\r' || s[i]=='\n') {
    		s[i]='\0';
    		break;
    		}
    	i++;
    	}
    }
    Donc j'utilise du C et le compilateur hi-tech.

    Mon pic est interconnecté au PC et un programme dans ce genre tourne :

    Code:
    #define sizeS 70
    char s[sizeS];
    
    void main(void){
    
        while(1){
    	string_in(s,sizeS);
    	Clignote_LED();
        }
    }
    En gros, après chaque lecture sur l'UART on fait clignoter une led mais si j'envoie une forte quantité de données (plusieurs lignes de moins 70 caractères) le PIC se fige.

    Je pense que le problème vient de la fonction string_in(s,sizeS) mais je ne sais pas où...
    Connaissez-vous des contraintes de limite de réception?
    Une interruption de dépassement de mémoire peut être?

    merci de votre aide.

    bye.

    -----

  2. #2
    invite219b5772

    Re : PIC problème lecture uart

    cet simple, si tu recoit plus de 2 caracter sans qui soit lue (RCREG) et bien c GG (Good Game)

    ta 2 choix
    1- mettre la reception en interruption
    2- continue comme sa mais check OERR et si il est eguale a 1 bin ta eu de l'overflow, si tu veu continuer a recevoir, met CREN=0 ; CREN=

    " It is possible for two bytes of data to be received and
    transferred to the RCREG FIFO and a third byte to
    begin shifting to the RSR register. On the detection of
    the STOP bit of the third byte, if the RCREG register is
    still full, the overrun error bit OERR (RCSTA<1>) will be
    set. The word in the RSR will be lost. The RCREG reg-
    ister can be read twice to retrieve the two bytes in the
    FIFO. Overrun bit OERR has to be cleared in software.
    This is done by resetting the receive logic (CREN is
    cleared and then set). If bit OERR is set, transfers from
    the RSR register to the RCREG register are inhibited,
    and no further data will be received. It is therefore,
    essential to clear error bit OERR if it is set. " (page 103/128

  3. #3
    invite219b5772

    Re : PIC problème lecture uart

    aussi je suppose quon ton init est correct car on la voie pas ^^

  4. #4
    mmarc2007

    Re : PIC problème lecture uart

    salut,

    merci pour les infos!

    tout d'abord voila ma fonction d'initialisation :

    Code:
    void init_comms(void){
    	SPEN = 1;	// Enable serial port
    	BRGH = 1; 	//asynchron
    	SYNC=0;		// Disable Synchronous/Enable Asynchronous
    	TXEN = 1; 	//transmit enable
    	CREN = 1; 	//continuous receive
    	TX9  = 0;      /* 8- or 9-bit transmission */
    	RX9 = 0; 	//8bit reception
    	TXIE = 0;      /* disable tx interrupts */
    	RCIE = 0;      /* disable rx interrupts */
    	TRISB|=TX_BIT|RX_BIT;	// These need to be 1 for USART to work
    	SPBRG = 25; //9600 baud at 4mhz
    }
    Je ne sais pas si je dois choisir la lecture sur interruption. Dans son montage final, mon pic va recevoir un flux d'informations et lorsqu'il aura reçu une information qui l'intéresse il devra la traiter. Le problème c'est que le flux d'information ne va pas s'arrêter! (d'où l'overrun dont tu m'as parlé).

    Peux être que je devrais couper la réception des données lorsque j'ai trouvé l'info qui m'intéresse (CREN=0) puis remettre CREN à 1 lorsque je désire recevoir à nouveau des données???

    Si non avant chaque lecture, je réinitialise le bit OERR comme ceci :

    Code:
    //lecture de l'usart jusqu'a depassement de la taille indiquée ou retour chariot
    void string_in(char * s, int taille){
    
            if(OERR==1) {
    
             CREN=0;
             CREN=1;
            }
    
    	int i=0;
    	while(i<taille){
    	s[i]=getch();
    	if(s[i]=='\r' || s[i]=='\n') {
    		s[i]='\0';
    		break;
    		}
    	i++;
    	}
    }
    Qu'en penses-tu?

    merci

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

    Re : PIC problème lecture uart

    Bonjour,
    J'ai peut etre eu le meme problème un jour :

    un composant qui envoie sans cesse des infos et le PIC qui veut le lire, puis les traiter, puis continuer la lecture.

    Je m'étais apperçu que si je laissais la connexion ouverte, alors la liaison bugguait...

    A l'époque, ma solution était de :
    • ouvrir la connexion
    • réceptionner les variables qui me plaisait.
    • fermer la connexion
    • traiter les informations

    et ainsi de suite...

    Si tu veux t'inspirer j'avais mis du code documenté sur la laison série sur mon site :
    http://www.hoffmanncorporation.com/body/electronique.php

    Bonne journée
    Hoffmann

  7. #6
    invite219b5772

    Re : PIC problème lecture uart

    ok et avec l'OERR clearer est-ce que sa gele tjr ?
    Si tu veu mon code en interruption fait moi signe

    -Nik-

  8. #7
    hoffmann

    Re : PIC problème lecture uart

    Citation Envoyé par nhenri Voir le message
    ok et avec l'OERR clearer est-ce que sa gele tjr ?
    Si tu veu mon code en interruption fait moi signe

    -Nik-
    Bonjour,

    si ton code fonctionne bien je serais en effet intéressé !
    Si tu veux je peux même le publier sur le site, tout en te citant ! (mais il faudrait le documenter un minimum).

    Cordialement

  9. #8
    invite219b5772

    Re : PIC problème lecture uart

    o je suis nouveau et je suis au travail donc je ne veux pas apsser trop de temp a chercher , tu peu mexpliquer comment on fait hoffmann

    merci

    -Nik-

  10. #9
    mmarc2007

    Re : PIC problème lecture uart

    Re,

    je confirme qu'en rajoutant ça :

    Code:
    if(OERR==1) {
    
             CREN=0;
             CREN=1;
            }
    avant la lecture des données, ça fonctionne très bien

    J'ai aussi trouvé ça : http://fabrice.sincere.pagesperso-or...8/usart628.htm

    Comme il dit si bien : Attention : il ne faut pas aller moins vite que la musique !

    PB résolu!

  11. #10
    invite219b5772

    Re : PIC problème lecture uart

    ouias ! sauf qua chaque fois que tu as un OERR ce que ta perdu un caractere ... problème resolu &??

  12. #11
    mmarc2007

    Re : PIC problème lecture uart

    je vais perdre des caracteres sur la liaison uart c'est un fait mais j'utilise un protocole de communication à travers l'uart qui m'assure que les données que je lis sont completes. Si ce n'est pas le cas, je ne les prends pas en compte.

    Les données sont composées d'un entete et d'un checksum

    voilou

Discussions similaires

  1. Problème de transmission par UART sur PIC 18F
    Par netdefense dans le forum Électronique
    Réponses: 2
    Dernier message: 18/03/2010, 08h34
  2. [PIC C18] problème avec la lecture d'une entrée numérique
    Par invitec89d22d7 dans le forum Électronique
    Réponses: 10
    Dernier message: 06/03/2010, 06h50
  3. Pic 18f97j60 uart
    Par invite6ba1806f dans le forum Électronique
    Réponses: 4
    Dernier message: 24/02/2010, 01h21
  4. PIC et I2C vs UART
    Par invite220a379c dans le forum Électronique
    Réponses: 3
    Dernier message: 15/07/2009, 11h36
  5. Pic/uart
    Par ABN84 dans le forum Électronique
    Réponses: 5
    Dernier message: 06/03/2008, 09h46
Découvrez nos comparatifs produits sur l'informatique et les technologies.