Spela ljud-ljudfiler (wav) med en Arduino (8 / 9 steg)
Steg 8: Avbryt, avbryta...
Vi frekvens uppgifterna används för att skapa ett programavbrott vid, eller nära, krävs frekvensen.
Avbrottet kan inte alltid ställas in exakt, men det är tillräckligt. Hur ofta läsa från filen skickas till setintrupt-subrutin.
void setintrupt(float freq) {
flyta bitval = 8; 8 för 8-bitars timers 0 och 2, 1024 för timer 1 byte
setocroa=(16000000/(freq*bitval)) - 0,5;
Setocroa värdet kräver en subtraktion-1. Men att lägga till 0,5 avrundas till närmaste 0,5
Upplösningen på timern är begränsad
Slutligen bestäms av storleken på bitval
CLI(); Inaktivera avbrott
Set timer2 avbrott
TCCR2A = 0; satt hela TCCR2A register till 0
TCCR2B = 0; samma för TCCR2B
TCNT2 = 0; initiera counter värde till 0
Set jämför match register för frekvens (hz) steg
OCR2A = setocroa; = (16 * 10 ^ 6) / (frekvens * 8) - 1 (måste vara < 256)
Aktivera CTC läge
TCCR2A | = (1 << WGM21); Ange CS21 bit för 8 prescaler
TCCR2B | = (1 << CS21); Aktivera timern jämför avbrott
TIMSK2 | = (1 << OCIE2A); Detta fungerar, som gör följande rad
SBI(TIMSK2,OCIE2A); Aktivera avbrott på timer 2
SEI(); Aktivera avbrott
.
Kräsna läsare blir har fläckig sbi(TIMSK2,OCIE2A)
Jag setup ett par (internet förvärvade) funktioner för inställning och rensa registret bitar:
Definierar för att rensa registret bitar
#ifndef cbi
#define cbi (sfr, lite) (_SFR_BYTE(sfr) & = ~_BV(bit))
#endif
Definierar för inställningen register bitar
#ifndef sbi
#define sbi (sfr, lite) (_SFR_BYTE(sfr) | = _BV(bit))
#endif
Dessa funktioner ger ett lätt samtal att ställa in eller rensa avbrottet.
.
Så avbrottet är igång, vad kan vi göra det göra?