AVR Assembler Tutorial 5 (4 / 8 stap)

Stap 4: Een andere blik op de pointers en opzoektabellen


Laten we nu zien als we onze analyzer gebruiken kunnen om een beter idee van hoe deze X-, Y- en Z-pointers en opzoektabellen werken. Ik realiseer me dat onze discussie in de laatste tutorial een beetje verwarrend zijn voor de nieuwkomer kan zijn geweest. Ik denk dat dit zal helpen het des te meer duidelijk maken.

Laten we beginnen met onze code als volgt wijzigen:

;************************************ ; geschreven door: 1o_o7; datum: < 2014|11|03 >; versie: 1.0; dat is opgeslagen als: analyzer2.asm; voor AVR: atmega328p; klokfrequentie: 16MHz; *** ;************************************ ; written by: 1o_o7 ; date: <2014|11|03> ; version: 1.0 ; file saved as: analyzer2.asm ; for AVR: atmega328p ; clock frequency: 16MHz ;************************************ ; Program funcion:---------------------- ; analyzes the bits stored in a register ;--------------------------------------- .nolist .include "./m328Pdef.inc" .list .def temp = r16 .org 0x0000 rjmp Init numbers: .db 0b01111111, 0b11011110, 0b01011110, 0b11010010 .db 0b01010010, 0b11000000 Init: ser temp out DDRB,temp out DDRC,temp clr temp out PortB,temp out PortC,temp main: ldi ZH, high(2*numbers); ZH is the high byte of the address of numbers ldi ZL, low(2*numbers); ZL is the low byte of the address of numbers mov r20,r30 rcall analyze rjmp main analyze: clr temp out portb,temp out portc,temp sbrc r20,7 sbi portb,1 sbrc r20,6 sbi portb,2 sbrc r20,5 sbi portb,3 sbrc r20,4 sbi portb,4 sbrc r20,3 sbi portc,1 sbrc r20,2 sbi portc,2 sbrc r20,1 sbi portc,3 sbrc r20,0 sbi portc,4 ret .nolist .include ". / m328Pdef.inc".list main: ldi ZH, high(2*numbers) ldi ZL, low(2*numbers) mov r20,ZL rcall analyze rjmp main .org 0x0000 rjmp Init nummers: .db 0b01111111, 0b11011110, 0b01011110, 0b11010010 .db 0b01010010, 0b11000000 main: ldi ZH, high(2*numbers) ldi ZL, low(2*numbers) lpm r20,Z rcall analyze rjmp main belangrijkste: ldi ZH, high(2*numbers); ZH is de hoge byte van het adres van getallen ldi ZL, low(2*numbers); ZL is de lage byte van het adres van getallen mov r20, r30 rcall analyseren rjmp main main: ldi ZH, high(2*numbers) ldi ZL, low(2*numbers) adiw ZH:ZL,1 mov r20,ZL rcall analyze rjmp main 

We hebben gewoon een opzoektabel toegevoegd aan de top (die is precies dezelfde die we in ons programma van de dobbelstenen in Tutorial 4 gebruiken) en dan we de ZL en ZH lijnen toegevoegd in onze Main routine voor het initialiseren van de Z-aanwijzer.

Wij vervolgens r30 in onze analyzer register r20 laden en analyseren op ons bord. U moet dit doen. U moet vinden dat r30 bevat 0b00000010. Nu krijgt hetzelfde voor r31 en je 0b00000000.

Het adres van "numbers" is 0x0001 die in binaire 0b0000000000000001 dus

LDI ZH, high(2*numbers)

betekent precies hetzelfde als

LDI r31, high(0b0000000000000010)

die is

LDI r31, 0b00000000

Op dezelfde manier

LDI ZL, low(2*numbers)

betekent precies hetzelfde als

LDI r30, low(0b0000000000000010)

die is

LDI r30, 0b00000010

Herinneren dat r30 en r31 combineren om Z.

Probeer dit:

 main: ldi ZH, high(2*numbers) ldi ZL, low(2*numbers) inc r30 lpm r20,Z rcall analyze rjmp main 

Nu wat gebeurt er als we kijken naar Z? Nou laat proberen:

 .org 0x0000 rjmp Init .org 0x0008 numbers: .db 0b01111111, 0b11011110, 0b01011110, 0b11010010 .db 0b01010010, 0b11000000 

Merk op dat, om te kunnen gebruiken Z, moeten we de opdracht LPM. Dit zal laden welke gegevens in de vergadering in het adres waarnaar wordt verwezen door Z. Het adres dat z naar wijst is gevonden door te beginnen met wat er in r31 r30, die 0b0000000000000010 en weer terug dan verschuiven naar rechts te krijgen 0b0000000000000001. Dus probeer het en zie wat je krijgt... handige recht? U 0b01111111 dat is precies wat we op dat adres opgeslagen. Laten we blijven proberen en maken dit duidelijker. Laten we het volgende doen:

 main: ldi ZH, high(2*numbers) ldi ZL, low(2*numbers) adiw ZH:ZL,3 lpm r20,Z rcall analyze rjmp main 

