AVR Assembler Övningsexempel 9 (5 / 7 steg)

Steg 5: Tryck 'n Pop



Det finns endast ett fåtal "allmänna ändamål registrerar" som vi har till vårt förfogande och när de används finns inte mer. Så det är bra namnge programmering praxis att bara använda dem för ett par variabler som används som tillfällig lagring som du behöver för att läsa från och skriva till, portar och SRAM med, eller annat som du kommer att behöva i subrutiner överallt och så du dem. Så vad jag har gjort, nu när vi har initierats och lära sig att använda stacken, är att gå igenom koden och hitta de namngivna generella journaler som används inom en enda subrutin eller avbrott och ingen annanstans i koden och ersätta dem med en av våra temp register och en push och pop till stacken. I själva verket, om du tittar på koden skriven för mindre microcontrollers, eller om du går tillbaka i tiden till när alla marker var mindre, ser du endast ett par generella register som hade att användas till allt, så du kunde inte bara lagra ett värde där och lämna den ensam sedan du var säker på att behöva detta register för andra saker. Så ser du pushin' och en Poppin ' överallt i koden. Kanske bör jag har heter våra temp generella register AX och BX som en respektfull kudos till de svunna dagarna.

Ett exempel kommer att göra detta mer tydligt.

Tillkännagivande att komplett avbrott ADC_int använder vi en generell i våra Analog till Digital konvertering registrerar att namnet vi har buttonH som vi brukade ladda värdet av ADCH och jämföra det med våra uppslagstabell för analog till knapp tryck på omvandlingar. Vi använder endast buttonH registret inom ADC_int subrutinen och ingen annanstans. Så istället kommer vi att använda våra variabel temp2 som vi använder som en tillfällig variabel som vi kan använda inom någon viss subrutin och dess värde inte kommer att påverka någonting utanför denna subrutin (dvs det värde vi ge det i ADC_int inte användas någon annanstans).

Ett annat exempel är i vår försening makro. Vi har ett register som vi har döpt "millisekunder" som innehåller våra fördröjning i millisekunder. I detta fall är det i ett makro och vi minns att vägs makro arbete är att assembler placerar hela koden till plats i programmet där det kallas. I det här fallet vill vi bli av med variabeln "millisekunder" och ersätta den med en av våra tillfälliga variabler. I detta fall kommer att jag göra det lite annorlunda för att visa dig hur även om värdet av variabeln kommer att behövas någon annanstans kan vi fortfarande använda det med hjälp av stacken. Så i stället för millisekunder använder vi "temp" och för att vi inte skruva upp andra saker som också används värdet för temp vi helt enkelt börjar makrot "delay" genom att "trycka" temp på stacken, då vi använder det i stället för millisekunder, och sedan i slutet av makrot vi "pop" sitt tidigare värde tillbaka från stacken.

Resultatet är att vi har "lånat" temp och temp2 för tillfälligt bruk och sedan återställt dem till deras tidigare värden när vi är färdiga.

Här är den ADC_int avbrott rutinen efter att ha gjort denna förändring:

ADC_int:
Tryck temp; rädda temp eftersom vi ändra den här
push temp2; Spara temp2
LDS temp2, ADCH; Ladda knapptryckning
LDI ZH,high(2*numbers)
LDI ZL,low(2*numbers)
CPI temp2, 0
breq avkastning. om buller utlösare inte ändrar 7segnumber
setkey:
LPM temp, Z +; Ladda från tabellen och bokföra ökning
CLC
CP temp2, temp; jämföra knapptryckning med tabellen
brlo PC + 4. om ADCH är lägre, försök igen
LPM 7segnumber, Z; annars ladda keyvalue tabell
Inc siffran. öka det fyrsiffriga numret
rjmp avkastning. och retur
adiw ZH:ZL, 1. Increment Z
rjmp setkey; och gå tillbaka till toppen
återkomst:
pop temp2; återställa temp2
pop härda; återställa temp
Reti

Observera att hur stacken fungerar är att först på är sist avstängd. Precis som en bunt med papper. Ser du att i våra två första raderna vi trycka på värdet av temp på stacken, då vi driva temp2 på stacken, då vi använder dem i subrutinen för andra saker, och slutligen vi återställa dem till deras tidigare värden igen på första poppar temp2 off (eftersom det var den sista som sköt på det är överst i stacken och kommer att vara den första vi pop backa) och då poppar Temp.

Så hädanefter kommer vi alltid att använda denna metod. Den enda gången vi faktiskt kommer att utse ett register för något annat än en temp variabel är när vi behöver det överallt. Registret kallas "svämmar över" är exempelvis en som vi använder på flera olika ställen i programmet och så vill vi ge den ett namn. Naturligtvis kan vi fortfarande använda det så vi har gjort med temp och temp2 eftersom vi skulle återställa det värdet när vi är klar. Men det skulle spaghettify saker för mycket. De är namngivna av en anledning och vi har temp och temp2 redan utsett för det jobbet.

Se Steg
Relaterade Ämnen

AVR Assembler Övningsexempel 7

Välkommen till Övningsexempel 7!Idag vi första visar hur du rensar en knappsats och sedan visar hur du använder Analog ingång hamnarna för att kommunicera med knappsatsen.Vi kommer att göra med avbrott och en enda tråd som indata. Vi kommer tråd knap...

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...