Arduino Timer avbryter (2 / 6 steg)
Steg 2: Strukturera Timer avbryter
Timer inställningskod görs i funktionen setup() {} i en Arduino skiss.
Kod delaktiga för att ställa in timer avbrott är lite skrämmande att se på, men det är faktiskt inte så svårt. Jag ganska mycket bara kopiera samma huvudsakliga bit av koden och ändra prescaler och jämföra match register för att ställa in rätt avbryta frekvens.
Den huvudsakliga strukturen i den avbryta setup ser ut så här:
void setup() {
(CLI); //stop avbrott
Set timer0 avbrott på 2kHz
TCCR0A = 0; / / Ställ in hela TCCR0A register till 0
TCCR0B = 0; / / samma för TCCR0B
TCNT0 = 0; //initialize värde till 0
Set jämför match registrera för 2khz steg
OCR0A = 124; / / = (16 * 10 ^ 6) / (2000 * 64) - 1 (måste vara < 256)
Aktivera CTC läge
TCCR0A | = (1 << WGM01);
Ange CS01 och CS00 bitar för 64 prescaler
TCCR0B | = (1 << CS01) | (1 << CS00);
Aktivera timern jämför avbrott
TIMSK0 | = (1 << OCIE0A);
Ställ in timer1 avbrott vid 1Hz
TCCR1A = 0; / / Ställ in hela TCCR1A register till 0
TCCR1B = 0; / / samma för TCCR1B
TCNT1 = 0; //initialize värde till 0
Set jämför match registrera för 1hz steg
OCR1A = 15624; / / = (16 * 10 ^ 6) / (1 * 1024) - 1 (måste vara < 65536)
Aktivera CTC läge
TCCR1B | = (1 << WGM12);
Anger CS10 och CS12 bitar för 1024 prescaler
TCCR1B | = (1 << CS12) | (1 << CS10);
Aktivera timern jämför avbrott
TIMSK1 | = (1 << OCIE1A);
Set timer2 avbrott på 8kHz
TCCR2A = 0; / / Ställ in hela TCCR2A register till 0
TCCR2B = 0; / / samma för TCCR2B
TCNT2 = 0; //initialize värde till 0
Set jämför match registrera för 8khz steg
OCR2A = 249; / / = (16 * 10 ^ 6) / (8000 * 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);
SEI (); //allow avbrott
} //end setup
Märke hur värdet på OCR #A (jämför match värdet) ändras för varje av dessa timer inställningar. Som förklaras i det sista steget, har detta beräknats enligt följande ekvation:
Jämför match register = [16.000, 000Hz / (prescaler * önskat avbrott frekvens)] - 1
kom ihåg att när du använder timers 0 och 2 detta nummer måste vara mindre än 256 och mindre än 65536 för timer1
Också märka hur uppställningar mellan tre timers skiljer sig något i den linje som vänder på CTC-läge:
TCCR0A | = (1 << WGM01); //for timer0
TCCR1B | = (1 << WGM12); //for timer1
TCCR2A | = (1 << WGM21); //for timer2
Detta följer direkt från databladet för ATMEL 328/168.
Slutligen notera hur inställningen för prescalers följande tabellerna i det sista steget (tabellen för timer 0 upprepas ovan),
TCCR2B | = (1 << CS22); Ställ in CS #2 bitar för 64 prescaler för timer 2
TCCR1B | = (1 << CS11); Ställ in CS #1 bit för 8 prescaler för timer 1
TCCR0B | = (1 << CS02) | (1 << CS00); Anger CS #2 och CS #0 bitar för 1024 prescaler för timer 0
Märka i det sista steget att det finns olika prescaling för olika timers. Timer2 har till exempel inte alternativet i 1024 prescaler.
De kommandon du vill köra under dessa timer avbrott är belägna i den Arduino skiss inkapslade i följande:
ISR(TIMER0_COMPA_vect) {//change 0 till 1 för timer1 och 2 för timer2
avbryta kommandon här
}
Denna bit av koden bör vara placerade utanför funktionerna setup() och loop(). Försök också att hålla rutinen avbrott så kort som möjligt, särskilt om du är att avbryta på en hög frekvens. Det kan även vara värt att ta itu med portar/stiften av ATMEL chip direkt istället för att använda funktionerna digitalWrite() och digitalRead(). Du kan hitta mer info om det här.
Exempel-den följande skissen ställer in och kör 3 timer avbrott:
timer avbryter
av Amanda Ghassaei
Juni 2012
/*
* Detta program är fri programvara; Du kan vidaredistribuera det och/eller ändra
* det enligt villkoren i GNU General Public License som offentliggjorts av
* den Free Software Foundation; antingen version 3 av licensen, eller
* (på ditt alternativ) någon senare version.
*
*/
timer inställning för timer0, timer1 och timer2.
För arduino uno eller någon ombord med ATMEL 328/168... Diecimila duemilanove, lilypad, nano, mini...
denna kod kommer att aktivera alla tre arduino timer avbrott.
timer0 kommer att avbryta på 2kHz
timer1 kommer att avbryta vid 1Hz
timer2 kommer att avbryta på 8kHz
lagring variabler
booleska toggle0 = 0;
booleska toggle1 = 0;
booleska toggle2 = 0;
void setup() {
ställa in stift som utgångar
pinMode (8, OUTPUT);
pinMode (9, OUTPUT);
pinMode (13, OUTPUT);
(CLI); //stop avbrott
Set timer0 avbrott på 2kHz
TCCR0A = 0; / / Ställ in hela TCCR2A register till 0
TCCR0B = 0; / / samma för TCCR2B
TCNT0 = 0; //initialize värde till 0
Set jämför match registrera för 2khz steg
OCR0A = 124; / / = (16 * 10 ^ 6) / (2000 * 64) - 1 (måste vara < 256)
Aktivera CTC läge
TCCR0A | = (1 << WGM01);
Ange CS01 och CS00 bitar för 64 prescaler
TCCR0B | = (1 << CS01) | (1 << CS00);
Aktivera timern jämför avbrott
TIMSK0 | = (1 << OCIE0A);
Ställ in timer1 avbrott vid 1Hz
TCCR1A = 0; / / Ställ in hela TCCR1A register till 0
TCCR1B = 0; / / samma för TCCR1B
TCNT1 = 0; //initialize värde till 0
Set jämför match registrera för 1hz steg
OCR1A = 15624; / / = (16 * 10 ^ 6) / (1 * 1024) - 1 (måste vara < 65536)
Aktivera CTC läge
TCCR1B | = (1 << WGM12);
Anger CS12 och CS10 bitar för 1024 prescaler
TCCR1B | = (1 << CS12) | (1 << CS10);
Aktivera timern jämför avbrott
TIMSK1 | = (1 << OCIE1A);
Set timer2 avbrott på 8kHz
TCCR2A = 0; / / Ställ in hela TCCR2A register till 0
TCCR2B = 0; / / samma för TCCR2B
TCNT2 = 0; //initialize värde till 0
Set jämför match registrera för 8khz steg
OCR2A = 249; / / = (16 * 10 ^ 6) / (8000 * 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);
SEI (); //allow avbrott
} //end setup
ISR(TIMER0_COMPA_vect) {//timer0 avbrott 2kHz växlar stift 8
genererar puls våg av frekvensen 2kHz/2 = 1 kHz (tar två cykler för full wave-växla hög sedan växla låg)
om (toggle0) {
digitalWrite(8,HIGH);
toggle0 = 0;
}
annat {
digitalWrite(8,LOW);
toggle0 = 1;
}
}
ISR(TIMER1_COMPA_vect) {//timer1 avbrott 1Hz växlar stift 13 (LED)
genererar puls våg av frekvensen 1Hz/2 = 0,5 kHz (tar två cykler för full wave-växla hög sedan växla låg)
om (toggle1) {
digitalWrite(13,HIGH);
toggle1 = 0;
}
annat {
digitalWrite(13,LOW);
toggle1 = 1;
}
}
ISR(TIMER2_COMPA_vect) {//timer1 avbrott 8kHz växlar pin 9
genererar puls våg av frekvens 8kHz/2 = 4 kHz (tar två cykler för full wave-växla hög sedan växla låg)
om (toggle2) {
digitalWrite(9,HIGH);
toggle2 = 0;
}
annat {
digitalWrite(9,LOW);
toggle2 = 1;
}
}
void loop() {
göra andra saker här
}
Bilderna ovan visar produktionen från dessa timer avbrott. Fig 1 visar en fyrkantsvåg pendlande mellan 0 och 5V vid 1kHz (timer0 avbrott), fig 2 visar LED bifogas pin 13 vrida på för en sekund sedan vändningen bort för en sekund (timer1 avbrott), fig 3 visar en puls våg pendlande mellan 0 och 5V en frekvens på 4khz (timer2 avbrott).