algo


II. Programmation en langage C.

 

1) Programme en langage C.

 

langue

 (cliquer sur l'image pour voir le programme en entier)

2) La modulation en largeur d’impulsion.

 

Afin de rendre les  interruptions régulières, il a été nécessaire d’utiliser un compteur : le timer0. Celui-ci compte les cycles d’horloge du PIC jusqu’à 255 puis lève un drapeau, un flag,  d’avertissement : il est en mode timer.

 

 

timer

 

registre

 

a) Registre tmr0 :

Il contient le nombre de cycles de l’horloge du PIC compté. Arrivé à 255, il recommence normalement à 0 mais nous avons décidé de le remettre  à 6 pour compter 250 impulsions d’horloge.

 

b) Registre option_reg :

 

- T0CS=0, pour configurer le timer0 en mode timer (Tmr0 Clock Source select bit).

- RBPU=1, INTEDG=0, T0SE=0, car ces fonctions ne sont pas utilisées pour le timer.

- PSA=0, pour affecter le prédiviseur au timer0.

- PS2:PS0=0b001, le prédiviseur a une valeur de 4.

On obtient donc option_reg=0b10000001 d’où option_reg=0x81.

 

c) Registre intcon :

 

- GIE=0, Global Interrupt Enable bit : autorise les interruptions.

- T0IE=1, pour autoriser les interruptions du timer 0.

- Les autres bits sont à 0 car ils ne sont pas utilisés.

On obtient donc intcon=0b10100000 d’où intcon=0xA0.

 

 

Explication du choix  d’un prédiviseur d’une valeur de 4 :

 

Nous utilisons un quartz de 4 MHz. Le timer0 divise automatiquement la fréquence de l’horloge par 4. On a donc initialement une fréquence de 1 MHz (4 MHz / 4).

Le prédiviseur est à 4 donc on a une fréquence de 250 kHz (1 000 kHz / 4). La période est de 4 µs (T=1 / 250 kHz).

Il faut donc 4 µs * 250 (nombre d’impulsions à compter), soit 1 ms, pour que le timer déborde et donc créer une interruption. La fréquence de la période de 10 interruptions est donc de 100 Hz (f=1 / 1 ms) ce qui n’est ni trop élevé ni trop bas pour régler la vitesse des moteurs.

Sommaire