[ATMEGA32] Communication UART trop lente
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 :
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
| 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
} |
Je vous fais grâce des lignes de redéfinition des RXC0 en RXC et tout le bataclan.
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 :)
j'ai pas compris ton code
Serais tu m'expliquer ton code car je n'ai pas très bien compris sachant que j'utilise un atmega 128
Merci