AVR Assembler Tutorial 9 (5 / 7 stap)

Stap 5: Duw 'n Pop


Er zijn slechts een paar "algemene doel Registers" die we tot onze beschikking hebben en zodra ze worden gebruikt zijn er niet meer. Dus het is goede noem praktijk alleen om ze te gebruiken voor een paar variabelen die worden gebruikt als tijdelijke opslag die u nodig hebt voor het lezen van en schrijven naar, havens en SRAM met, of anders degenen die u in de subroutines overal en zo nodig programmeren hen. Dus wat ik heb gedaan, nu dat we hebben geïnitialiseerd en leren te gebruiken van de Stack, is door de code gaan en vinden de benoemde General-Purpose registers die worden gebruikt alleen binnen een enkele subroutine of onderbreken en nergens anders in de code en vervang ze met één van onze tijdelijke registers en een push en pop aan de stapel. In feite, als u programmacode die is geschreven voor kleinere microcontrollers kijken, of als je terug in de tijd naar wanneer alle chips kleiner waren, ziet u alleen een paar algemene doel registers die moesten worden gebruikt voor alles, dus u kon niet enkel een waarde daar opgeslagen en laat het alleen omdat je er zeker van dat register moeten voor andere dingen. Zo ziet u pushin'en een Poppin ' helemaal over de plaats in de code. Misschien moet ik heb genoemd onze temp General-Purpose registers AX en BX als een respectvolle kudos aan die vervlogen dagen.

Een voorbeeld zal helpen zodat deze duidelijker te onderscheiden.

Bericht dat in onze analoog naar digitaal conversie voltooid interrupt ADC_int gebruiken we een algemene doel registreren dat we buttonH die we gebruikt voor het laden van de waarde van ADCH en vergelijk deze met onze opzoektabel van analoog naar knop pers conversies hebben genoemd. Wij gebruiken alleen het register van dit buttonH binnen de ADC_int-subroutine en nergens anders. Dus in plaats daarvan zullen we gebruik maken van onze variabele temp2 die we gebruiken als een tijdelijke variabele, die we binnen een bepaalde subroutine gebruiken kunnen en de waarde geen invloed op om het even wat buiten die subroutine (dat wil zeggen de waarde die wij in ADC_int niet worden gebruikt overal anders).

Een ander voorbeeld is onze vertraging macro. Wij beschikken over een register we "milliseconden" hebben genoemd, waarin onze vertragingstijd in milliseconden. In dit geval is het in een macro, en we herinneren ons dat de manier waarop macro's werk is dat de monteur de hele macrocode in de plek van het programma waar het heet geplaatst. In dit geval wil we ontdoen van de variabele "milliseconden" en te vervangen door één van onze tijdelijke variabelen. In dit geval zal ik het een beetje anders om u te tonen hoe zelfs als de waarde van de variabele is gonna elders moeten we kunnen nog steeds gebruiken met behulp van de stack. Dus in plaats van milliseconden gebruiken we "temp", en opdat we niet verpesten andere dingen die ook gebruik maken van de waarde van temp gewoon beginnen we de macro "vertraging" door "duwen" temp op de stack, dan we het gebruiken in plaats van milliseconden, en dan aan het einde van de macro we "pop" de vorige waarde terug uit de stapel.

Het netto resultaat is dat we "geleend" temp en temp2 voor tijdelijk gebruik en vervolgens hen naar hun vorige waarden hersteld wanneer we klaar bent.

Hier is de ADC_int interrupt routine nadat u deze wijziging hebt aangebracht:

 ADC_int: push temp ; save temp since we modify it here push temp2 ; save temp2 lds temp2,ADCH ; load keypress ldi ZH,high(2*numbers) ldi ZL,low(2*numbers) cpi temp2,0 breq return ; if noise triggers don't change 7segnumber setkey: lpm temp,Z+ ; load from table and post increment clc cp temp2,temp ; compare keypress with the table brlo PC+4 ; if ADCH is lower, try again lpm 7segnumber,Z ; otherwise load keyvalue table inc digit ; increment the digit number rjmp return ; and return adiw ZH:ZL,1 ; increment Z rjmp setkey ; and go back to top return: pop temp2 ; restore temp2 pop temp ; restore temp reti 

Merk op dat de manier waarop de stack werkt is dat de eerste op de laatste af. Net als een stapel papier. U ziet dat in onze eerste twee lijnen we de waarde van de temp op de stack duwen, dan we temp2 op de stack duwen, dan wij hen in de subroutine voor andere dingen gebruiken, en ten slotte we ze naar hun vorige waarden opnieuw herstellen door eerst popping temp2 af (aangezien het de laatstgenoemde geduwd op het is aan de bovenkant van de stack en zullen de eerste die we pop terug uit) en dan knallen Temp.

Wij zullen dus voortaan altijd deze methode gebruiken. De enige keer dat we eigenlijk een register voor iets anders dan een tijdelijke variabele wijst is wanneer we gaan overal nodig. Bijvoorbeeld, behoort het register genaamd "overflows" die wij gebruiken in verschillende plaatsen in het programma en wij willen dus geef het een naam. Natuurlijk kunnen we deze toch de manier waarop we hebben gedaan met de temp en temp2 aangezien wij zijn waarde zou herstellen nadat we klaar bent gebruiken. Maar dat zou te veel spaghettify dingen. Ze zijn genoemd naar een reden, en we hebben temp en temp2 al aangewezen voor die baan.

