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.
Aidez vous de la section USART0 (de la page 143 à la page 165) pour répondre aux questions ci-dessous:
U2X0
du registre UCSR0A
?TX
et RX
?Nous allons créer un firmware uart_basic
qui contiendra une première implémentation de la communication UART.
Écrivez désormais le code C d'une fonction uart_init(unsigned long baudrate)
qui initialise le module UART
avec la configuration suivante:
115200
baudsU2X0
activéÉ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
.
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
.
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!