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:
Le code marche certe, mais j´ai une perte de donnees dans la fonction ISR(USART0_RX_vect) lorsque j´ecris:
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); } } }
les donnees recues par le buffer UDR0 ne sont pas tous transferes dans le Buffer UDR1. J´ai une perte de donnees.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 UDR1 = data;
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
Partager