Utiliser les PIC 16F et 18F/Exercices/Le Timer0 des 16FXXX et le langage C

Leçons de niveau 15
Une page de Wikiversité, la communauté pédagogique libre.
Le Timer0 des 16FXXX et le langage C
Image logo représentative de la faculté
Exercices no7
Leçon : Utiliser les PIC 16F et 18F
Chapitre du cours : Le Timer0 des 16FXXX et le langage C

Exercices de niveau 15.

Exo préc. :Les ports et le langage C
Exo suiv. :Interruption timer0 en langage C
En raison de limitations techniques, la typographie souhaitable du titre, « Exercice : Le Timer0 des 16FXXX et le langage C
Utiliser les PIC 16F et 18F/Exercices/Le Timer0 des 16FXXX et le langage C
 », n'a pu être restituée correctement ci-dessus.




Exercice 1[modifier | modifier le wikicode]

unsigned int A;
unsigned int Q; /* the quotient */
        Q = ((A >> 1) + A) >> 1; /* Q = A*0.11 */
        Q = ((Q >> 4) + Q)     ; /* Q = A*0.110011 */
        Q = ((Q >> 8) + Q) >> 3; /* Q = A*0.00011001100110011 */
        /* either Q = A/10 or Q+1 = A/10 for all A < 534,890 */

1°) Sans chercher à comprendre l'algorithme de division ci-dessus, on vous demande de le transformer en une fonction de prototype "unsigned int div10(unsigned int A);"

2°) Écrire un programme complet qui mesure le temps d'exécution du sous programme de division par 10, puis modifier le programme pour qu’il puisse comparer avec une division par 10 normale.

Exercice 2[modifier | modifier le wikicode]

Question 1[modifier | modifier le wikicode]

Écrire en langage C un programme qui fait la même chose que le programme assembleur ci-dessous :

     clrf        tmr0                 ; début du comptage dans 2 cycles 
                                      ; (voir remarque plus bas) 
     bcf         INTCON , T0IF        ; effacement du flag 
loop 
     btfss       INTCON , T0IF        ; tester si compteur a débordé 
     goto        loop                 ; non, attendre débordement 
     xxx                              ; poursuivre : 256 évènements écoulés

qui initialise le timer0, efface le flag et attend, à l'aide d'une boucle, le positionnement de ce dernier.

Question 2[modifier | modifier le wikicode]

Mais vous pourriez vous dire que vous ne désirez pas forcément attendre 256 incrémentations de tmr0. Supposons que vous désiriez attendre 100 incrémentations. Il suffit dans ce cas de placer dans tmr0 une valeur telle que 100 incrémentations plus tard, tmr0 déborde.

Exemple :

	; timer0 en mode 8 bits
     movlw       256-100              ; charger 256 – 10
     movwf       tmr0                 ; initialiser tmr0 
     bcf         INTCON,T0IF          ; effacement du flag 
loop 
     btfss       INTCON,T0IF          ; tester si compteur a débordé 
     goto        loop                 ; non, attendre débordement 
     xxx                              ; oui, poursuivre : 100 évènements écoulés

Écrire en langage C un programme qui fait la même chose que le programme assembleur ci-dessus : initialise le timer0, efface le flag et attend à l'aide d'une boucle le positionnement de ce dernier. {{Remarque|contenu=Ceci pourrait sembler correct, mais en fait toute modification de TMR0 entraîne un arrêt de comptage de la part de celui-ci correspondant à 2 cycles d’instruction multipliés par la valeur du pré diviseur. Autrement dit, un arrêt correspond toujours à 2 unités TMR0. Il faut donc tenir compte de cette perte, et placer « 256-98 » et non « 256-100 » dans le timer.

Question 3[modifier | modifier le wikicode]

Générer un signal de fréquence 1 kHz (avec un quartz de 4 MHz). Pour cela :

  • calculer la valeur de la pré division
  • calculer la valeur de décomptage
  • Écrire le programme.

Question 4[modifier | modifier le wikicode]

Même chose mais il faut que la période diminue progressivement

Question 5[modifier | modifier le wikicode]

Générer un signal de sortie de rapport cyclique 1/4 sur le même principe. Il y a mieux à faire avec les PICs, utiliser le module CCP.

Exercice 3 (pour PIC 18F)[modifier | modifier le wikicode]

Refaire l'exercice précédent avec le compilateur C18, c'est-à-dire pour le PIC 18F. On rappelle que Pour le PIC 18F le timer est au choix sur 8 ou 16 bits. On gardera ici bien sûr les mêmes valeurs sur 8 bits que l'exercice précédent.