Stap 4: Interrupt routine / Timer 1
Deze schets biedt een voorbeeld van een interrupt routine. Je moet wel een beetje voorzichtig zijn niet te gebruiken een interrupt die al door de Arduino omgeving wordt gebruikt. TIMER0_0VF_vect wordt bijvoorbeeld gebruikt om te tellen milliseconden geretourneerd door millis(). De manier waarop ik gaan over het gebruik van een interrupt is eerst dat ik beslissen welke ik wilt gebruiken. Bijvoorbeeld, nood mij sommige code kan worden uitgevoerd op elke 5 tot 10 ms voor knop debouncing (Zie meer stap 5). De eenvoudigste manier om dit te doen is een overflow interrupt. Een timer zal continu draaien en elke keer als het krijgt op zijn maximale waarde en verschuif naar nul it veroorzaakt een overflow interrupt. Ik ging met Timer 1, een 16-bits timer. De snelheid van de processor is 16 MHz, 16-bits betekent het elke 65.536 teken zal overlopen. En 16,000,000/65.536 = 244 Hz, wat betekent dat een periode van 4.1 ms. Perfect voor mijn middelen, die we niet eens nodig een prescaler, opnieuw stap 5 Zie voor meer informatie. Het vertalen van een interrupt van de ATMega328
handmatige aan welke de Arduino omgeving wil is de volgende stap. De handleiding noemt het "TIMER1 OVF" en beschrijft het als "Timer/Counter1 Overflow". Het bestand (op mijn systeem) "C:\arduino-0022\hardware\arduino\bootloaders\stk500v2\avrinterruptnames.h" heeft een handige lijst van alle mogelijke interrupts. Het een "TIMER1_OVF_vect" ziet eruit als een wedstrijd en is wat ik ging met. Gewoon zoeken nu de bron van de Arduino voor het gebruik van dat interrupt (Notepad ++ is wat ik gebruik voor dit). U kunt de code, maar ik verklaar interrupt routines:
Signal(TIMER1_OVF_vect) {}
Interrupt service routine
}
Alles wat nodig is zijn een paar lijnen in de setup-routine:
TCCR1B = bit(CS10); geen prescaling
TIMSK1 = bit(TOIE1); overflow interrupt inschakelen
Verwijzen naar de ATMega328 handmatige voor beschrijvingen van het register.