Stap 2: Structurering van Timer Interrupts
Code van de verzoekinstellingen timer wordt gedaan binnen de functie {} Setup in een schets van de Arduino.
De code voor het opzetten van timer interrupts betrokken is een beetje ontmoedigend om te kijken, maar het is eigenlijk niet zo moeilijk. Ik vrijwel alleen het dezelfde belangrijkste stuk van code kopiëren en wijzigen van de prescaler en vergelijk wedstrijd registreren als u wilt instellen van de juiste interrupt-frequentie.
De hoofdstructuur van de interrupt setup ziet er zo uit:
Ziet u hoe de waarde van OCR #A (de vergelijk matchpercentage) gewijzigd voor elk van deze timer-opstellingen. Zoals uiteengezet in de laatste stap, was dit berekend volgens de volgende vergelijking:
Vergelijk wedstrijd register = [16.000, 000Hz / (prescaler * gewenst interrupt-frequentie)] - 1
Onthoud dat als u timers 0 en 2 dit nummer minder dan 256, en minder dan 65536 voor timer1 moet
Merk ook op hoe de opstellingen tussen de drie timers verschillen enigszins in de lijn die de CTC modus ingeschakeld:
TCCR0A | = (1 << WGM01); //for-timer0
TCCR1B | = (1 << WGM12); //for timer1
TCCR2A | = (1 << WGM21); //for-timer2
Dit volgt rechtstreeks uit het gegevensblad van de ATMEL 328/168.
Ten slotte, merk op hoe de instelling voor de prescalers volgt de tabellen in de laatste stap (de tabel voor timer 0 wordt herhaald boven),
TCCR2B | = (1 << CS22); Set CS #2 bits voor 64 prescaler voor timer 2
TCCR1B | = (1 << CS11); Set CS #1 bit voor 8 prescaler voor timer 1
TCCR0B | = (1 << CS02) | (1 << CS00); CS #2 en CS #0 bits ingesteld voor 1024 prescaler voor timer 0
Merken in de laatste stap zijn er verschillende opties voor de verschillende timers prescaling. Timer2 heeft bijvoorbeeld niet de optie van 1024 prescaler.
De opdrachten die u wilt uitvoeren tijdens deze timer interrupts bevinden zich in de Arduino schets ingekapseld in het volgende:
ISR(TIMER0_COMPA_vect) {//change de 0-1 voor timer1 en 2 voor timer2
Interrupt opdrachten hier
}
Dit codefragment moet buiten de Setup en loop functies zich bevinden. Ook, probeer te houden van de interrupt routine zo kort mogelijk te houden, vooral als u op een hoge frequentie zijn onderbreken. Het kan zelfs waard het aanpakken van de poorten/pinnen van de ATMEL chip rechtstreeks in plaats van het gebruiken van de functies digitalWrite() en digitalRead() zijn. Hier vindt u meer info over dat hier.
Voorbeeld-de volgende schets stelt en voert 3 timer interrupts:
//timer interrupts //by Amanda Ghassaei //June 2012
De afbeeldingen hierboven tonen de output van deze timer interrupts. Fig 1 toont een blokgolf schommelen tussen 0 en 5 v bij 1kHz (timer0 interrupt), Fig. 2 toont de LED aangesloten op pin 13 inschakelen voor één seconde dan uitschakelen gedurende één seconde (timer1-interrupt), fig 3 toont een pols golf schommelen tussen 0 en 5 v met een frequentie van 4khz (timer2 interrupt).