Cours:Atmega328pSerial
Liaison série
Débit
Le registre UBRR0 et le bit U2X0 du registre UCSR0A permettent de configurer la vitesse de la transmission de la façon suivante :
- si U2X0 = 1 alors UBRR0 = Fcpu/(8*débit)-1 ou debit = Fcpu/(8*UBRR0+1)
- si U2X0 = 0 alors UBRR0 = Fcpu/(16*débit)-1 ou debit = Fcpu/(16*UBRR0+1)
Exemple, on souhaite un débit de 9600 bauds (ou bits/s) avec fcpu=16MHz
si U2X0 = 1 | si U2X0 = 0 |
UBBR0 = 207,3 => UBRR0=207 | UBBR0 = 103,2 => UBRR0=103 |
debitReel=9640 | debitReel=9687 |
code : ...
UCSR0A |= (1<<U2X0);
UBRR0 = 207
...
|
code : ...
UCSR0A &=~ (1<<U2X0);
UBRR0 = 103
...
|
Format des données
Il convient de choisir :
La parité | nbre de bits de stop | nbre de bits pour la donnée | ||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
sans / paire(even) / impaire(odd) | 1 ou 2 bits de stop | 5,6,7,8 ou 9 bits | ||||||||||||||||||||||||||||||||||||||||||
bits UPM01 et UPM00 dans registre UCSR0C | bit USBS0 dans registre UCSR0C | UCSZ02(UCSR0B), UCSZ01 UZSC00(UCSR0C) | ||||||||||||||||||||||||||||||||||||||||||
Par défaut : sans parité
|
Par défaut 1 stop
|
Par défaut 8 bits
|
Exemple : 6 bits de données, paire, 1 stop
...
UCSR0C|=(1<<UPM01);
//les bits UCSZ01 et UCSZ00 sont à 1 par défaut !
UCSR0C&=~(1<<UCSZ01);
//1 stop par défaut (bit USBS0 à 0)
...
Recevoir des données
Autoriser la réception | donnée à lire ? | recevoir la donnée |
---|---|---|
bit RXEN0 dans UCSR0B | bit RXC0 dans UCSRA | registre UDR0 |
mettre à 1 pour autoriser | RXC0 passe à 1 lorsqu'une donnée est arrivée | lire la donnée |
Exemple :
...
int main()
{
char c;
...
// autoriser la réception
UCSR0B |= (1<<RXEN0);
...
while(1)
{
// attendre une donnée
loop_until_bit_is_set(UCSR0A, RXC0);
// récupérer la donnée
c = UDR0;
if (c=='W') ...
...
}
}
Envoyer des données
Autoriser l'émission | prêt à émettre ? | envoyer la donnée |
---|---|---|
bit TXEN0 dans UCSR0B | bit UDRE0 dans UCSRA | registre UDR0 |
mettre à 1 pour autoriser | UDRE0 passe à 1 lorsqu'on peut émettre | écrire la donnée |
Exemple :
...
int main()
{
char c;
...
// autoriser la transmission
UCSR0B |= (1<<TXEN0);
...
while(1)
{
....
c = 'F';
// attendre de pouvoir envoyer
loop_until_bit_is_set(UCSR0A, UDRE0);
// envoyer la donnée
UDR0 = c;
...
}
}