TD2: Implémentation de UART

Défrichage

Important: astuces

Nous allons lire la datasheet de l'ATmega328P, ce document d'environ 300 pages décrit le fonctionnement du microcontrôleur ATmega328P. Voici quelques astuces pour vous aider à vous y retrouver:

Utilisez le sommaire: Le PDF contient un sommaire, vous pouvez cliquer sur les liens pour vous rendre directement à la section qui vous intéresse. Assurez-vous d'utiliser un lecteur PDF qui en dispose:

Attardez-vous sur la section "Register Description": À la fin de chaque partie, une section "Register Description" décrit les registres utilisés par le module. Cette partie nous intéresse particulièrement, car elle nous permet de connaître les registres à utiliser pour configurer le module.

Regardez les exemples: La documentation contient des exemples de code (y compris de C), qui peuvent vous aider à comprendre comment utiliser un module.

Questions

Aidez vous de la section USART0 (de la page 143 à la page 165) pour répondre aux questions ci-dessous:

  • Quels registres permettent de configurer le débit (baud rate) de l'UART?
  • Quelle valeur doit être placée dans ces registres afin de définir cette baud rate à 115200 bauds?
  • À quoi sert le bit U2X0 du registre UCSR0A?
  • Quelles broches peuvent être utilisées pour TX et RX ?
  • Est-il possible d'utiliser uniquement la partie transmitteur de l'UART? Si oui, comment? Si non, pourquoi?
  • Comment configurer le nombre de bits de stop?
  • Comment déclencher l'envoi d'un octet en utilisant l'UART?

Implémentation

Nous allons créer un firmware uart_basic qui contiendra une première implémentation de la communication UART.

Initialisation

Écrivez désormais le code C d'une fonction uart_init(unsigned long baudrate) qui initialise le module UART avec la configuration suivante:

  • 115200 bauds
  • 1 bit de stop
  • 8 octets par trame
  • pas de parité
  • mode U2X0 activé

Envoyer des messages

Écrivez désormais le code C d'une fonction uart_send_byte(uint8_t byte) qui envoie un octet sur l'UART.

Ensuite, écrivez le code de la fonction uart_send_string(char *str) qui envoie une chaîne de caractères
sur l'UART.

Rappel: En C, une chaîne de caractères est un tableau de caractères terminé par le caractère '\0'.

Testez votre code en envoyant des messages sur l'UART. Pour cela, vous pouvez utiliser le programme minicom:

$ minicom -b 115200 -o -D /dev/ttyACM0

Cette commande nous sera utile par la suite, n'hésitez pas à la mettre dans un script, ou dans une règle Makefile, comme make com.

Afficher un compteur

Affichez maintenant un compteur qui s'incrémente, par exemple:

Compteur: 1
Compteur: 2
Compteur: 3
...

Pour cela, vous pourrez utiliser la fonction sprintf afin de construire un buffer à donner à la fonction uart_send_string.

Recevoir des caractères

Implémentez désormais la fonction uart_receive_byte qui attend la réception d'un octet sur l'UART et le retourne.

Implémentez la fonction uart_receive_string qui attend la réception d'une chaîne de caractères sur l'UART et la retourne.

Modifiez le firmware uart_basic afin qu'il vous demande d'entrer du texte, puis vous le retourne:

$ minicom -b 115200 -o -D /dev/ttyACM0
Entrez du texte: Hello World!
Vous avez saisi: Hello World!

Correction