Gerelateerde Artikelen

AVR Assembler Tutorial 2

AVR Assembler Tutorial 2

Deze tutorial is een voortzetting van het "AVR Assembler Tutorial 1"Als je niet hebt doorlopen Tutorial 1 moet je nu stoppen en dat men eerst doen.In deze tutorial zullen we onze studie van assembly language programmering van de atmega328p in de
AVR Assembler Tutorial 11

AVR Assembler Tutorial 11

Welkom bij Tutorial 11!In deze korte tutorial, zijn we eindelijk het eerste deel van onze laatste project bouwen.Het eerste wat dat u moet doen is gaat u naar de allerlaatste stap van deze tutorial en Bekijk de video. Dan kom hier terug. [onderbreken
AVR Assembler Tutorial 1

AVR Assembler Tutorial 1

Ik heb besloten om een serie tutorials over hoe te schrijven van assembler programma's voor de Atmega328p die het gebruikt in de Arduino microcontroller is schrijven. Als mensen geïnteresseerd blijven blijft ik stak een een week of zo totdat ik oprak
AVR Assembler Tutorial 6

AVR Assembler Tutorial 6

Welkom bij Tutorial 6!Today's tutorial zullen kort waar zullen we het ontwikkelen van een eenvoudige methode om gegevens tussen een atmega328p en een andere met twee poorten verbinden hen te delen. Wij zullen vervolgens nemen de dobbelstenen rol van
AVR Assembler Tutorial 8

AVR Assembler Tutorial 8

Welkom bij Tutorial 8!In deze korte tutorial gaan we een beetje een afleiding van de invoering van nieuwe aspecten van assembly language programmering te laten zien hoe onze prototyping componenten verplaatsen naar een aparte "gedrukt" printplaa
AVR Assembler Tutorial 7

AVR Assembler Tutorial 7

Welkom bij Tutorial 7!Vandaag gaan we naar eerste show hoe opruimen van een toetsenbord, en vervolgens laten zien hoe de analoge input poorten gebruiken om te communiceren met het toetsenblok.We zullen dit doen met behulp van interrupts en een enkele
AVR Assembler Tutorial 10

AVR Assembler Tutorial 10

Welkom bij Tutorial 10!Sorry dat het zo lang duurde om deze volgende aflevering eruit maar dit is een behoorlijk hectische tijd van het jaar. In ieder geval, is hier het!We hebben een lange weg afgelegd en u bent waarschijnlijk al bekwaam genoeg is o
AVR Assembler Tutorial 5

AVR Assembler Tutorial 5

Vandaag gaan we nemen een kijkje op de verschillende geheugenlocaties in de Atmega328p microcontroller en zien als we beter begrijpen kunnen hoe de dingen worden opgeslagen, waar ze worden opgeslagen en hoe de pointers en opzoektabellen werken.De tut
AVR Assembler Tutorial 4

AVR Assembler Tutorial 4

Welkom bij de handleiding voor nummer 4!In deze tutorial zullen we bouwen een circuit om te simuleren het rollen van twee dobbelstenen. Dan zullen we eerst een brute-force-programma welk doet naar de job schrijven. Dan zullen we dat programma op vers
AVR Assembler Tutorial 3

AVR Assembler Tutorial 3

Welkom op tutorial nummer 3!Voordat we beginnen wil ik een filosofische opmerking maken. Wees niet bang om te experimenteren met de circuits en de code die we proberen op te in deze tutorials bouwen. Draden rond wijzigen, nieuwe onderdelen toe te voe
Een geavanceerde benadering van programmering van Arduino & AVR

Een geavanceerde benadering van programmering van Arduino & AVR

Dit instructable is een must read voor iedereen die vertrouwd is met core AVR chips en Arduino.Nou, om meer specifieke, bij het lezen van de instructable, zal u zitten kundig voor:1) weten het juiste verschil tussen AVR en Arduino.2) programmering Ar
Programmeerbare LED

Programmeerbare LED

geïnspireerd door diverse LED Throwies, knipperende LEDs en soortgelijke instructables ik wilde doen van mijn versie van een LED aangestuurd door een microcontroller.Het idee is om de LED knipperende reeks Herprogrammeerbare. Deze herprogrammering ka
De generator van willekeurige golfvorm, voor ~ 20$

De generator van willekeurige golfvorm, voor ~ 20$

een willekeurige golfvorm generator (AWG) is een nuttige maar vaak duur stuk van testapparatuur (ebay voor lacht). Gebruiken om te bepalen component frequentiebereik, genereren van vervoerder signalen, als een LCR-meter als u een bereik, tune resonan
Star Trek deurbel Hack

Star Trek deurbel Hack

Ik heb altijd al een fan van de Star Treks en als zodanig ik was erg opgewonden toen mijn kamergenoot bracht het huis van een originele serie stijl Star Trek comm panel. Ik had nog nooit gezien een van deze, maar een snelle zoektocht nam ons mee naar