summaryrefslogtreecommitdiff
path: root/n/avr/doc/cours.txt
blob: ec0f19b23ba8bc2e7e8817c2a44bbb75b3df7271 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
*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.

*Image-center: schema_avr.png
		~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'' ;
	[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

Il existe une macro ''_BV'' (d�finie dans |common/io.h|) qui permet de
travailler directement avec le rang du bit que l'on veut changer. L'exemple
pr�c�dent devriendrait alors :
	PORTA &= ~_BV(3)  /* 1 << 3 = 8 */
	PORTA |= _BV(3)  

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 */
	/* Pareil en utilisant la macro _BV */
	PORTA |= _BV(2) + _BV(3)

Essayez d'utiliser cette macro car, de mani�re g�n�nale, elle rend le code
plus lisible.

* 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 ''cli ()''
	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.