dimanche 25 mars 2012

retour sur hello DEL

Voici quelques explications supplémentaires sur la sous-routine minuterie du programme hello-del.asm présenté dans la chronique précédente.

J'ai expliqué comment calculer la valeur de la constante pour déterminer la durée du délais. On se base sur la durée du cycle d'instruction Tcy. Dans les micro-controlleurs PIC un cycle d'instruction dure 4 cycles d'oscillateur. Comme l'oscillateur interne du PIC10F202 fonctionne a 4Mhz ça donne un Tcy de 1usec (micro-seconde). Donc on a 500 000 Tcy par 1/2 secondes. Pour créer un délais on initialise une variable compteur ensuite on la décrémente jusqu'à zéro. Du moins c'est la première idée qui vient a l'esprit.


NBRE_ITERATION EQU 0
;initialisation du compteur
movlw low NBRE_ITERATION
movwf compteur
; boucle de délais
boucle
decfsz compteur,F ; 1 Tcy ou 2Tcy si la condition est vrai
goto boucle ; 2 Tcy


Mais que ce passe-t-il si on charge le compteur avec la valeur zéro?
la variable compteur est décrémentée et tombe à la valeur 255
le test si compteur = 0 saute la prochaine instruction échoue et l'instruction goto boucle est exécutée. Normalement on ne veut pas bouclé puisqu'on a indiqué une valeur de délais nulle. Mais dans ce cas on va en fait bouclé 255 fois! Esssayons autre chose.


NBRE_ITERATION EQU 0
;initialisation du compteur
movlw ~NBRE_ITERATION ; ~ signifit complément de 1
movwf compteur ; compteur = 0xFF - NBRE_ITERATION
boucle
incfsz compteur,F
goto boucle


Dans cette version si la constante NBRE_ITERATION=0 son complément à 1 est 0xFF (255). Le compteur est incrémenté et tombe à la valeur zéro et on saute par dessus le goto qui suit. On obtient donc l'effet escompté. C'est à dire que si on initialise le compteur avec la valeur zéro il n'y a pas de bouclage et le délais est minimal, il est de 4 Tcy, 2 Tcy pour l'initialisation et 2 pour l'instruction incfsz compteur,F car cette instruction prend 2Tcy lorsque la condition de test est vraie et qu'il y a un saut. Si la valeur de NBRE_ITERATION valait 1 sont complément serait 0xFE (254) et on bouclerais exactement 1 fois, etc. Cet algorithme fonctionne tel qu'attendu.

autre méthode pour minuterie

Les ressources du PIC10F202 étant très limitées on essaie de les économiser le plus possible. la sous-routine minuterie utilisé dans le programme de la chronique hello DEL utilise 3 registres de variables et la routine minuterie utilise 13 instructions. En utilisant le périphérique TIMER0 du MCU on peut faire mieux.



NBRE_ITERATION EQU .245 ;
minuterie
;initialisation du compteur
movlw ~NBRE_ITERIATION
movwf compteur
;initalisation du TIMER0
init_tmr0
movlw 1
movwf TMR0
movlw B'10000010' ; pré-division par 8
option ; W -> OPTION
boucle
movfw TMR0 ; TMR0 -> W
skpz ; si W==0 on saute le "goto boucle"
goto boucle
incfsz compteur,F ; incrémente le compteur de délais
goto init_tmr0 ; cette instruction est sauté si compteur==0
return ; on retourne à la procédure appelante.

TIMER0 est une minuterie 8bit interne du MCU qui est allimenté par la fréquence de l'oscillateur interne divisé par 4 (Fosc/4). Mais il y a aussi dans le MCU un diviseur de fréquence binaire programmable (prescaler) qui peut-être inséré entre l'oscillateur et l'entrée du TIMER0. Dans notre exemple on branche le diviseur et on le programme pour une division par 8. Donc le TIMER0 reçoit une impulsion qui le fait incrémenté à toute les 8 micro-secondes. On initialise le TIMER0 avec la valeur 1 on attend qu'il revienne à zéro. Pour revenir à zéro il doit recevoir 255 impulsions. Donc ça prend 8*255= 2040uSec. NBRE_ITERATION= 500000uSec/2040uSec=245

Remarquez que cette méthode nécessite 12 instructions, on gagne 1 seule instruction par contre on sauve 2 registres de variables. Considérant que le PIC10F202 n'en a que 24 cette méthode est aventageuse si on manque de variables. Mais ce n'est pas la seule raison pour laquelle l'utilisation d'un TIMER est avantageuse. Il y a aussi le fait que pendant que ce dernier compte le MCU peut effectuer une autre tâche car le TIMER n'a pas besoins d'instructions pour être incrémenté.

Aucun commentaire:

Enregistrer un commentaire