Stap 8: Onderbreken, onderbreken...
We gebruiken de frequentie informatie wilt maken van een programma-interrupt op, of nabij, de vereiste frequentie.
De interrupt kan niet altijd worden ingesteld precies, maar wel voldoende. De frequentie van het bestand leest wordt doorgegeven aan de subroutine setintrupt.
VOID setintrupt(float freq) {}
zweven bitval = 8; 8 voor 8 bits timers 0 en 2, 1024 voor timer 1 byte
setocroa=(16000000/(freq*bitval)) - 0,5;
De waarde van de setocroa vereist een aftrekken van -1. Echter toe te voegen 0,5 afgerond op de dichtstbijzijnde 0,5
De resolutie van de timer is beperkt
Uiteindelijk bepaald door de omvang van bitval
cli(); interrupts uitschakelen
set timer2 interrupt
TCCR2A = 0; hele TCCR2A register ingesteld op 0
TCCR2B = 0; hetzelfde voor TCCR2B
TCNT2 = 0; initialiseren van de waarde van de teller op 0
set vergelijk wedstrijd registreren voor stappen van de frequentie (hz)
OCR2A = setocroa; = (16 * 10 ^ 6) / (frequentie * 8) - 1 (moet < 256)
CTC-modus inschakelen
TCCR2A | = (1 << WGM21); CS21 bit ingesteld voor 8 prescaler
TCCR2B | = (1 << CS21); inschakelen van de timer vergelijk interrupt
TIMSK2 | = (1 << OCIE2A); Dit werkt, zoals de volgende regel
SBI(TIMSK2,OCIE2A); interrupt timer 2 inschakelen
Sei(); inschakelen interrupts
.
Kritische lezers zullen hebben opgemerkt sbi(TIMSK2,OCIE2A)
Ik setup een paar (verworven) internetfuncties bij instellen en het opschonen van register bits:
Definieert voor het ontruimen van register bits
#ifndef cbi
#define cbi (sfr, bit) (_SFR_BYTE(sfr) & ~_BV(bit)) =
#endif
Definieert voor de beetjes van het register van de instelling
#ifndef sbi
#define sbi (sfr, bit) (_SFR_BYTE(sfr) | = _BV(bit))
#endif
Deze functies bieden een gemakkelijk gesprek naar instellen of wissen van de interrupt.
.
Dus de interrupt wordt uitgevoerd, wat kunnen we maken het doen?