In dit deel van de tutorial die we over interrupts praten zullen werken bijvoorbeeld met behulp van de teller. Interrupts verbeteren het gebruik van microcontrollers in een enorme manier. Interrupts maken uw programma's reageren op de hardware van de microcontrollers, die mogelijk een reactie van het circuit buiten de microcontroller.
In gewone woorden is een interrupt precies wat het als wordt beweerd. Het onderbreekt een normale lopende programmeerstroom om een andere taak (andere codeblok dat u program). Zeg bijvoorbeeld uw programma doet normale flikkerende LEDs en u wilt reageren op een PIR-sensor (aangesloten op een interrupt-pin), en gaat naar een speciale codeblok om een pieptoon uit een zoemer aangesloten op een andere pin. Als u de microcontroller om dit te doen vertellen, stopt het programma dood en ga naar de code die bij de interrupt (Maak een pieptoon hoort). Na interruptcode wordt uitgevoerd, wordt het gestopt programma hervat precies waar deze was gebleven. Interrupts zou enkele voorbeelden, een alternatief voor polling, waarbij programma cycli. Zeggen dat uw programma is te willen alleen pieptoon wanneer iemand de PIR-sensor passeert. Uw programma kan blijven testen die pin om te zien of het een hoge lezing over en binnen de nooit eindigende lus (terwijl (1)). Ook het verwijderen van de polling-programma-code om te testen de pin voor een hoge lezing en de interrupt automatisch overgaan tot de geluidscode wanneer de microcontroller de hoge lezing zintuigen toestaan.
Welke soorten interrupts zijn beschikbaar voor de AVR microcontroller? Interrupts kunnen worden vastgesteld voor de manifestaties van een teller-nummer, een pin staat (van laag naar hoog of vice versa) seriële communicatie ontvangst van informatie, of de analoog naar digitaal vaststellende een conversie wijzigen. Hier is een lijst van interrupt vectoren die u kunt gebruiken. Andere tutorials zal maken gebruik van veel van deze vectoren.
We gaan de timer/teller gebruiken als voorbeeld. Zullen we de timer/teller een getal dat de TCNT1 (de teller) moet overeenkomen. Het nummer aan zal gaan in een register genaamd OCR1A (Output vergelijken registreren). De "1" staat voor de specifieke prestatiemeter we gebruiken de 16-bits versie. We hebben twee OCRs, de A en de B. Voor dit voorbeeld zullen we A gebruiken. Maar weten we als de teller wordt teruggezet op nul wanneer de wedstrijd is gemaakt? Wij willen zeker de TCNT1 terug te gaan naar nul dus de telling zal beginnen en krijgen we een andere wedstrijd op onze beoogde nummer, maar dit niet gedaan in code zoals we vorige keer deden (Vergeet niet de TCNT1 = 0;). Ditmaal willen we een ander zet in het TCCR1B control register genaamd WGM12 (golfvorm generatie modus voor timer 1). De #2 in die switch vertegenwoordigt enkel welke WGM is, aangezien er een paar. We zullen ook gebruiken de CS10 en CS11 opnieuw instellen van de prescaling tot 64 zoals in het intro van timers video.
Dan zal de timer/teller moet weten dat we van plan om de interrupt-functie te gebruiken. Dit wordt gedaan door de TIMSK (Timer/teller onderbreken masker registreren). We moeten alleen een zet in dit register: de OCIE1A (Output vergelijken A Match Interrupt Enable) schakelaar. Zodra de nummer zetten in de OCR1A wordt geëvenaard door de teller, zal het programma worden onderbroken om te schakelen van de LED. Voor een interrupt gebeuren, zullen we om de wereldwijde interrupts "sei()", dan zullen we om de interrupt voor de timer/teller en tot slot de interrupt service routine (ISR) zal moeten worden gemaakt. De interrupt service routine is net als de functies die zijn aangebracht in de knop spel voorbeeld. De interrupt service routine is gewoon een codeblok buiten de belangrijkste routine en begint met ISR met de vector binnen de haakjes "(vector)", toegestaan door het codeblok haakjes "{Code}". Voor de timer/teller (16-bits versie), en het feit dat we met behulp van de A-versie van de OCR1, de naam van de vector is: TIMER1_COMPA_vect. Dus de routine zou: ISR(TIMER1_COMPA_vect) {code uit te voeren}. We gebruikten een nummer in de intro van timers video die vertegenwoordigd een seconde: 15625, dus we gebruik van deze een voor de OCR1A maken zullen. Maar het nummer moet overwegen indexeren van 0, dus zullen we het aantal 15624 in plaats daarvan gebruiken.