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

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.
1°)
2°)
Pour comparer avec l'algorithme classique, remplacer
par
À ma très grande surprise un essai sur la carte easyPIC5 et le compilateur MikroC m'ont donné les résultats en commentaire dans le programme ci-dessous :
Vous pouvez noter la présence d'une interruption, mais j’ai été tellement surpris que la division par 10 fonctionne plus rapidement que div10 que j’ai voulu tester s'il n'y avait pas un débordement du timer. Cette façon de faire permet d'afficher un nombre sur 16 bits sur les deux ports A et B du PIC.
Autre essai en 2013 avec l'afficheur GLCD :
t=2 us avec /10 et t= 38 us avec div10 sont affichés !!!!!! À creuser

## Exercice 2
### Question 1

Écrire en langage C un programme qui fait la même chose que le programme assembleur ci-dessous :
qui initialise le timer0, efface le flag et attend, à l'aide d'une boucle, le positionnement de ce dernier.

### Question 2

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 :
É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

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.
On va en fait générer 2kHz et changer sans arrêt un bit RA0 du PORTA. 1 MHz / 2kHz=500. Si l’on divise par 2 on peut rester en 8 bits avec comme valeur 250-2=248 à compter donc une initialisation à 256-248=8. Ceci n'est qu'une valeur théorique qui dépend du compilateur. Il faut donc faire des essais pour trouver la valeur exacte. Une autre technique pour être quasi indépendant du compilateur c’est de remplacer :
TMR0 = 8;
par
TMR0 = TMR0+8;
qui dépend moins du temps que l’on a mis pour réaliser les instructions.

### Question 4

Même chose mais il faut que la période diminue progressivement
Période diminue => fréquence augmente.
TMR0 = TMR0+8;
est remplacé par
TMR0 = TMR0+delta
avec unsigned char delta; initialisé à 8 et augmenté progressivement.

### Question 5

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)

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.
Question 1 :
Question 2
Question 3
Question 5
| Les ports et le langage C | Interruption timer0 en langage C |