Étape 8: Interrompre, interrompre...
Nous les informations de fréquence permet de créer une interruption logicielle à, ou près, de la fréquence requise.
L’interruption ne peut pas toujours être définie précisément, mais c’est suffisant. La fréquence de lire le fichier est transmise à la sous-routine setintrupt.
void setintrupt(float freq) {}
float bitval = 8 ; 8 pour timers 8 bit 0 et 2, 1024 pour minuterie 1 octet
setocroa=(16000000/(FREQ*BiTVal)) - 0,5 ;
La valeur de setocroa nécessite une soustraction-1. Cependant, ajoutant 0,5 arrondit à 0,5 le plus proche
La résolution de la minuterie est limitée
Finalement déterminée par l’ampleur des bitval
CLI() ; désactiver les interruptions
interruption de jeu timer2
TCCR2A = 0 ; tout registre TCCR2A la valeur 0
TCCR2B = 0 ; même chose pour TCCR2B
TCNT2 = 0 ; initialiser la valeur de compteur à 0
Comparez Set match enregistrer des augmentations de la fréquence (hz)
OCR2A = setocroa ; = (16 * 10 ^ 6) / (fréquence * 8) - 1 (doit être < 256)
activer le mode de la CCT
TCCR2A | = (1 << WGM21) ; Néc CS21 bit Prédiviseur 8
TCCR2B | = (1 << CS21) ; activer minuteur comparer interruption
TIMSK2 | = (1 << OCIE2A) ; Cela fonctionne, à l’instar de la ligne suivante
SBI(TIMSK2,OCIE2A) ; activer les interruptions sur minuterie 2
SEI() ; activer les interruptions
.
Discernement des lecteurs sera repéré sbi(TIMSK2,OCIE2A)
Je place un couple de fonctions (internet acquis) pour définir et effacer les bits du Registre :
Définit pour effacer les bits du Registre
#ifndef DRAS
#define DRAS (sfr, bit) (_SFR_BYTE(sfr) & = ~_BV(bit))
#endif
Définit pour les forets de registre de réglage
#ifndef sbi
#define sbi (sfr, bit) (_SFR_BYTE(sfr) | = _BV(bit))
#endif
Ces fonctions fournissent un simple appel pour appliquer ou supprimer l’interruption.
.
Si l’interruption est en cours d’exécution, ce qui peut nous faire faire ?