From babbeb8dfe6083ae08e61d0624c9eb7b62b8eeb8 Mon Sep 17 00:00:00 2001 From: dufourj Date: Mon, 30 Jan 2006 18:31:01 +0000 Subject: Doc : - ajout du compte-rendu de la formation AVR. --- n/avr/doc/cours.txt | 250 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 250 insertions(+) create mode 100644 n/avr/doc/cours.txt (limited to 'n/avr') diff --git a/n/avr/doc/cours.txt b/n/avr/doc/cours.txt new file mode 100644 index 0000000..38effcf --- /dev/null +++ b/n/avr/doc/cours.txt @@ -0,0 +1,250 @@ +*Title: Compte-rendu de la formation AVR +*Author: Marcel & Vinzoo & djerem +----------------------------------------------- +*TOC +----------------------------------------------- + +* Présents + [Romain Becquet] + [Clément Demonchy] + [Jérémy Dufour] + [Brice Gagnage] + [Vincent Genèves] + [Thomas Lambert] + [Christophe Le Blanc] + [Nicolas Schodet] + + +* Généralité + +Les AVR sont comme des PCs mais en plus petits. Ils ont de nombreux +avantages : + [Simple] On les câble et pouf ça marche. Pas besoin d'ajouter des + composants. Il suffit juste de le programmer pour contrôler les + entrées-sorties. + [Libre] Ils sont compatibles avec les logiciels libres. + [Interface] On peux les faires fonctionner avec pleins d'autres + composants. + +#---- TODO : Schéma structurel d'un AVR + +Les AVR s'alimentent avec du 5V. + +Deux entrées de l'AVR peuvent être utilisées pour le faire fonctionner à partir +d'une horloge externe, généralement générée par un quartz. Cela permet +d'augmenter la vitesse de l'AVR tout en le rendant plus précis. + +La communication de l'AVR avec un PC peut s'établir via le port série. +Attention : il faut penser à convertir le -12/+12V du PC en 0/5V pour l'AVR +(utilisation d'un max232). + + +* Les Entrées-Sorties + +Les entrées-sorties sont regroupées par port, chacun composé de 8 pattes. La +gestion des ports s'effectue donc par mot de 8 bits. + +Chaque port dispose de 3 registres de 8 bits, chaque bit correspondant à une +patte du port : + [PIN] C'est un registre de lecture. Il reflète l'état courant du port. + Il est donc utilisé pour lire les entrées-sorties du port. Il est + accessible en lecture seulement ; + [DDR] Il permet de sélection la direction du port : + * en entrée : dans ce cas là, il vaut 0. Cas par défaut pour + tous les ports ; + * en sortie : dans ce cas là, il vaut 1. + [PORT] Il a une fonction double : il permet soit d'activer un + ''pull-up'' si on est en entrée, soit de définir la valeur des pattes, + si on est en sortie. + +#---SET-CONTROL tableparser=new + ! Utilisation du registre PORT ! + !-------------------------------! + ! DDR ! PORT ! Résultat ! + !-------------------------------! + ! 0 ! 0 ! Pas de pull-up. ! + ! ! ! Haute impédance. ! + !-------------------------------! + ! 0 ! 1 ! Présence d'une ! + ! ! ! pull-up. ! + !-------------------------------! + ! 1 ! 0 ! Sortie = 0 ! + !-------------------------------! + ! 1 ! 1 ! Sortie = 1 ! + !-------------------------------! + +** Exemple d'utilisation du port A +*** Avec une diode +Une diode est branchée sur la patte A0 du port A. On veut la faire clignoter. +Voici l'algorithme du programme qu'il faudrait utiliser : + + DDRA = 1 /* active le mode sortie sur la patte 0 du port A */ + while (1) /* on boucle à l'infinie */ + { + PORTA = 1 /* allume la diode : passe la patte 0 du port A à + la valeur 1 */ + Delay(tps) /* attend de tps (histoire de voir la diode + allumée. Fonction delay déjà programmé chez + SI2E */ + PORTA = 0 /* éteint la diode : passe la patte 0 du port + A à la valeur 0 */ + Delay(tps) /* attend */ + } + +Pensez à protéger votre diode d'une résistance. + +*** Avec deux diodes +Maintenant, on souhaite ajouté une deuxième diode, que l'on va brancher sur le +port A3 et qui clignoterait en opposition de phase avec la première diode. Si +on reprend le même raisonnement que précédemment, il nous suffirait de recopier +le code et de changer : + DDRA = 1 -> DDRA = 8 /* 2³ = 8, on veut mettre 1 dans le 3ème + bit */ + PORTA = 1 -> PORTA = 0 + PORTA = 0 -> PORTA = 8 + +Mais en faisant ça, on va changer les autres bits du PORTA : en effet mettre +PORTA à 8, donnera 00001000 en binaire ce qui nous fera perdre le bit 0 qui +valait 1. Cela aura donc pour conséquence de ne plus allumer la diode +branchée sur A0. Pas très pratique. + +Afin d'éviter de changer les bits des autres pattes du port, il faut donc +utiliser les fonctions logiques : + [Mettre un bit à 1] Il faut faire un ''OU exclusif'' ; + [Mettre un bit à 0] Il faut faire un ''ET'' du registre PIN avec un + mot de 8 bits qui aura des 1 partout sauf pour le bit qu'on veut + changé. + + /* Passer de 1 à 0 le 3ème bit du PORTA. + ~8 correspond à l'inverse de 8. En binaire, ça donne l'inverse de + 00001000, c'est à dire 11110111. Notez que seul le 3ème bit est à 0 + car c'est celui là qu'on veut changer */ + PORTA &= ~8 + /* Passer de 0 à 1 le 3ème bit du PORTA */ + PORTA |= 8 + +Notez que l'on peut aussi travailler avec plusieurs bits d'un coup. Par +exemple si on veut passer les bits 2 et 3 de PORTA à 1, il suffit de faire : + PORTA |= 12 /* 2³ + 2² = 12 */ + +* Des périphériques tout fait dans l'AVR +L'AVR contient des périphériques tout fait comme par exemple : + * un convertisseur analogique-numérique : il possède un registre + utilisé à cet effet ; + * un port série : il possède des registres de configuration, de + réception, d'envoi... ; + * port I2C/TWI ; + * watchdog timer pour faire redémarrer l'AVR quand il plante ; + * PWM ; + * ... + +* Le mode polling et les interruptions +** Le mode polling +Voici comment fonctionne le mode polling avec un port série par exemple : + Est ce que j'ai un bit d'arrivée sur le port série ? + Si non, + je continue la suite du programme ; + Si oui, + je le traite de suite ; + +On doit donc entre chaque instruction du programme, regarder l'entrée du port +série pour vérifier la présence de données. Il y a donc une perte de temps +assez inutile à faire ces vérifications. + +Pour résoudre ce problème, on utilise les interruptions. + +** Les interruptions +Il existe sur l'AVR des pattes de certains ports qui peuvent générer des +interruptions : lorsque qu'elle changent d'état, il y a génération d'une +interruption qui sera traité ou non, selon son niveau. + +Reprenons l'exemple précédent pour le port série avec des interruptions : + J'exécute mon programme tranquillement, comme si de rien n'était ; + Pouf une interruption est déclenchée car il y a une réception d'un bit + sur le port série ; + Mon programme est interrompu et envoyé dans une fonction de traitement + de l'interruption : + je récupère la donnée reçue sur le port série, je la traite... ; + Une fois l'interruption finie, je retourne là où je m'étais arrêté + dans mon programme. + +Les interruptions sont traitées de manières linéaires, c'est à dire que si +deux interruptions ont été déclenchées en même temps ou avec un temps d'écart +très faible, on ne pourra pas savoir laquelle est arrivé avant. + +Précautions à prendre pour les interruptions : + [Les variables volatiles] Elles permettent de demander + systématiquement au compilateur de ne pas optimiser ces variables pour + que l'AVR aille bien chercher sa valeur dans la mémoire à chaque fois. + Elles sont obligatoires pour les variables qui servent à la fois dans + les interruptions et dans le reste du code pour que la bonne valeur + soit bien vue dans les deux parties du code ; + [Autoriser les interruptions] Il faut utiliser la fonction ''sei ()'' + dans le code pour les activer ; + [Interdire les interruptions] Il faut utiliser la fonction ''cei ()'' + dans le code pour les désactiver. + +* Interrupteur en entrée +Il est possible de mettre un interrupteur en entrée sur les AVR. Mais lorsque +l'interrupteur est ouvert, il faut que la patte soit branchée. Elle ne peut +rester dans le vide. Pour cela, il suffit d'activer le mode ''pull-up'' de la +patte correspondante. Attention au rebond ! + +* Les AVR chez SI2E +** Les AVR qu'on utilise + [ATMEGA8] + 20 E/S, 8k de flash, environ 6 euros. + [ATMEGA35] + Comme l'ATMEGA8, mais avec plus d'E/S. + [ATMEGA64] + 64k flash, CMS. + [ATMEGA128] + 128k flash, CMS. + +** Le code AVR +Je ne peux que vous inviter à aller regarder de plus près le code dans le CVS +et dans le SVN dans |n/avr|. Vous y trouverez les programmes des différentes +cartes (asservissement, E/S, ...), de la documentation, un simulateur pour +faire fonctionner sur PC et même des exemples. + +** Encore plus de pratique +Voyons de plus près la structure du dossier |n/avr| du SVN : + |-- common + | >>> Quelques macro globales, à inclure dans les programmes + |-- doc + | >>> De la documentation, dont celle-ci + |-- make + | >>> Les Makefiles utilisées pour la compilation + `-- modules + | >>> Pleins de petits modules qui sont déjà tout fait + |-- adc + | >>> Module pour la conversion analogique vers digital + |-- host + | >>> Simulateur AVR pour PC + |-- math + | >>> Pour faire des calcules en virgule fixe, génération de nombres aléatoires + |-- proto + | >>> Pour la gestion du protocole du port série + |-- twi + | >>> Pour la gestion du bus I2C + |-- uart + | >>> Pour la gestion du port série ? + `-- utils + >>> Des petites fonctions comme delay, reset... + +Sachez qu'il y a aussi un |Makefile| à faire et un fichier |avrconfig.h| qui +permet par exemple de définir l'horloge de l'AVR que vous utilisez. + +* Logiciels +Les logiciels pouvant compiler du code pour AVR sont : GCC-AVR, WIN AVR, AVR +studio... + +* Autres documentations +Pour plus d'informations, il vous reste l'internet et aussi le serveur local +du robot pour accéder aux datasheets des différents AVR qui contiennent plein +de choses ({+http://robot/local/datasheet/avr/+} qui ne fonctionne que depuis le +local). + +* Remerciement +Merci à Ni d'avoir pris le temps de nous faire cette formation alors qu'il +était malade. -- cgit v1.2.3