Cours:Atmega328pSerial

De troyesGEII
Aller à : navigation, rechercher

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<<U2C0);
UBRR0 = 207
...

code :

...
UCSR0A &=~ (1<<U2C0);
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é

UPM01 UPM00 parité
0 0 sans
1 0 paire
1 1 impaire

Par défaut 1 stop

USBS0 bits de stop
0 1 stop
1 2 stops

Par défaut 8 bits

UCSZ02 UCSZ01 UCSZ00 bits de données
0 0 0 5 bits
0 0 1 6 bits
0 1 0 7 bits
0 1 1 8 bits
1 1 1 9 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;
     ...
  }
}