Cours:TPS 2103 tp uart : Différence entre versions
| Ligne 75 : | Ligne 75 : | ||
'''Remarque''' : Vous utiliserez gtkterm pour observer les données envoyées par votre carte. Il faudra quitter gtkterm pour pouvoir reprogrammer le µcontrôleur. | '''Remarque''' : Vous utiliserez gtkterm pour observer les données envoyées par votre carte. Il faudra quitter gtkterm pour pouvoir reprogrammer le µcontrôleur. | ||
| + | |||
| + | |||
| + | ==={{Vert|cosmétique}}=== | ||
| + | |||
| + | Simplifions l'écriture de notre programme en utilisant des fonctions. | ||
| + | |||
| + | <source lang=c> | ||
| + | void uart_putchar(char c) | ||
| + | { | ||
| + | loop_until_bit_is_set(UCSR0A, UDRE0); /* Wait until data register empty. */ | ||
| + | UDR0 = c; | ||
| + | } | ||
| + | |||
| + | void uart_init() | ||
| + | { | ||
| + | // a completer | ||
| + | } | ||
| + | |||
| + | int main() | ||
| + | { | ||
| + | uart_init(); | ||
| + | while(1) | ||
| + | { | ||
| + | uart_putchar('@'); | ||
| + | } | ||
| + | } | ||
| + | </source> | ||
| + | |||
| + | {{Question|Implémentez la fonction uart_init(), et vérifier le fonctionnement.}} | ||
| + | |||
| + | =={{Bleu|connectons un bouton}}== | ||
| + | |||
| + | Ajoutons un bouton sur notre carte que l'on reliera de façon judicieusement sur la broche associée soit à INT0, soit à INT1. [[Cours:Atmega328p#Interruption_externe|Vous pouvez consulter cet extrait de datasheet]] qui vous permettra de configurer correctement les différents registres. | ||
| + | |||
| + | {{Question|Votre programme doit envoyer un caractère différent aux événement de bouton suivant :}} | ||
| + | *à l'appui, envoi du caractère A (pour allumer) | ||
| + | *au relâchement, envoi du caractère E (pour éteindre) | ||
Version du 13 mai 2016 à 10:57
IMPORTANT, à la fin du tp, remettre le µcontrôleur dans la configuration initiale à l'aide de la commande suivante :
avrdude -pm328p -cavrisp2 -Pusb -B 100 -u -Ulfuse:w:0xc2:m -Uhfuse:w:0xd9:m -Uefuse:w:0x7:m
Attention, suivant la source d'horloge, il peut être nécessaire d'ajouter l'option -B 100 pour avrdude, afin de réduire la vitesse de programmation.
Nous allons mettre en place une communication sans fil entre 2 µcontrôleurs.
Les modules Xbee seront utilisés comme support de transmission.
D'un côté vous utiliserez une carte arduino, tandis que l'autre côté sera un atmega328p câblé sur une plaque à essais.
Dans un premier temps, la connexion sera filaire, et nous ajouterons seulement à la fin le module Xbee.
Sommaire
Côté émetteur
Nous utilisons ici une carte arduino UNO avec son bootloader, mais sans utiliser les librairies arduino !
Pas besoin de programmateur, seulement la liaison USB avec le PC.
On fera donc un projet AVR sur éclipse et on choisira comme programmateur "arduino UNO ttyACM0". La fréquence du cpu est alors de 16MHz (configuration standard sur les cartes arduino UNO).
Liaison UART
Nous allons configurer le module USART de l'atmega328p pour réaliser une liaison série ayant les caractéristiques suivantes :
- 8 bits de données
- parité paire
- 1 bit de stop
- 57600 bauds
Nous allons nous servir :
- de la figure ci-contre
- de la documentation atmel
- page 190
- pages 191 à 195
configuration
Nous ne ferons qu'émettre des données à partir de la carte arduino UNO.
Complétez le code suivant qui permettra d'émettre en boucle le caractère @
#include <avr/io.h>
#include <util/delay.h>
int main()
{
// autoriser la transmission
// données sur 8 bits
// parité paire
// 1 bit de stop
// 57600 bauds
while(1)
{
UDR0 = '@';
_delay_ms(200);
}
}
Remarque : Vous utiliserez gtkterm pour observer les données envoyées par votre carte. Il faudra quitter gtkterm pour pouvoir reprogrammer le µcontrôleur.
cosmétique
Simplifions l'écriture de notre programme en utilisant des fonctions.
void uart_putchar(char c)
{
loop_until_bit_is_set(UCSR0A, UDRE0); /* Wait until data register empty. */
UDR0 = c;
}
void uart_init()
{
// a completer
}
int main()
{
uart_init();
while(1)
{
uart_putchar('@');
}
}
Implémentez la fonction uart_init(), et vérifier le fonctionnement.
connectons un bouton
Ajoutons un bouton sur notre carte que l'on reliera de façon judicieusement sur la broche associée soit à INT0, soit à INT1. Vous pouvez consulter cet extrait de datasheet qui vous permettra de configurer correctement les différents registres.
Votre programme doit envoyer un caractère différent aux événement de bouton suivant :
- à l'appui, envoi du caractère A (pour allumer)
- au relâchement, envoi du caractère E (pour éteindre)