AVR Assembler Övningsexempel 7 (7 / 12 steg)

Steg 7: Skriva avbrottshanterare

I det sista steget såg vi att vi har inrättat det så att en stigande kant upptäckt på PD2 utlöser en analog till digital konvertering på PC0 och när konverteringen är klar kommer det att kasta ett ADC konvertering komplett avbrott. Nu vill vi göra något med detta avbrott.

Om du undersöker tabell 12-6 på sidan 65 visas en lista över möjliga avbrotten. Vi har redan sett på RESET avbryta på adress 0x0000 och Timer/Counter0 Overflow avbrottet på adress 0x0020 i föregående Tutorials. Nu vill vi titta på är ADC avbrottet som vi ser i tabellen på adress 0x002A. Så i början av vår assembler kod behöver vi en rad som lyder:

.org 0x002A
rjmp ADC_int

som hoppar till våra avbrottshanterare märkt ADC_int när ADC har avslutat en konvertering. Så hur ska vi skriva vår avbrottshanterare?

Det sätt som ADC fungerar är genom att utföra följande beräkning:

ADC = Vin x 1024 / Vref

Låt oss se vad som händer om jag trycker på "återuppringning"-knappen på knappsatsen. I så fall spänningen på PC0 ändras till något värde, säger 1.52V, och eftersom Vref vid 5V får vi:

ADC = (1.52V) x 1024 / 5V = 311.296

och så det skulle dyka upp som en 311. Om vi ville konvertera den tillbaka till en spänning skulle vi bara vända beräkningen. Vi behöver inte göra detta men sedan vi är inte intresserade av de faktiska spänningarna bara i att skilja mellan dem.

När konverteringen är klar, resultatet lagras i ett 10-bitars tal i ADCH och ADCL register och vi ha lett till att vara "vänster justerad" vilket innebär att de 10 bitarna börjar på bit 7 ADCH och gå ner bit 6 av ADCL (det finns 16 bitar totalt i dessa två register och vi använder endast 10 av dem dvs 1024 kanaler). Vi kunde ha resultatet "rätt justerad" om vi ville genom att avmarkera ADLAR bet i ADMUX register. Anledningen väljer vi lämnade är justerat att våra signaler är tillräckligt långt ifrån varandra att de två sista siffrorna i kanalnumret inte är relevanta och förmodligen bara buller så vi kommer att skilja knapptryckningar använder endast de övre 8 siffrorna, med andra ord, vi behöver bara titta på ADCH att lista ut vilken knapp trycktes.

Så våra avbrottshanterare bör helt enkelt läsa numret ur ADCH registret, konvertera nummer till en knappsats värde, och sedan skicka detta värde till våra register analyzer lysdioder så att vi kan kontrollera att skjuta en "9" säger, kommer att orsaka lampa motsvarar "00001001" att lysa upp.

Innan vi gå så långt men vi måste först se vad dyker upp i ADCH när vi trycka på de olika knapparna. Så låt oss bara skriva en enkel avbrottshanterare som bara skickar innehållet i ADCH till analyzer displayen.

Så är här vad vi behöver:

ADC_int:
LDS analyzer, ADCH, ladda värdet av ADCH i vår analyzer
SBI EIFR, 0; tydliga yttre mellanjobb flaggan så att den är redo att gå igen
Reti

Vid det här laget bör du kunna bara kopiera koden från våra analyzer i handledning 5 och lägga till detta avbrott och växla inställningar och köra den.

Övning 2: Skriva koden och köra den. Se att du får ADCH visning på skärmen analyzer. Försök trycka samma knapptryckning flera gånger. Får du alltid samma värde i ADCH?

Se Steg
Relaterade Ämnen

AVR Assembler Övningsexempel 9

Välkommen till Övningsexempel 9.Idag kommer vi att visa hur du kan styra både 7-segment display och en 4-siffrig display med våra ATmega328P och AVR assembler kod. I samband med detta får vi ta omvägar till hur du använder stacken för att minska anta...

AVR Assembler Övningsexempel 4

Välkommen till tutorial nummer 4!I den här guiden kommer vi att bygga en krets som kommer att simulera rullning av två tärningar. Sedan kommer vi först skriva en brute force-program som gör jobbet. Sedan kommer vi förenklar det programmet på olika sä...

AVR Assembler handledning 11

