Början Microcontrollers del 12: Intro till avbryter
I denna del av handledningen vi prata om avbrott arbeta till exempel med räknaren. Avbryter förbättra mikrokontroller i stort sätt. Avbryter göra din program reagerar på hårdvaran i microcontrollers, vilket kan vara en reaktion från circuit utanför mikrokontroller.
I grundläggande termer är ett avbrott precis vad det står som. Det avbryter en normal rinnande programflöde för att göra en annan (andra kodblock som du programmera). Säg till exempel din program gör normala blinkande lysdioder och du vill att den ska reagera på en PIR-sensor (ansluten till en avbryta pin), och går till en speciell kodblock att göra ett pip från en Summer ansluten till en annan PIN-kod. Om du berätta microcontroller att göra detta, kommer att det sluta döda och gå till den kod som tillhör avbrottet (göra ett pip). Efter avbrottskod körs, återupptar stoppat programmet just där den slutade. Några exempel, skulle avbryter vara ett alternativ till vallokalerna, vilket skulle kräva program cykler. Säga din program vill bara ett pip när någon passerar PIR-sensorn. Ditt program kunde hålla provning att stiftet för att se om den har en hög läsning om och om igen i en aldrig sinande slinga (samtidigt (1)). Alternativt kan du ta bort alla polling programkoden för att testa PIN-koden för en hög läsning och tillåta avbrottet att automatiskt komma till Pipkoden när mikrokontroller känner av det höga värdet.
Vilka typer av avbrott finns det AVR mikrokontroller? Avbrott kan fastställas för händelser såsom en räknares nummer, en PIN-kod ändrar tillstånd (från låg till hög eller tvärtom) seriell kommunikation vid mottagning av information eller Analog till Digital efter att ha fastställt en konvertering. Här är en lista av avbrott vektorer som du kan använda. Andra tutorials kommer att använda för många av dessa vektorer.
Vi kommer att använda timer/counter som ett exempel. Vi berättar timer/counter ett nummer som TCNT1 (disk) måste du matcha. Numret för att matcha kommer att gå in i ett register som kallas OCR1A (Output jämföra Register). "1" representerar specifika disk vi använder som är 16-bitars version. Vi har två OCRs, A och B. Vi kommer att använda A för detta exempel. Men vet vi om räknaren återställs till noll när matchen görs? Vi vill absolut TCNT1 att gå tillbaka till noll så räkningen kommer att börja om och vi får en annan match på vår planerade nummer, men detta är inte gjort i kod som vi gjorde förra gången (kom ihåg TCNT1 = 0;). Den här gången, vi kommer vilja slå på en annan switch i TCCR1B kontroll register kallas WGM12 (vågform Generation läge för timer 1). #2 i denna switch representerar bara som det är, eftersom det finns några WGM. Vi kommer också att använda CS10 och CS11 igen ställa prescaling till 64 som i introt till timers video.
Timer/counter måste veta att vi avser att använda funktionen avbrott. Detta sker genom TIMSK (Timer/Counter avbryta Mask Register). Vi behöver bara slå på en switch i detta register: OCIE1A (Output jämföra A Match avbryta aktiverar) switch. När den antal satt in OCR1A motsvaras av räknaren, kommer att programmet avbrytas för att växla LED. För ett avbrott till hända, vi måste du aktivera de globala avbrott "sei()", då vi måste du aktivera avbrottet för timer/counter och slutligen avbrottstjänstens rutin (ISR) behöver skapas. Avbrottstjänstens rutin är precis som de funktioner som gjordes i knapp spel exempel. Avbrottstjänstens rutin är bara ett kodblock utanför den huvudsakliga rutinen och börjar med ISR med vektorn inom parentes "(vektor)", tillåts av kodblocket inom parentes "{kod}". För timer/counter (16-bitars version), och det faktum att vi använder en version av OCR1, vektor namnet är: TIMER1_COMPA_vect. Så rutin skulle vara: ISR(TIMER1_COMPA_vect) {kod att köra}. Vi använde flera i introt till timers video som representerade en sekund: 15625, så vi kommer att använda detta en för OCR1A. Men antalet bör överväga indexering från 0, så vi kommer att behöva använda nummer 15624 istället.