AVR Assembler Tutorial 2 (3 / 4 stap)

Stap 3: Analyse van de lijn door lijn van de code

Ik zal de regels die alleen commentaar als hun doel vanzelfsprekend is overslaan.

 .nolist .include "./m328Pdef.inc" .list 

Deze drie lijnen omvatten het bestand met de definities van het Register en Bit voor de ATmega328P die we zijn programmering. De opdracht .nolist vertelt de assembler niet op te nemen van dit bestand in het pushbutton.lst-bestand dat het produceert wanneer u monteren. Het wordt de aanbieding optie uitgeschakeld. Na met inbegrip van het bestand inschakelen we de aanbieding optie weer met de opdracht .list. De reden dat we dit doen is omdat het m328Pdef.inc-bestand vrij lang is en wij niet echt nodig om het te zien in de lijstbestand. Onze assembler, avra, niet automatisch genereren van een lijstbestand en als wij willen we zou monteren met de volgende opdracht:

 avra -l pushbutton.lst pushbutton.asm 

Als u dit doet zal het genereren van een bestand met de naam pushbutton.lst en als u dit bestand u vindt dat het toont uw programmacode samen met extra informatie bekijken. Als je kijkt naar de extra informatie die u zult zien dat de lijnen met een C: gevolgd door het relatieve adres in hex beginnen van waar de code wordt geplaatst in het geheugen. In wezen het begint bij 000000 met de eerste opdracht en vanaf daar met elke volgende opdracht verhoogt. De tweede kolom na de relatieve plaats in het geheugen is de hexadecimale code voor de opdracht, gevolgd door de hexadecimale code voor het argument van de opdracht. Bestandslijst verder bespreken we in toekomstige tutorials.

 .def temp = r16 ; designate working register r16 as temp 

In deze lijn gebruiken we de assembler richtlijn ".def" om te definiëren van de variabele "temp" als gelijke tot het r16 "werkende register." We zullen register r16 gebruiken als die welke de nummers die we kopiëren naar verschillende poorten en registers willen (die niet kunnen worden geschreven direct) worden opgeslagen.

Oefening 1: Probeer te kopiëren van een binair getal rechtstreeks naar een haven of een speciaal register als DDRB en zien wat er gebeurt wanneer u probeert te monteren van de code.

Een register bevat een byte (8 bits) van informatie. In wezen is het meestal een verzameling van SR-sloten elkaar is een "beetje" en bevat een 1 of een 0. We kunnen dit bespreken (en zelfs lichaamsbouw men!) later op in deze serie. U kunt benieuwd zijn wat is een "werkende register" en waarom we koos r16. We zullen dat in een toekomstige tutorial wanneer we duik naar beneden in het moeras van de internals van de chip. Voor nu wil ik u om te begrijpen hoe om dingen zoals het schrijven van code en programma fysieke hardware te doen. Dan zul je een referentiekader van die ervaring die zal maken van het geheugen en registreren van de eigenschappen van de microcontroller gemakkelijker te begrijpen. Ik realiseer me dat meest inleidende leerboeken en discussies dit de andere manier rond doen, maar ik die het afspelen van een video game voor een tijdje eerste en dicking rond gevonden heb te krijgen een mondiaal perspectief en dan het lezen van de handleiding om het beter te krijgen is veel gemakkelijker dan het lezen van de handleiding eerst.

 rjmp Init ; first line executed 

Deze lijn is een "relatieve sprong" aan het label "Init" en hier niet echt nodig omdat de volgende opdracht reeds in Init is maar we dit voor toekomstig gebruik meenemen.

 Init: ser temp ; set all bits in temp to 1's. 

Na de Init-label voeren wij een opdracht "set register". Hiermee worden alle van de 8 bits in het register 'temp' (die u herinneren r16) op 1. Dus temp nu 0b11111111 bevat.

 out DDRB,temp ; setting a bit as 1 on the Data Direction I/O register ; for PortB, which is DDRB, sets that pin as output ; a 0 would set that pin as input ; so here, all PortB pins are outputs (set to 1) 

Het register DDRB (Data richting registreren voor PortB) vertelt die pinnen op PortB (d.w.z. PB0 via PB7) zijn aangewezen als input en die zijn aangewezen als output. Omdat we de pin die pb0 met onze LED en de rest niet verbonden met om het even wat verbonden zal we alle bits ingesteld op 1, wat betekent dat zij alle uitgangen.

 ldi temp,0b11111110 ; load the `immediate' number to the temp register ; if it were just ld then the second argument would ; have to be a memory location 

Deze regel wordt de binaire getal 0b11111110 in het tijdelijke register geladen.

 out DDRD,temp ; mv temp to DDRD, result is that PD0 is input and ; the rest are outputs 

Wij stel nu de Data richting Register voor PortD van temp, omdat temp nog steeds 0b11111110 we bevat zien dat PD0 zal worden aangewezen als een input pin (want er een 0 in de extreemrechtse plek is) en de rest als uitgangen zijn aangewezen, aangezien er 1's op die plekken.

 clr temp ; all bits in temp are set to 0's out PortB,temp ; set all the bits (i.e. pins) in PortB to 0V 

Eerst clear wij"" de register-temp waardoor u kunt alle van de bits op nul instellen. Vervolgens kopiëren we die tot het PortB-register waarin 0V op al deze pinnen. Een nul op een beetje PortB betekent dat de processor zal houden dat pin op 0V, een op een beetje zal veroorzaken dat pin worden ingesteld op 5V.

Oefening 2: Gebruik een multimeter om te controleren als de pinnen op de PortB allemaal eigenlijk nul. Is iets raar gaande met PB1? Enig idee waarom die wellicht? (vergelijkbaar met oefening 4 hieronder dan volgen de code...)
Oefening 3: Verwijder de bovenstaande twee regels van uw code. Het programma nog steeds werkt goed? Waarom?

 ldi temp,0b00000001 ; load immediate number to temp out PortD,temp ; move temp to PortD. PD0 is at 5V (has a pullup resistor) ; since it has a 1 in that bit the rest are 0V. 

Oefening 4: Verwijder de bovenstaande twee regels van uw code. Het programma nog steeds werkt goed? Waarom? (Dit is anders dan oefening 3 hierboven. Zie de pin uit diagram. Wat is de standaardinstelling voor DDRD voor PD0? (Zie pagina 90 van de data sheet)

Voorste wij "vracht onmiddellijk" het nummer 0b00000001 om de temp. De "onmiddellijke" deel is er sinds we zijn het laden van een recht omhoog nummer temp in plaats van een pointer naar een locatie in het geheugen met het nummer te laden. In dat geval zouden we gewoon "ld" gebruiken in plaats van "ldi". Dan sturen we dit nummer naar PortD waarin PD0 5V en de rest aan 0V.

Nu we de pinnen als input of output hebt ingesteld en we hebben opgezet hun initiële staten als 0V of 5V (laag of hoog) en dus voer we nu ons programma "lus".

 Main: in temp,PinD ; PinD holds the state of PortD, copy this to temp ; if the button is connected to PD0 then this will be ; a 0 when the button is pushed, 1 otherwise since ; PD0 has a pull up resistor it is normally at 5V 

Het register PinD bevat de huidige status van het PortD-pins. Bijvoorbeeld, als u een 5V-draad aangesloten naar PD3, dan op de volgende klokpuls cyclus (die gebeurt 16 miljoen keer per seconde omdat we de microcontroller vastgehaakt aan een kloksignaal 16MHz) de PinD3-bit (van de huidige stand van PD3) zou een 1 in plaats van een 0. Dus in deze lijn kopiëren we de huidige stand van de pennen aan de temp.

 out PortB,temp ; sends the 0's and 1's read above to PortB ; this means we want the LED connected to PB0, so ; when PD0 is LOW, it will set PB0 to LOW and turn ; on the LED (the other side of the LED is connected ; to 5V and this will set PB0 to 0V so current flows) 

Nu sturen we de staat van de pinnen in de PinD naar de output van de PortB. In de praktijk betekent dit dat PD0 een 1 sturen naar PortD0, zal tenzij de knop is ingedrukt. In dat geval omdat de knop is aangesloten op de grond dat pin zullen 0V en een 0 wordt verzonden naar PortB0. Nu, als je kijkt naar het circuit diagram, 0V op PB0 betekent dat de LED zal gloeien, omdat de andere kant hiervan op 5V is. Als we niet te drukken, zodat een 1 wordt verzonden naar PB0, dat zou betekenen dat we hebben 5V op PB0 en ook 5V aan de andere kant van de LED en dus er is geen potentiële verschil geen huidige zullen vloeien en zo de LED niet (in dit geval is een LED is een diode en dus huidige stroomt slechts één richting ongeacht maar wat dan ook) zal gloeien.

 rjmp Main ; loops back to Start 

Deze relatieve sprong lussen ons terug naar onze Main: label en wij controleren PinD weer en zo verder. Het controleren van elke 16 miljoenste van een seconde of de knop wordt geduwd en PB0 dienovereenkomstig instellen.

Oefening 5: Pas je code aan zodat uw LED is aangesloten op PB3 in plaats van PB0 en zien dat het werkt.

Oefening 6: Sluit uw LED op de GND in plaats van 5V en aanpassen van uw code.

Gerelateerde Artikelen

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