Bonjour,
J'ai développé une bibliothèque très simple permettant de faire fonctionner une liaison série avec des ATMega.
Tout se passe bien avec des ATMega88, ATMega128, mais ca plante magnifiquement avec un ATMega32.
Enfin, quand je dis que ca plante, c'est pas tout à fait vrai : j'arrive bien à envoyer une suite de bits, mais plutôt que de l'envoyer à 19200, il l'envoie à 300, ce qui, vous en conviendrez, n'ai pas très satisfaisant.
J'ai donc regardé plus en détail la datasheet de l'ATMega32 : tout me paraît correct.
J'ai vérifié les fuses pour la fréquence d'horloge de mon bousin : 8MHz comme prévu.
Mais où se cache donc le problème ?
Voici le code d'initialisation de mon ATMega :
Je vous fais grâce des lignes de redéfinition des RXC0 en RXC et tout le bataclan.
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 void uart_init(void) { #if (CPU_ATMEGA168 == 1 || CPU_ATMEGA88 == 1) // Set baud rate UBRR0 = UBRR_VALUE; // Enable receiver RXEN and transmitter TXEN and RxCIE UCSR0A = (0<<RXC0)|(0<<TXC0)|(0<<UDRE0)|(0<<FE0)|(0<<DOR0)|(0<<UPE0)|(0<<U2X0)|(0<<MPCM0); UCSR0B = (1<<RXCIE0)|(0<<TXCIE0)|(0<<UDRIE0)|(1<<RXEN0)|(1<<TXEN0)|(0<<UCSZ02)|(0<<RXB80)|(0<<TXB80); UCSR0C = (0<<UMSEL01)|(0<<UMSEL00)|(0<<UPM01)|(0<<UPM00)|(0<<USBS0)|(1<<UCSZ01)|(1<<UCSZ00)|(0<<UCPOL0); #elif (CPU_ATMEGA128 == 1 || CPU_ATMEGA32 == 1) UBRR0H = 0; UBRR0L = UBRR_VALUE; // Enable receiver RXEN and transmitter TXEN and RxCIE UCSR0A = (0<<RXC0)|(0<<TXC0)|(0<<UDRE0)|(0<<FE0)|(0<<DOR0)|(0<<UPE0)|(0<<U2X0)|(0<<MPCM0); UCSR0B = (1<<RXCIE0)|(0<<TXCIE0)|(0<<UDRIE0)|(1<<RXEN0)|(1<<TXEN0)|(0<<UCSZ02)|(0<<RXB80)|(0<<TXB80); UCSR0C = (0<<UMSEL1)|(0<<UMSEL0)|(0<<UPM01)|(0<<UPM00)|(0<<USBS0)|(1<<UCSZ01)|(1<<UCSZ00)|(0<<UCPOL0); /*#elif (CPU_ATMEGA32 == 1) UBBRH = 0; UBBRL = UBBR_VALUE; // Enable receiver RXEN and transmitter TXEN and RxCIE UCSR0A = (0<<RXC0)|(0<<TXC0)|(0<<UDRE0)|(0<<FE0)|(0<<DOR0)|(0<<UPE0)|(0<<U2X0)|(0<<MPCM0); UCSR0B = (1<<RXCIE0)|(0<<TXCIE0)|(0<<UDRIE0)|(1<<RXEN0)|(1<<TXEN0)|(0<<UCSZ02)|(0<<RXB80)|(0<<TXB80); UCSR0C = (0<<UMSEL1)|(0<<UMSEL0)|(0<<UPM01)|(0<<UPM00)|(0<<USBS0)|(1<<UCSZ01)|(1<<UCSZ00)|(0<<UCPOL0); */#else # error Unsupported UART ! #endif }
Petite précision : je veux aller à 19200 bauds avec une fréquence d'horloge de 8MHz. D'après la datasheet, le UBRR devrait être à 25, soit 0x19, et c'est bien ce que j'ai...
Merci d'avance pour vos réponses encore une fois écalirantes, je le sais![]()
Partager