IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Embarqué Discussion :

Transfert de donnees entre l´USART0 et l´USART1


Sujet :

Embarqué

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    110
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2012
    Messages : 110
    Points : 27
    Points
    27
    Par défaut Transfert de donnees entre l´USART0 et l´USART1
    Bonjour,

    je dispose d´un microntrôleur Atmega644p possedant deux USARTs. A savoir USART0 et USART1. USART0 recoit des bytes du pc et les enregistrent dans son buffer UDR0. Ensuite les bytes se trouvant dans le buffer UDR0 de l´USART0 doivent être transferes dans le buffer UDR1 de l´USART1. Une fois les donnees dans UDR1, les bytes seront envoyes a une autre unite.

    pour l´instant, je m´occupe uniquement du transfert des bytes de UDR0 vers UDR1 en me servant de la fonction d´interruption de reception ISR(USART0_RX_vect).

    Voici mon code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    /*-- function receive USART0 --*/
    unsigned char USART0_Receive (void)
    {
        while(!(UCSR0A & (1<<RXC0)) ); // Wait for data to be received 
         return UDR0; // Get and return received data from buffer 
    }
    
    /*-- function transmit USART1 --*/  
    void USART1_Transmit (unsigned char data1)
    {
      while ( !(UCSR1A & (1<<UDRE1)) ); // Wait for empty transmit buffer  
       UDR1 = data1; // Put data into buffer, sends the data  
    }
    
    ISR(USART0_RX_vect)
    {
      char data;
      data = UDR0; // lire le byte
      UDR1 = data; // ecrire le byte
    }
    
    int main (void)
    
    { 
      
      USART_Init(UBRR_VAL) ;  // Initialisation de USART0 und USART1 
      sei();
      char c ;
      
    
      while(1)
      {
       c = USART1_Receive();
    
       if( (UCSR1A & (1<<RXC1))  &&
            (UCSR1A & (1<<UDRE1)) )  // l´USART1 peut envoyer un caractere 
         {
           USART1_Transmit(c);
         }      
      }
    
    }
    Le code marche certe, mais j´ai une perte de donnees dans la fonction ISR(USART0_RX_vect) lorsque j´ecris:
    les donnees recues par le buffer UDR0 ne sont pas tous transferes dans le Buffer UDR1. J´ai une perte de donnees.

    Comment pourrais-je corriger cela ? Manque t-il une autre condition dans ma fonction ISR(USART0_RX_vect) ? Aidez moi s´il vous plaît.

    Merci

  2. #2
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    110
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2012
    Messages : 110
    Points : 27
    Points
    27
    Par défaut
    Bonsoir,

    est-ce possible d´eviter la perte de donnees avec la modification suivante:

    ISR(USART0_RX_vect)
    {
    char data ;
    data = UDR0;

    if(!(UCSR1A & (1<<UDRE1))) // ready to write
    {
    UDR1 = data;
    }
    }
    Qu´en dites-vous? Merci de bien vouloir m´aider.

  3. #3
    Membre expérimenté

    Homme Profil pro
    Responsable des études
    Inscrit en
    Mars 2009
    Messages
    553
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2009
    Messages : 553
    Points : 1 672
    Points
    1 672
    Par défaut
    Hello,

    Ton deuxième poste va dans la bonne direction, mais je crois que c'est encore insuffisant: si l'UART1 n'est pas dispo pour écrire, que faire de "data" ?

    Il faut partir du principe que les deux UARTS ne fonctionnent pas au même rythme. Les données venant de l'UART0 doivent être stockées dans un buffer, et l'UART1 vient prendre dans ce buffer les octets à émettre.

    Pour t'aider à faire ça, l'UART1 a peux peut-être une interruption qui se déclenche lorsqu'il est prêt à émettre ?

  4. #4
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    Dans ton premier post, tu parles d'un vecteur d'interruption mais tu fais même une attente active pour la réception ?

    Le problème soulevé par nnovic est important : les baudrates des 2 liaisons sont-elles les mêmes ? Si non et que UART0 est plus rapide que UART1, il y a tous un tas de problématiques de gestion de buffer et d'émission et réception asynchrones. Si oui ou que UART0 est plus lente que UART1, pourquoi ne pas simplement faire une interruption dés qu'UART0 reçoit une donnée. C'est ce que tu sembles faire dans le 2e message si j'ai bien compris.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UDR1 = data; J´ai une perte de donnees
    C'est-à-dire ? Tu perds des octets de temps en temps ou tu perds systématiquement certains bits de tous les octets ?

  5. #5
    Membre expérimenté
    Inscrit en
    Août 2010
    Messages
    726
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 726
    Points : 1 645
    Points
    1 645
    Par défaut
    Il faut utiliser un buffer, mais je t'ai déjà donné du code le faisant. Ca écrivait dans UDR0 mais il suffisait de remplacer par UDR1.
    Il faut utiliser l'interruption qui signale la disponibilité de UDR1 (UDRE1).
    Sinon, si le débit est différent, il faut du contrôle de flux à un moment donné. Le contrôle de flux c'est le récepteur qui interdit à l'émetteur de lui envoyer des données en attendant de vider son buffer.

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    110
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2012
    Messages : 110
    Points : 27
    Points
    27
    Par défaut
    Merci pour les explications.
    j´ai saisis !!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 9
    Dernier message: 19/12/2012, 16h35
  2. Transfert de données entre objets d'une figure
    Par tenderstoune dans le forum Interfaces Graphiques
    Réponses: 2
    Dernier message: 20/03/2007, 12h49
  3. [MySQL] Problème transfert donnees entre 2 formulaires php.
    Par pgil dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 17/01/2006, 15h00
  4. Réponses: 12
    Dernier message: 04/10/2004, 19h18
  5. [Designer] Problème de transfert de données entre modul
    Par BILLYPATOU dans le forum Designer
    Réponses: 11
    Dernier message: 09/03/2004, 18h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo