|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
|
Invité régulier
![]() arthur Étudiant Inscription : mars 2012 Messages : 110 ![]() |
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 :
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 |
||
|
|
00
|
|
|
#2 | |
|
Invité régulier
![]() arthur Étudiant Inscription : mars 2012 Messages : 110 ![]() |
Bonsoir,
est-ce possible d´eviter la perte de donnees avec la modification suivante: Citation:
|
|
|
|
00
|
|
|
#3 |
|
Membre éprouvé
![]() ![]() Développeur en systèmes embarqués Inscription : mars 2009 Messages : 222 ![]() |
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 ? |
|
00
|
|
|
#4 |
![]() ![]() Ingénieur systèmes embarqués Inscription : juin 2009 Messages : 1 821 ![]() |
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 :
UDR1 = data; J´ai une perte de donnees
__________________
Si Code::Blocks vous dit undefined reference to 'socket@12', cela signifie que vous avez un problème d'édition des liens. Allez dans Projects / Build Options / Linker Settings / Add et renseigner ici les .a qui vont bien. Exemple pour les sockets : C:\Program Files\CodeBlocks\MinGW\lib\libws2_32.a Pour les adeptes du langage SMS, allez ici et ramenez la traduction française ^^ Pour vos problèmes d'embarqué, utilisez le forum dédié ! |
|
00
|
|
|
#5 |
|
Membre Expert
![]() Inscription : août 2010 Messages : 533 ![]() |
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. |
|
|
00
|
|
|
#6 |
|
Invité régulier
![]() arthur Étudiant Inscription : mars 2012 Messages : 110 ![]() |
Merci pour les explications.
j´ai saisis !! |
|
|
00
|
Copyright © 2000-2013 - www.developpez.com