U ziet we 1 toegevoegd aan ZH:ZL waardoor ZL = 0b00000011. Als u vervangen ZL in het bovenstaande r30 zou je precies hetzelfde. Ze zijn verschillende namen voor hetzelfde nummer. Als in plaats van met behulp van "adiw ZH:ZL" in het bovenstaande u "inc ZL" of zelfs "inc r30 gebruikt" zou u het zelfde ding opnieuw opvragen. De instructie adiw betekent "toevoegen onmiddellijk naar word" en een "woord" is 2 bytes of 16-bits. Dus u hoeft te geven dat twee 8-bit registers, voegt ZH:ZL, of op equivalente wijze r31:r30 en het k ernaar. In ons voorbeeld hierboven k is 1.

Laten we er 1 bij optellen r30 en dan kijken waar Z wijst:

 main: ldi ZH, high(2*numbers) ldi ZL, low(2*numbers) ldi r31, 0 ldi r30, 19 lpm r20,Z rcall analyze rjmp main 

Dus Z bevat ZH:ZL die is hetzelfde als r31:r30 die 0x0003 is aangezien "nummers:" begint bij 0x0001 en we door 2 keer te initialiseren ZL en ZH, wat betekende dat Z 0x0002 bevatte, dan wij r30 (dat is de onderste helft van Z) verhoogd zodat nu Z = r31:r30 = 0x00:0x03 = 0x0003. Wanneer de LPM-instructie is gevraagd te laden programmageheugen van Z te r20 duurt het nummer in Z, dat is 0x0003 = 0b0000000000000011, en zegt: "Oke, de 0de bit is een 1, dat ik wil grijpen de tweede byte op het adres 0b0000000000000001 wat het adres krijg ik betekent door een verschuiving van Z naar het recht één positie (of delen door 2)"

Ik wil een laatste ding hier te proberen en maken het minder verwarrend. We gaan terug naar de top van ons programma en plak een .org-instructie in daar. Dus hebt je

Kun je zien wat ik heb gedaan? Ik heb uitdrukkelijk gezegd de PC te houden van de lijst met getallen op het programmageheugen adres 0x0008, oftewel in binaire 0b0000000000001000

(Herinneren dat aangezien ik niet in te interrupts schakelen ben ik kan die geheugen ruimten gebruiken kan voor wat ik.)

Sinds de nummers: tabel begint bij het hierboven vermelde adres, wat zal in r30 en r31 ditmaal krijgen geladen?

Goed dat adres met 2 te vermenigvuldigen en je krijgt 0b0000000000010000 welke scheidt als 00000000:00010000 zo dat ons vertelt dat r31, ZH is als je wilt, 0b00000000 en r30 of ZL als u wilt, is 0b00010000.

Oefening 2: dit controleren met uw analyzer door outputten r30.

Nu probeer dit:

U moet wijzen op de 4e nummer in onze lijst sinds we bij de eerste begonnen en 3 aan het adres toegevoegd. Wat is het werkelijke adres van het programmageheugen van dit nummer? Nou, het geheugenadres programma voor het eerste item in de lijst is 0x0008, oftewel 0b0000000000001000, en het programmageheugen van het tweede nummer in de lijst is ook 0x0008. Het programmageheugen van het derde nummer in de lijst is 0x0009 en het adres van het programma van het vierde nummer is ook 0x0009. De manier waarop we dat Vierde nummer krijgen is beginnen we met het adres 0b0000000000001001 en we verschuiving links door 1 bit (d.w.z. keer door 2) om 0b0000000000010010 en hierdoor wordt de ZH:ZL-waarden voor het eerste nummer op dat adres, dat wil zeggen het derde getal in onze lijst te krijgen van het tweede getal opgeslagen op dat hetzelfde adres (met andere woorden de bovenste helft van het 16-bits register op adres 0x0009) wij enkel toevoegen aan de verschoven nummer. Dat is 0b0000000000010011. Dit is het nummer 0x13 in hex of 19 in decimale notatie. Wij willen een getal dat is opgeslagen op programmageheugen adres nummer 9 en zodat we ZH:ZL ingesteld op 0:19 laten we alle bewijzen dit. Laat gewoon stok dit nummer in r30 en r31 en zien wat er uit Z.

Lo en behold. Uw LED's tonen het 4e nummer op onze lijst.

Ik hoop dat dit heeft geholpen mensen begrijpen wat is gebeurt met de Z-aanwijzer, hoe programmageheugen is ingedeeld, hoe ADIW en LPM werken en waarom ze dit moeten doen te vermenigvuldigen met twee dingen te krijgen van de juiste byte-gegevens uit een opgegeven geheugenadres. Merken er zijn twee verschillende 16bits dingen hier. Het programmageheugen adres zelf is een 16-bits getal, en het register op elk van deze adres is 16 bits breed. Het eerste feit is de reden waarom Z uit 2 van onze 8-bits werken registers worden gemaakt, zodat het een compleet geheugenadres kan houden, het tweede feit is de reden waarom we hebben om te vermenigvuldigen met 2, zo kunnen we de laag of de hoge byte van de gegevens die zijn opgeslagen op elk adres.

Oefening 3: spelen rond met het plaatsen van gegevens in verschillende geheugenlocaties, verhogen en verlagen de r30 en r31 registers, wat er gebeurt wanneer u bij r31 start 0xFF = en het ophogen? Ook proberen met behulp van de X en Y pointers ook.

Oef! Laten we een pauze en iets doen leuk...

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 9

AVR Assembler Tutorial 9

Welkom bij Tutorial 9.Vandaag zullen wij tonen hoe de controle van zowel een 7-segment display en een 4-cijferige weergave met behulp van onze ATmega328P en AVR assembler code. In de loop doen die we nemen van omleidingen moeten zal op how to use van
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 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