« Utiliser les PIC 16F et 18F/Exercices/Interruption timer0 en langage C » : différence entre les versions

Contenu supprimé Contenu ajouté
Ligne 192 :
}
</source>
3°) Pour bien faire, le comptage doit se faire en BCD. Cela peut se faire avec :
3°)
<source lang="c">
nb++;
unsigned char Display(unsigned char no) {
// gérer le problème des unités
//unsigned char Pattern;
if ((nb &0x0F) > 9) then nb+=6;
unsigned char SEGMENT[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
// gérer le problème des dizaines
return SEGMENT[no];
if ((((nb &0xF0) > 0x90) nb = 0;
}
</source>
Les compilateurs C compilent cela certainement de manière peu optimisée. Il faut savoir qu'il existe un bit "half carry" dans le registre '''Status''' qui permet certainement d'optimiser, mais nous laissons tomber ce genre de détail.
 
Pour la période de l'interruption, on part de la fréquence quartz divisée par 4 soit : 1 MHz qu'il faut diviser par 10 000 pour avoir une période d'overflow de 10 ms. Le timer gère une division par 256 qu'on peut ramener à 250 en l'initialisant à 6 mais il nous reste à réaliser une division par 40 qui n'est pas une puissance de 2. On va prendre une division par 64 et 10000 / 64 = 156,25 donc notre timer0 sera initialisé à 256-156 = 100.
<source lang="c">
nb++;
// gérer le problème des unités
if ((nb &0x0F) > 9) then nb+=6;
// gérer le problème des dizaines
if ((((nb &0xF0) > 0x90) nb = 0;
</source>
}}