Problème UART RX!
Répondre à la discussion
Affichage des résultats 1 à 5 sur 5

Problème UART RX!



  1. #1
    Canaillou2k5

    Problème UART RX!


    ------

    Bonjour, je n'arrive pas à faire fonctionner l'UART de mon micro contrôleur Atmel en réception.

    En pièce jointe vous pouvez voir le schéma de câblage. Je reçois bien ce que j'envoi d'un port com à l'autre, mais le micro contrôleur ne veut rien savoir.

    Voici mon programme en C:

    Code:
    #include <mega8535.h>
    #include <delay.h>
    
    void init()
    { 
    
    SREG=   0b10000000; // clear global interrupt
    
    //UCSRB=  0b00001001;	//tx mode
    
    UCSRB=  0b10010011;   //rx mode
    
    UBRRL=  0b01100111;  	//speed 19200bps
    
    DDRD.0=0;
    DDRD.2=1;
    DDRD.3=1;
    
    } 
    
    interrupt[12] void capture(void) // interruption du fin de réception
    {
    PORTD.3=!PORTD.3;
    } 
    
    void main()
    { 
    
    init();
    
     while(1)
    {
    PORTD.2=!PORTD.2;
    delay_ms(10);
    }
    
    }
    Voici comment je procède: j'ai le RX du micro sur la voie 1 de mon oscillo et le PORTD.3 sur la voie 2.

    Lorsque j'écrit dans l'hyperterminal je visualise la trame mais la sortie PORTD.3 ne change pas d'état, donc rien ne se passe au niveau du micro quand il reçoit une trame sur le RX.

    Merci pour votre aide.

    -----
    Images attachées Images attachées  

  2. #2
    Canaillou2k5

    Re : Problème UART RX!

    Le problème pouvant venir du programme, j'ai essayer celui-ci en compilant avec WINAVR:

    J'ai bien adapter la vitesse à 9600 bauds car je tourne à 8Mhz.

    Code:
    /*
    
    A simple program to demonstrate the use of USART of AVR micro
    
    *************************************************************
    
    See: www.eXtremeElectronics.co.in for more info
    
    Author : Avinash Gupta
    E-Mail: me@avinashgupta.com
    Date : 29 Dec 2008
    
    Hardware:
       ATmega8 @ 16MHz
    
       Suitable level converter on RX/TX line
       Connected to PC via RS232
       PC Software :  Hyper terminal @ 19200 baud
                   No Parity,1 Stop Bit,
                   Flow Control = NONE
    
    */
    
    #include <avr/io.h>
    #include <inttypes.h>
    
    //This function is used to initialize the USART
    //at a given UBRR value
    void USARTInit(uint16_t ubrr_value)
    {
    
       //Set Baud rate
    
       UBRRL = ubrr_value;
       UBRRH = (ubrr_value>>8);
    
       /*Set Frame Format
    
    
       >> Asynchronous mode
       >> No Parity
       >> 1 StopBit
    
       >> char size 8
    
       */
    
       UCSRC=(1<<URSEL)|(3<<UCSZ0);
    
    
       //Enable The receiver and transmitter
    
       UCSRB=(1<<RXEN)|(1<<TXEN);
    
    
    }
    
    
    //This function is used to read the available data
    //from USART. This function will wait untill data is
    //available.
    char USARTReadChar()
    {
       //Wait untill a data is available
    
       while(!(UCSRA & (1<<RXC)))
       {
          //Do nothing
       }
    
       //Now USART has got data from host
       //and is available is buffer
    
       return UDR;
    }
    
    
    //This fuction writes the given "data" to
    //the USART which then transmit it via TX line
    void USARTWriteChar(char data)
    {
       //Wait untill the transmitter is ready
    
       while(!(UCSRA & (1<<UDRE)))
       {
          //Do nothing
       }
    
       //Now write the data to USART buffer
    
       UDR=data;
    }
    
    void main()
    {
       //This DEMO program will demonstrate the use of simple
    
       //function for using the USART for data communication
    
       //Varriable Declaration
       char data;
    
       /*First Initialize the USART with baud rate = 19200bps
       
       for Baud rate = 19200bps
    
       UBRR value = 51
    
       */
    
       USARTInit(51);    //UBRR = 51
    
       //Loop forever
    
       while(1)
       {
          //Read data
          data=USARTReadChar();
    
          /* Now send the same data but but surround it in
          square bracket. For example if user sent 'a' our
          system will echo back '[a]'.
    
          */
    
          USARTWriteChar('[');
          USARTWriteChar(data);
          USARTWriteChar(']');
    
       }
    }

    Je sait vraiment pas pourquoi ca fonctionne pas, ça vient surement du câblage...

  3. #3
    ftorama

    Re : Problème UART RX!

    La version Gcc fonctionne, elle?

    Dans ton premier programme, il te manque des initialisations pour le port série....Je n'ai pas vérifié bit par bit, mais voilà déjà ce que le wizard de Codevision donne pour une config TX, RX à 19200 bauds sans interruptions:

    Code:
    UCSRA=0x00;
    UCSRB=0x18;
    UCSRC=0x86;
    UBRRH=0x00;
    UBRRL=0x0C;
    Dans ton programme, tu ne touches pas à UCSRC alors que l'exemple Gcc l'appelle.....A toi de vérifier son rôle....

    De plus, juste avant ta boucle infinie, tu ne ré-actives pas les interruptions, tu ne risques pas d'y entrer. Avant le while(1), ajoute:
    Code:
    #asm("sei")

  4. #4
    Canaillou2k5

    Re : Problème UART RX!

    Le programme d'exemple fonctionne avec un ATtiny2313 mais pas avec un mega8535, je pense que le problème vient du micro.

    En effet mon programme sous AVR Code Vision ne fonctionne toujours pas.
    J'ai un peut du mal à comprendre la syntaxe sous WIN AVR...

    Par exmeple: UCSRB=(1<<RXEN)|(1<<TXEN); je suppose que cette ligne les met les bits RXEN et TXEN à 1.
    Mais j'ai du mal à comprendre ça par exemple : while(!(UCSRA & (1<<UDRE))); je suppose que c'est tant que le bit UDRE est égal à 1, mais je comprend c'est écrit de cette manière, moi j'ai l'habitude de while(UCSRB.5 == 1)

    Merci pour l'aide.

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

    Re : Problème UART RX!

    Citation Envoyé par Canaillou2k5 Voir le message
    Le programme d'exemple fonctionne avec un ATtiny2313 mais pas avec un mega8535, je pense que le problème vient du micro.
    Entre deux AVR, tu as parfois des petites différences au niveau des registres de configuration.

    En effet mon programme sous AVR Code Vision ne fonctionne toujours pas.
    Tu as fait les modifs que je t'ai indiqué?
    Tu as essayé avec le wizard?

    J'ai un peut du mal à comprendre la syntaxe sous WIN AVR...

    Par exmeple: UCSRB=(1<<RXEN)|(1<<TXEN); je suppose que cette ligne les met les bits RXEN et TXEN à 1.
    Mais j'ai du mal à comprendre ça par exemple : while(!(UCSRA & (1<<UDRE))); je suppose que c'est tant que le bit UDRE est égal à 1, mais je comprend c'est écrit de cette manière, moi j'ai l'habitude de while(UCSRB.5 == 1)
    Avec le wizard, je crois que c'est une des raisons qui feront que j'achèterais Codevision un jour

Discussions similaires

  1. Problème réception UART (C8051F310)
    Par invite0282e56d dans le forum Électronique
    Réponses: 0
    Dernier message: 23/02/2010, 10h59
  2. Problème UART PIC24FJ
    Par kronanberg dans le forum Électronique
    Réponses: 1
    Dernier message: 18/05/2009, 15h04
  3. Problème UART AVR
    Par inviteee2a87e5 dans le forum Électronique
    Réponses: 2
    Dernier message: 07/01/2009, 09h27
  4. Problème interuption UART PIC16F877
    Par invite55fe29e6 dans le forum Électronique
    Réponses: 4
    Dernier message: 28/09/2008, 18h49
  5. probleme uart pic24
    Par djwolf dans le forum Électronique
    Réponses: 3
    Dernier message: 02/06/2008, 23h07
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...