Étape 5: Courte introduction sur PIC et minuteries
Les minuteries peuvent être utilisés pour des tâches un peu : création de bases de temps, déclenchant des manifestations périodiques, mesurer le temps entre deux événements (fréquence de mesure) et bien plus encore. Dans mon petit firmware, j’ai utilisé un minuteur pour me faire une base de temps de dix millisecondes. Compter qu’une centaine de fois m’a donné un drapeau qui a obtenu la valeur chaque fois qu’une seconde passée. Cela était nécessaire, parce que je savais que je voulais l’appareil pour recharger pendant 10 minutes et sur mesure pour 5 secondes – une base de temps standard devait être impliqué dans le projet en quelque sorte.
Consacrée aux minuteries PIC
Un processeur peut exécuter des milliers d’instructions en fractions de seconde, les plus grandes bases de temps sont généralement construits en comptant les millisecondes un plusieurs centaines de fois. Pour pouvoir calculer un petit moment, comme celui de 1ms, nous avons besoin de savoir à quelle vitesse le PIC fonctionne vraiment à. Le PIC12F683 a un oscillateur interne de maximum 8MHz, c’est ce que j’ai utilisé pour cadencer le système. Sachant que le PIC a besoin de quatre horloges pour exécuter une instruction unique, le cycle d’instruction est MHz 2. sur cette base, le temps nécessaire par le commandant de bord pour exécuter une instruction est 1/2.000.000 = 500ns. Ce sera la base de temps avec que les temporisateurs internes fera progresser. Chaque timer a un associé interne 8 ou registre de 16 bits, ce qui augmente sa valeur chaque fois que cette 500ns passe. Ce registre peut être lue et écrit à tout moment. Lors de la 8 ou 16 bits inscription débordements, un indicateur est défini pour signaler cet événement.
Convertisseurs et postscalers peuvent être assignés aux minuteries, pour atteindre les temporisations plus longtemps. Un Prédiviseur ou postscaler est un compteur sur son propre, configurable dans une variété de façons. Autrement dit, ces divisent l’horloge à leur entrée avec une valeur qui peut être changée par le logiciel. Un diviseur de 1:8 donne un signal d’horloge sur sa sortie après chaque horloge 8-ème à son entrée. Cela signifie, qu’ajoutant un Prédiviseur 1:8 sur une entrée de minuterie va ralentir la vitesse de cette minuterie avance par 8. Postscalers fonctionne exactement la même chose, c’est généralement la position de ces circuits (à l’égard auprès du registre de la minuterie), qui détermine si nous parlons un Prédiviseur ou un postscaler. Convertisseurs de ralentir le taux d’avance du Registre minuterie, postscaler retard au moment où un événement de dépassement de capacité se déclenche. À l’aide de ces circuits, nous pouvons créer les horodateurs de plus longues périodes. L’événement qui se produit à chaque dépassement de capacité est souvent décrit comme le « réglage de l’indicateur d’interruption ».
Nous allons voir la configuration de l’horloge dans notre exemple !
Configuration de l’horloge 0
Dans notre processeur, il y a trois minuteries disponibles, nous allons utiliser qu’un seul : numéro 0 de la minuterie. Les registres qui doivent être configurés pour ce module de travailler sont : OPTION_REG, INTCON.
Configuration de OPTION_REG
Le grignotement supérieur de ce registre n’a aucun effet sur le timer0, je vais leur mettre à zéro. Le grignotement inférieur se compose de la PSA bit de (3) qui détermine où le diviseur sera obtenir affecté, minuterie 0 ou le temporisateur. Je veux pas de diviser le taux d’avance du Registre minuterie timer 0, alors il faut mettre à 0. Ensuite, je veux le mettre pour diviser l’horloge autant qu’il peut 1: 256. Pour ce faire, je dois définir les bits de PS2:PS0 à 111. Cela se traduit par OPTION_REG étant la valeur 0b00000111 = 0 x 07.
Configuration de INTCON
Ce registre a peu à voir avec minuterie 0 car c’est un registre de configuration d’interruption, mais – comme nous utilisons des interruption avec minuterie 0 – j’ai de le mentionner. Les trois bits qui sont associés avec minuterie 0 sont les suivants : GIE, T0IF, T0IE.
GIE est le bit qui permet les interruptions au niveau mondial, si cela est défini à 0, aucune interruption ne se déclenchera. Bien sûr, nous devons définir ceci à 1.
T0IE est une interruption permettent peu trop, mais celui-ci est-il strictement pour activer/désactiver l’interruption du timer 0. Nous devons définir ceci à 1 trop.
T0IF est le bit d’indicateur interrupt timer 0 qui obtient la valeur chaque fois que le timer 0 Registre déborde, il faut effacer ce bit au démarrage, il sera réglé par le matériel une fois que le registre de la minuterie atteint la valeur maximale et déborde. D'où T0IF doit avoir la valeur 0.
Nous devons 0b11100000 la valeur INTCON = 0xE0 pour rendre cette minuterie fonctionnent de la manière que nous voulons.
Autres choses qu’il faut faire
Pour créer le moment exact d’une millisecondes, nous allons avoir à précharger le registre de la minuterie. Le nombre de minuteur étape divisée par 256 (à cause du Prédiviseur que j’ai choisi) ajoutée à cette valeur de précharge devrait donner la valeur de débordement du Registre minuterie. Dans notre cas, cette valeur est 256, puisque nous utilisons une minuterie de 8 bits.
Les choses que nous savons :
- horloge de l’oscillateur = 8 MHz
- horloge d’instruction = 2 MHz
- période d’instruction = 500 ns
- Prédiviseur utilisé = 1: 256
- moment où nous voulons = 10 ms
Les choses que nous voulons savoir :
- valeur de précharge registre la minuterie.
Nous savons que nous voulons un 10 ms de chronométrage, et nous savons que notre minuterie étapes à un débit de 256 * 500 ns. Cette multiplication de problèmes nous dit que le registre de minuterie 0 avancera quand passes 128 μs. 10 ms / 128 μs = 78, ce numéro est important parce qu’il exprime nos 10 ms dans nombre d’étapes de minuterie. Nous savons que nous voulons que le trop-plein de Registre minuteur après 10 ms, et nous savons que cela se produit après la valeur maximale de 8 bit, 255. Assez simple, il suffit de mettre 256 – 78 = 178 dans le registre de la minuterie et attendez que l’indicateur défini. Ceci se produira après 10 ms.
Ce n’est pas suffisant, que nous devrons également actualiser le registre minuterie avec cette valeur après chaque dépassement de capacité. Si nous ne parvenons pas à le faire, le registre de minuterie comptera à partir de zéro et les timings sera totalement fermées (128 μs * 256 n'est pas de 10 ms).
Je l’ai mentionné comment ces indicateurs de dépassement de capacité peuvent déclencher des interruptions (peut et va, parce que nous avons activé cette fonctionnalité dans le registre INTCON). Les interruptions sont gérées dans une partie spéciale du programme appelé une routine d’interruption du service. Chaque fois qu’une interruption est déclenchée, le programme saute à cette partie spéciale du programme et l’exécute. Après qu’il exécute cette partie du code (souvent dénommé l’interruption traitée), le programme continue où il s’était arrêté avant l’interruption a été signalée. Cela permet à un programmeur de réagir rapidement à ce genre d’événements, en fait, c’est la raison pourquoi interruptions ont été « inventées ». Les routines d’interruption service convient courts, donc leur exécution est assez rapide. J’ai écrit le registre minuterie rechargement dans la routine d’interruption du service, ce qui garantit la minuterie 0 débordements se produira après 10 ms maintes et maintes fois. Le drapeau de l’interruption doit être effacé trop, sinon le processeur sera « pense » qu’une interruption est signalée – il sera coincé dans la routine de service et n’arrive pas à nouveau le code principal. C’est une erreur classique et vous pouvez retenir pour un temps assez long.