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

Aller à la navigation Aller à la recherche
m
Robot : Remplacement de texte automatisé (-(\d{1,})\s?MHz +{{Unité|\1|{{abréviation|Mhz|mégahertz}}}})
m (Robot : Changement de type cosmétique)
m (Robot : Remplacement de texte automatisé (-(\d{1,})\s?MHz +{{Unité|\1|{{abréviation|Mhz|mégahertz}}}}))
Si vous voulez savoir comment est réalisé pratiquement ce qui est décrit dans cet exercice, visitez le chapitre [[Very High Speed Integrated Circuit Hardware Description Language#Embarquer un PIC 16F84|Embarquer un PIC 16F84]] d'un autre livre.
 
Un [[w:PIC_16F84_de_Microchip|PIC16F84]] est enfoui dans un [[w:FPGA|FPGA]]. Sa seule particularité est de fonctionner à 50MHz{{Unité|50|{{abréviation|Mhz|mégahertz}}}} contre 10 (resp. {{Unité|20 MHz|{{abréviation|Mhz|mégahertz}}}}) de fréquence maximale d'horloge pour les PIC 16F84 (resp. 16F84A). Il exécute le programme suivant (écrit avec le compilateur Hitech C) :
<source lang="c">
//#include <pic1684.h>
Les deux questions suivantes sont issues du Devoir Surveillé de juin 2010.
 
5°) Le programme suivant est donné comme exemple du compilateur MikroC et tourne dans un PIC 16F84 qui a un quartz de {{Unité|4 MHz|{{abréviation|Mhz|mégahertz}}}}.
<source lang="c">
unsigned cnt;
N'oubliez pas la division par 16 qui est réalisée avec le if (!(nb % 16)) dans l'interruption.
 
<u>Calcul précis</u> : {{Unité|50 MHz|{{abréviation|Mhz|mégahertz}}}} / 4*(256*256*16) = 11,92 Hz (la division par 4 a toujours lieu).
 
3°) "if (!(nb % 16))" est une façon pas très efficace de calculer le reste de la division par 16. J'ignore la technique utilisé par le compilateur, mais ce calcul est forcément long puisqu'il n'y a pas d'instruction de division sur le 16F84.
unsigned char SEGMENT[] = {0x3F,....
</source>
3°) Réaliser le programme main() responsable de l'initialisation de l'interruption qui doit avoir lieu toutes les 10ms (avec un quartz de 4MHz{{Unité|4|{{abréviation|Mhz|mégahertz}}}}) et qui compte de 00 à 99 toutes les secondes environ (avec un "Delay_ms(1000);")
 
4°) Réaliser enfin l'interruption qui affichera tantôt les dizaines, tantôt les unités.
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 : {{Unité|1 MHz|{{abréviation|Mhz|mégahertz}}}} qu'il faut diviser par {{formatnum:10000}} 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">
//****** Mikro C ********
143 371

modifications

Menu de navigation