====== Différences ====== Cette page vous affiche les différences entre la révision choisie et la version actuelle de la page.
tuto_avr_eclipse_2nd_projet_-_timer_led [2013/11/10 20:59] spelle [Explication de Code] |
tuto_avr_eclipse_2nd_projet_-_timer_led [2013/11/10 21:05] (Version actuelle) spelle [Explication de Code] |
||
---|---|---|---|
Ligne 74: | Ligne 74: | ||
En mode CTC, pour les Timer #0 ou #2 (8-bit), la frequence minimale (avec un prescaler de //1/1024// et une valeur de comptage au maximum (//0xFF = 255//) est de //~30Hz//. | En mode CTC, pour les Timer #0 ou #2 (8-bit), la frequence minimale (avec un prescaler de //1/1024// et une valeur de comptage au maximum (//0xFF = 255//) est de //~30Hz//. | ||
Pour le Timer #1 (16-bit), avec les memes conditions (prescaler à //1/1024// et valeur de comptage au max (//0xFFFF = 65535//) est de //0.1Hz//. | Pour le Timer #1 (16-bit), avec les memes conditions (prescaler à //1/1024// et valeur de comptage au max (//0xFFFF = 65535//) est de //0.1Hz//. | ||
+ | |||
+ | > NB : Cette frequence max est la frequence de la broche OCnA qui est togglé a chaque //Compare Match// (en mode //CTC//) | ||
A tout moment, n'hesitez pas a vous referer a la datasheet, les explications y sont (beaucoup) plus exhaustives ! :-) | A tout moment, n'hesitez pas a vous referer a la datasheet, les explications y sont (beaucoup) plus exhaustives ! :-) | ||
Ligne 95: | Ligne 97: | ||
<code c> | <code c> | ||
- | OCR1A = 15624 ; // Set CTC compare value to 1Hz at 16MHz AVR clock, with a prescaler of 256 | + | OCR1A = 62499 ; // Set CTC compare value to 1Hz at 16MHz AVR clock, with a prescaler of 256 |
</code> | </code> | ||
- | La valeur //15624// est defini par la formule donnée dans la datasheet : | + | La valeur //62499// est defini par la formule donnée dans la datasheet : |
<code c> | <code c> | ||
Ligne 106: | Ligne 108: | ||
Avec N etant la valeur du prescaler, soit //1//, //8//, //64//, //256//, ou //1024//. | Avec N etant la valeur du prescaler, soit //1//, //8//, //64//, //256//, ou //1024//. | ||
- | En choisissant un prescaler, il est ensuite facile de trouver la valeur qui va bien. Pour avoir une periode à 1 seconde, le prescaler de //64// permet de monter jusqu'a //125KHz//, et de descendre jusqu'à //~1.9Hz//. | + | En choisissant un prescaler, il est ensuite facile de trouver la valeur qui va bien. Pour avoir une periode à 1 seconde, le prescaler de //256// permet de monter jusqu'a //31.25KHz//, et de descendre jusqu'à //~0.47Hz//. |
Les interruptions sont ensuite activées. Jusqu'a present, elles etaient descativées ; on dit aussi masquées. | Les interruptions sont ensuite activées. Jusqu'a present, elles etaient descativées ; on dit aussi masquées. | ||
Ligne 114: | Ligne 116: | ||
</code> | </code> | ||
- | Le Timer est ensuite demarré simplement en configurant le prescaler. Il faut garder a l'esprit que ecrire dans registre de controle, derriere il y a tout un ensemble de circuits logiques qui se mettent en route. En activant le prescaler, on vient demander l'application du signal d'horloge à //F_CPU/64 = 250KHz// sur notre Compteur/Timer. | + | Le Timer est ensuite demarré simplement en configurant le prescaler. Il faut garder a l'esprit que ecrire dans registre de controle, derriere il y a tout un ensemble de circuits logiques qui se mettent en route. En activant le prescaler, on vient demander l'application du signal d'horloge à //F_CPU/256 = 62.5KHz// sur notre Compteur/Timer. |
<code c> | <code c> | ||
Ligne 136: | Ligne 138: | ||
Bon, là pas de grosse difficultées, on vient dire que l'on defini une Interrupt Sub-Routine pour le Comparateur A du Timer #1. Oui, il y a deux comprateur pour le Timer #1, le A et le B. L'//ISR//, quand elle est appellée va venir faire clignoter notre LED de la meme maniere que précédemment. | Bon, là pas de grosse difficultées, on vient dire que l'on defini une Interrupt Sub-Routine pour le Comparateur A du Timer #1. Oui, il y a deux comprateur pour le Timer #1, le A et le B. L'//ISR//, quand elle est appellée va venir faire clignoter notre LED de la meme maniere que précédemment. | ||
- | Ce qui se passe... Le Compteur/Timer #1 compte jusqu'a notre valeur a la vitesse de //15.625KHz//... Il arrive à //15625// en une seconde... Une fois à cette valeur le module de comparaison detecte que la valeur actuelle du Compteur est egale a celle de OCR1A, il leve le Flag OCF1A, qui si les interruptions ne sont pas masquées, génère une interruption. | + | Ce qui se passe... Le Compteur/Timer #1 compte jusqu'a notre valeur a la vitesse de //62.5KHz//... Il arrive à //62499// en une seconde... Une fois à cette valeur le module de comparaison detecte que la valeur actuelle du Compteur est egale a celle de OCR1A, il leve le Flag OCF1A, qui si les interruptions ne sont pas masquées, génère une interruption. |
L'interruption est donc prise en compte par le mircoprocesseur, qui va s'interrompre et va appeller le vecteur d'interruption correspondant a l'interruption qui l'a interrompu ; dans notre cas //TIMER1_COMPA_vect//. Dans les faits, il s'agit d'un simple saut a l'adresse de la fonction definie comme //ISR//... | L'interruption est donc prise en compte par le mircoprocesseur, qui va s'interrompre et va appeller le vecteur d'interruption correspondant a l'interruption qui l'a interrompu ; dans notre cas //TIMER1_COMPA_vect//. Dans les faits, il s'agit d'un simple saut a l'adresse de la fonction definie comme //ISR//... | ||
---- | ---- | ||
- | |||
===== Remarques, Propositions d'améliorations, Questions ===== | ===== Remarques, Propositions d'améliorations, Questions ===== | ||