Välkommen till handledning 11!I den här korta guiden kommer vi slutligen att bygga den första delen av vårt sista projekt.Det första du bör göra är att gå till det allra sista steget i denna tutorial och titta på videon. Sedan komma tillbaka hit. [pa...

AVR Assembler Tutorial 1

Jag har beslutat att skriva en serie tutorials om hur man skriver assembler program för den Atmega328p som är mikrokontroller används i Arduino. Om människor förblir intresserad fortsätter jag att lägga ut en en vecka eller så tills jag får slut på l...

AVR Assembler handledning 6

Välkommen till Tutorial 6!Dagens handledning kommer att vara kort där vi kommer att utveckla en enkel metod att kommunicera data mellan en atmega328p och en med två portar ansluta dem. Vi kommer ta sedan tärningarna rullen från läraren 4 och registre...

AVR Assembler handledning 8

Välkommen till Tutorial 8!I denna kort tutorial ska vi ta lite av en skenmanöver från att införa nya aspekter av assembler programmering att visa hur man flytta våra prototyper komponenter till ett separat "tryckta" kretskort. Anledningen är att...

AVR Assembler Tutorial 2

Denna handledning är en fortsättning på "AVR Assembler Tutorial 1"Om du inte har gått igenom Tutorial 1 bör du sluta nu och göra att man först.I den här guiden kommer vi fortsätta vår studie av assembler programmering av den atmega328p som använ...

AVR Assembler handledning 10

Välkommen till handledning 10!Ledsen att det tog så lång tid för att få denna nästa avbetalning ut men detta är en ganska hektisk tid på året. I alla fall, är här det!Vi har kommit långt och du förmodligen redan är kompetenta nog att skriva många int...

AVR Assembler handledning 5

Idag kommer vi att ta en närmare titt på de olika minnesplatserna i Atmega328p mikrokontroller och se om vi bättre kan förstå hur saker lagras, där de lagras och hur pekare och uppslagstabeller fungerar.Handledningen kommer att delas upp i två delar....

AVR Assembler handledning 3

Välkommen till tutorial nummer 3!Innan vi börjar vill jag göra en filosofisk punkt. Inte vara rädd för att experimentera med kretsar och den kod som vi konstruerar i dessa tutorials. Ändra sladdar runt, lägga till nya komponenter, ta komponenter ut,...

Utveckling styrelsen för Attiny84 mikrokontroller

Detta är en utveckling styrelse för Attiny84 mikrokontroller. Tha Attiny84 chip har 11 pins adresserbara med Arduino IDE, 8k flashminne för lagring av program och 512 byte ram tillgängligt för variablerna stack och program.En funktion av den Attiny84...

Hur man ladda program till en Arduino UNO från Atmel Studio 7

I denna korta Instructable kommer vi att lära sig att ladda ett program till en Arduino UNO ombord med Atmel Studio istället för Arduino IDE. Detta är användbart när du behöver utveckla ett program med fler advance funktioner eller på ett annat språk...

MRETV - Video, ljud och mycket mer från en standard Arduino!

MRETV - Video, ljud och mycket mer från en standard Arduino!Nu uppdaterad för Arduino 1.6.6 November 2015!Använd endast två resistorer och två dioder för att generera full skärm video. Text 47 x 29 8 x 8 tecken, dubbla vertikala upplösningen (47 x 57...

Enklaste AVR parallell port programmerare

Hej, är detta min första instructables, som handlar om avr programmerare. Detta är den enklaste krets med vilka AVR (Atmega serie, Attiny serien, AT90S serien) microcontrollers kan programmeras. Det finns en hel del programmerare, men detta är enkel...

Älskling, jag krympte Arduino: flytta från Arduino till ATtiny och skriva din kod i ren AVR-C

Arduino är en stor hård- och mjukvaruplattform, men med alla dess funktioner är det också lite uppsvälld och ofta behöver du bara en liten del av alla funktioner. Projektet kräver ibland för att ha mindre och billigare enheter. Vad du behöver är ATti...

Mitt svar på WS2811 med en AVR sak

första off - vill sägaBra om du Alan Burlison.Detta är inte menat att uppsamlare du på något sätt. Din kod gjorde det det måste göra. Stor framgång. Min första reaktion i en forum kommentar var faktiskt riktat mot folk som när det gäller icke-arbetan...

Fattig mans AVR speldosa

detta är en enkel AVR speldosa, kostar ca 10$ för att bygga.DISCLAIMER: Detta projekt är vad man skulle kalla en SMOP, "en enkel fråga om programmering". Det innebär att det är av trivial komplexitet men långa... så om du kan tolerera tristess i...

Montering av Dragon Rider 500 för användning med AVR Dragon

inte länge sedan företaget Atmel kom ut med ett bra verktyg för användning med AVR microcontrollers kallas AVR Dragon. Denna lilla USB-enhet ger proffs och amatörer både förmågan att använda: I System programmering (ISP), JTAG, felsöka tråd och hög s...

16-nyckel knappsatsen avkodning med en AVR MCU

detta instructable visar dig hur gränssnittet en 16-nyckel knappsats till din AVR microcontroller och läsa nyckeln när en tangent är nedtryckt. Jag ska presentera knappsatsen först, sedan 74HC922 16-nyckel dekodern IC som pin-saving mekanism, sedan s...