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