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).

Se Steg
Relaterade Ämnen

Arduino kitchen timer med en introduktion till timer avbryter

Välkommen till min första instructable,Jag beslöt att göra ett ganska enkla projekt för att ange instructable värld. Detta projekt handlar om att göra en enkel kitchen timer med en Arduino Uno. Således kommer jag ge en liten introduktion 2.2" tft dis...

Timer avbryter på DP32

Timers! Jag är glada att äntligen att täcka timers på min favorit ombord, DP32!Kom ihåg vägen tillbaka när jag skrev om externa avbrott? Om inte du är bekant med avbrott och hur de fungerar, rekommenderar jag att kontrollera denna tutorial ut först....

Arduino Time-Lapse Controller

detta projekt som ursprungligen började med några enkla delar kastas tillsammans för att skapa en mycket enkel time-lapse controller för en DSLR-kamera. När jag var nöjd med den första prototypen, ville jag göra en slutlig version som planeringen av...

Använd Timer avbryta på pcDuino

Timer avbrott kan du utföra en aktivitet på mycket specifikt tidsinställdaintervall oavsett vad som händer i din kod.Steg 1: Steg 1: använda timer avbrott på pcDuinoNär pcDuino kör Ubuntu, som är en version av Linux, Linuxger en timer mekanism, som ä...

Jontofores kontrolleras av arduino timer

DIY Jontofores enhet drivs av Arduino med timerfunktiondessa enheter kommer att ha en polaritet switch på det inställda tidsintervallet (ON och OFF).Steg 1: bakgrund HISTORIA:Hyperhidros är det tillstånd som kännetecknas av onormalt ökad svettning, [...

Göra en Arduino timer

Hi, så jag och min kompis sätter upp så att vi kan göra PCB´s. Vi för närvarande gör en UV exponering låda (eventuellt annan instrucable) och för detta rutan, vi behövde en timer, så detta är vad vi har gjort hittills och vad vi ska göra.Detta projek...

Arduino Timer

Hej alla, detta instructable handlar om hur man bygger ett stoppur / Timer med Arduino.Dragen av denna Timer: (kolla mer i djup Detaljer hur du använder dessa funktioner i "Kod/skiss" avsnitt1. du kan ange ett tidsmål för en händelse och också k...

STM32F103 Timer avbryta (med Keil och STMCubeMX)

I denna tutorial kommer jag Visa användning av avbrott med timers.Avbrottet är helt enkelt för att växla LED på vår STM32 styrelse.Denna handledning är uppdelad i tre steg:Steg 1: Skapa projekt i STM32CubeMXSteg 2: Programmering i KeilSteg 3: Visuali...

Arduino Time-Lapse Panorama Controller

Panorama Controller för GoPro kamerorStyrenheten kommer att rotera din GoPro över en set vinkel för en uppsättning varaktighet eller roterar du GoPro för full rotation för en uppsättning varaktighet.Detta projekt bygger på ursprungliga instructable m...

Arduino - Time BOMB Airsoft använder KYX 5461AS 4-siffriga 7 segment Display

Hej världen! Idag gjorde jag en enkel bomb med en 4 siffrig 7 segment Display (produkt nummer: KYX 5461AS). Det är mycket enkelt och igen kan användas för flera saker naturligtvis! Du utlösa det med en knapp, återställs automatiskt med watchog. AVR/W...

Arduino Vocal effekter Box

Detta Arduino-powered vocal effekter box pitch skiftar och snedvrider inkommande ljudsignalerna att producera ett brett utbud av vocal effekter. Detta projekt är min första experiment med realtid digital signalbehandling med Arduino. Det tar prov en...

3 kanal-Dimmer/fader för Arduino eller andra microcontroller

I ett tidigare instructable jag fram en enkel AC TRIAC-fader/dimmer som kan styras med en Arduino. I olika reaktioner jag fick, uttryckte ett antal personer sitt intresse för en 3 kanalfadern RGB. Men eftersom jag inte har sett några resultat av dess...

Arduino kontrollerade ljus dimmer

Varning: Vissa människor försöka bygga detta med en optocoupler med zerocrossing coz "som är bättre" rätt? Vissa får även höra i elektronik butiker är det bättre att använda sådan optocoupler. FEL. Detta fungerar endast med en random brand optoc...

Arduino hem basket Hoop poäng Detection System aka ScoreKeeper

Min lillasyster och jag hittade denna inomhus basket hoop (bilden ovan) på en container för några veckor sedan. Vi kom hem från kyrkan precis som två personer lossning det från sin lastbil. Vi beslutade att ta tag i det, tillsammans med tabellen air...

Arduino för växthusgaser, trädgården eller Growbox / uppdaterad April 2016

Jag har använt Attiny marker för bevattning uppgifter i min trädgård, men har planer på att bygga ett växthus, en Arduino tycktes vara vägen att gå eftersom det har fler portar. Jag vet, det finns många "Garduino" typ projekt redan, inklusive tw...

PIR rörelsedetektor med Arduino: Drivs på lägsta energiläge som konsumtion

Denna video visar snabbt och lätt strategi för att minska energiförbrukningen för ATMEGA 328P baserade Arduino styrelser med cirka 70-75% med PIR eller PID sensorer för rörelsedetektering.Detta projekt införs efter saker-1) gränssnitt Pyroelectric/Pa...

Från Arduino och perfboard att PCB med fristående MCU

Detta Instructable är en direkt efterföljare av denna. I slutet av detta bygga upp är min skivspelare projekt nästan klar (äntligen).Målet är att utveckla en snygg och arbetar PCB med SMD elektronisk med en arbetande ATtiny85 + programvara!Så är det...

Skicka och ta emot MIDI med Arduino

Detta instructable visar dig hur du använder en Arduino att skicka och ta emot en mängd olika MIDI-meddelanden så att du kan börja bygga din egen MIDI-controllers och instrument. Första jag ska prata lite om MIDI-protokollet, om du bara letar exempel...

Förbättrad Arduino Rotary Encoder behandlingen

Roterande pulsgivare är stor indataenheter för elektronik projekt - förhoppningsvis detta Instructable kommer att inspirera och hjälpa dig att använda en i ditt nästa projekt.Varför skriva rotationsencoder kod?Jag ville använda en låg kostnad rotatio...