AVR Assembler Tutorial 5 (3 / 8 stap)

Stap 3: Analyse van SREG en Bitwise logica


Zoals u zich (vanaf pagina 11 in het gegevensblad) het AVR Status register herinnert, genaamd SREG, wordt informatie opgeslagen over wat is in de cpu gaande er. Wat we gaan doen in deze stap is gewoon dit register analyseren en zien wat er daar en hoe het verandert wanneer we een paar tests uitvoeren.

De eerste test die we willen uitvoeren is eenvoudig. Laten we eens testen de nul vlag, die is wat 1 van SREG

 main: ldi temp,1 cpi temp,1 in r20,SREG rcall analyze rjmp main 

Eerst hebben we de nummer 1 in temp geladen, waarna we "ten opzichte van" Wat zit er in temp met de nummer 1. Herinner me wat "cpi" eigenlijk doet. Als u een kijkje op de instructie set samenvattende tabel nemen ziet u dat cpi eigenlijk de twee getallen trekt en als het resultaat nul daarin de nul vlag in SREG. Dus als de nul vlag is ingesteld na deze instructie dan wij weten zijn de twee jongens gelijk. We dan kopieer SREG naar r20 en analyseren van de inhoud van de r20. Dus het bovenstaande programma uitvoeren en je moet vinden dat bits nummer 1 (dat wil zeggen LED nummer een) ingeschakeld wat betekent dat de nul vlag van SREG is ingesteld. Geweldig! Zoek nu weer bij de instructie samenvatting lijn "cpi". In de kolom "flags" zal u zien dat deze instructie eigenlijk met een bos van de vlaggen in SREG omgaat. Het zegt "Z, N, V, C, H" en kijken naar pagina 11 zien we deze zijn de nul vlag, de negatieve vlag, de twee compliment overloop vlag, de vlag voeren, en de helft vlag dragen.

Laten we eens kijken als we een paar meer vlaggen kunt inschakelen. Laten we proberen dit:

 main: ldi temp,1 cpi temp,2 in r20,SREG rcall analyze rjmp main 

Dit is hetzelfde als de vorige, alleen ditmaal cpi subract 2 van 1 moet. We hebben 1-2 = - 1 en dus wij niet van de nul vlag krijgen, maar moeten we de negatieve vlag, nu proberen.

Wow. We kregen een heleboel vlaggen. We kregen C, N, S en H. Op bladzijde 11 naast bit 0, de vlag voeren, staat dat het geeft een uitvoeren in een arthmetic of logica. Dan zegt het te wenden tot de instructie set beschrijving voor meer informatie. Dus laten we dat doen. Als u opent de instructieset handleiding die ik heb voorgesteld dat u in de laatste tutorial downloaden

Op pagina 63 van de instructie instellen handmatig bespreekt het de cpi-instructie. Neem een blik bij wat het zegt. Het vertelt ons dat de operatie uitgevoerd eigenlijk aftrekken is. Het somt vervolgens de vlaggen en de berekening die worden uitgevoerd om te bepalen welke vlaggen om in te stellen. Onder de 'C', of voeren de vlag, het zegt dat het is ingesteld als de absolute waarde van K (die 2 in ons geval) is groter dan de waarde van de absolue van Rd, oftewel R20 in ons geval en gelijk is aan 1. Aangezien 2 groter dan 1 is, moet de Carry-vlag worden ingesteld--dat is precies wat we hebben gevonden. Hoe zit het met al dat wiskundige vergelijking spullen hebben ze daar? Wat moet dat betekenen? Laten we de berekening. Hier is een samenvatting van hoe bitsgewijze bewerkingen zijn uitgevoerd http://en.wikipedia.org/wiki/Bitwise_operation hebben We niet de symbolen te schrijven precies dezelfde manier, dus we zullen gebruiken een * ter aanduiding van een dot (wat betekent "logische en"), en een onderstreping, ter aanduiding van een lijn erboven, hier is de vergelijking die ze naast de Carry-vlag geven:

C: Td7 * K7 + K7 * R7 + R7 * Td7

In ons geval is Rd R20, die de nummer 1 in het heeft. Dit betekent R20 = 0b00000001. Ook in onze zaak K = 2, hetgeen betekent dat K = 0b00000010. "R" betekent ook het "resultaat". Dus in ons geval is het resultaat van het aftrekken 2 vanaf 1 -1.

Wat is "-1" binair? Nou is hier waar dingen interessant. Als u een kijkje op de Wikipedia-pagina hier nemen: http://en.wikipedia.org/wiki/Signed_number_repres... u vindt een bespreking van de verschillende manieren om te vertegenwoordigen negatieve getallen binair. Er zijn drie belangrijkste mogelijkheden. Ten eerste, misschien beetje 7 geeft het teken? Dat zou betekenen dat -1 = 0b10000001 een andere mogelijkheid heet "iemands compliment" wat betekent dat de negatieve van een willekeurig aantal gewoon het compliment van dat aantal is. Dus in dat geval -1 = 0b11111110. De derde mogelijkheid is het "two's compliment" vertegenwoordiging. In twee van compliment, wordt de negatieve van een getal gevonden door omkeren alle van de bits en vervolgens 1 toe te voegen aan het resultaat. Dus zou -1 0b11111110 + 1 = 0b11111111.

Dus hoe we erachter te komen die men maakt gebruik van de atmega328p? Nou we kan gemakkelijk vinden in het gegevensblad, maar in plaats daarvan, laten we behandelen als een detective mysterie en figuur it out "experimenteel", dat wil zeggen door de berekeningen uit te voeren voor elke vlag in SREG en zien welke vertegenwoordiging geeft het antwoord dat we hebben verlicht over onze breadboard analyzer.

Hier is wat we hebben voor de bovenstaande vergelijking voor de Carry-vlag: Td7 is een 0, aangezien de 7e bit in R20 een nul in ons geval is en K7 een 0 ook is omdat de 7e bit van K een nul is. R7 betekent de 7e bit van het "resultaat" en in ons geval is het resultaat van 1-2 -1. Dus zijn onze drie mogelijkheden:

-1 = 0b10000001 (ondertekenen bits weergave)

-1 = 0b11111110 (iemands compliment voorstelling)

-1 = 0b11111111 (two's compliment voorstelling)

Dus laten we proberen het met elk:

Een lijn erboven betekent "compliment", wat betekent dat u de 0 naar 1's en alle 1's in nullen. Dus Rd = 0b11111110 en vandaar Td7 = 1. K7 = 0, en R7 is een 1 in alle drie voorstellingen! Dus is hier wat we hebben:

C: 1 * 0 + 0 * 1 + 1 * 1

De manier dat * of "En" werken is als beide 1's zijn krijg je een 1, anders krijg je een 0. Dus in ons geval hebben we

C: 0 + 0 + 1 = 1

Dus is onze resultaat voor de "Carry"-vlag 1. De C-bit in de SREG moet zich daarom op. Dat is wat we hebben gevonden.

Nochtans, in de berekening van de vlag voeren, alle drie voorstellingen van negatieve getallen gaf hetzelfde resultaat, aangezien de R7 is een 1 in alle drie gevallen. Dus laten we eens kijken naar de anderen. Hoe zit het met H? Haar zegt dat H de vlag "halve carry is" en het zegt dat er een 1 als we "lenen vanaf bit 3". Hoe wij dat uitzoeken? De instructie set handmatige geeft het volgende als de berekening:

H: Td3* K3 + K3 * R3 + R3 *Td3

In ons geval hebben we Td3 = 1, K3 = 0, maar R3 is een 0 in de eerste vertegenwoordiging, en een 1 in de andere twee. Als we gebruik maken van de teken-bit representatie krijgen we:

H: 1 * 0 + 0 * 0 + 0 * 1 = 0

Maar onze breadboard zegt dat het moet ON! De atmega328p is dus niet met behulp van de "teken-bit" vertegenwoordiging. Laten we proberen de andere twee waar beide R3 zeggen = 1. Onze berekening geeft dan:

H: 1 * 0 + 0 * 1 + 1 * 1 = 1

Goed! Dus weten we dat het moet een van deze twee voorstellingen. Laten we proberen de N-vlag. De berekening zegt dat het is een 1 als de MSB (meest significante bit, d.w.z. bit 7) in het resultaat anders is ingesteld en 0. Nou is het resultaat -1 en in alle drie voorstellingen is de meest significante bit een 1. Zo N = 1 en deze vlag is niet van plan om ons te helpen. Zodat we weer naast heeft de S-vlag die is de laatste hebben wij dat een LED in onze analyzer verlicht. Dit heet "de teken-bit" en de berekening is een straight up "exclusieve of" dat is de betekenis van het plusteken (+) met een cirkel er omheen. Een "exclusieve of", of XOR, betekent dat als beide bits een 1 krijg je 0, als beide bits 0 je krijgen 0, maar als een van hen een 1 is en de andere een 0 is krijgt u een 1 als het antwoord. Met andere woorden als de eerste "of" de tweede is een 1, maar niet beide. De berekening is:

S: N XOR V

en in ons geval N = 1 (sinds bit 2 LED brandt) en V = 0 (sinds bit 3 LED uitstaat) dus het antwoord is 1 XOR 0 = 1. Wat betekent de S-vlag in alle drie voorstellingen zullen op.

Dus nog steeds nog niet we experimenteel besloten of de atmega328p "iemands compliment" of "two's compliment" gebruikt voor negatieve getallen! Dus laten we eens kijken naar een andere bits van SREG. Laten we proberen de V-bit. Die heet de 'two's compliment overloop bit' die soort vertelt ons wat ons antwoord is gonna be nietwaar? Nou ja, laten we blijven proberen en bevestig dit wachtwoord. De berekening is:

V: Td7 *K7*R7 + Td7* K7 * R7

We hebben Td7 = 0, K7 = 1, R7 = 1, en R7 = 0 in zowel iemands en two's compliment. Vandaar gaat deze vlag niet ook onderscheid maken tussen de twee. Hier is wat we krijgen:

V: 0 * 1 * 0 + 1 * 0 * 1 = 0

Er is slechts één vlag links in de SREG die we kunnen testen! De nul vlag Z. Onze LED's zeggen dat deze vlag uitgeschakeld is. De berekening is

Z: R7*R6*R5*R4*R3*R2*R1*R0

Dit is een reeks en verrichtingen. Het betekent dat Z = 1 als alle bits in R 1 en anders nul. Maar dit betekent dat alle van de bits in R 0 moet zijn (omdat het compliment R heeft alle 1's). We hebben

R = -1 = 0b11111110 (iemands compliment voorstelling)
R =-1 = 0b11111111 (two's compliment voorstelling)

Dus "iemands compliment" we Z krijgen zou = 0 en in "two's compliment" krijgen we ook Z = 0.

Nou dat zuigt. Wij hebben ze allemaal getest en we nog steeds nog niet bewezen welke binaire vertegenwoordiging van negatieve getallen de atmega328p gebruikt. Echter hebben we vastgesteld dat onze LED's ons een nauwkeurige lezing van het SREG-register geven.

Nou laten we eindigen dit eens en voor altijd. W weten dat het aantal-127 in elke vertegenwoordiging is gegeven door

0b10000000 =-127 (iemands compliment)

0b10000001 =-127 (two's compliment)

Dus is het dezelfde negatieve getal gelijk is aan een ander binair getal in elke vertegenwoordiging. Zodat een eenvoudig experiment beslissen zal!

 main: ldi r20, -127 rcall analyze rjmp main 

Daar heb je het! Test het zelf. Welke binaire representatie is in r20 wanneer u dit op uw bord analyseert? Nu weet je het antwoord.

Het punt van deze stap was niet alleen om u te tonen hoe te testen van de inhoud van registers, maar ook om u te tonen hoe het begrijpen van de werking van de vlaggen in SREG, om te begrijpen hoe berekenen bitsgewijze logische bewerkingen in binaire en dus te begrijpen hoe Lees de instructie instellen. Elk van de bewerkingen in de instructieset heeft een 'bewerking' dat hij die presteert wordt weergegeven in de kolom van de werking van de samenvattende tabel. U weet nu hoe deze zijn berekend en waarom ze stel en verschillende vlaggen in SREG. U weet nu ook welke binaire vertegenwoordiging van negatieve getallen de Atmega328p gebruikt.

Oefening 1: U zult zich herinneren wanneer we gesproken over de TCNT0 timer/teller en gebruikt in het verleden twee tutorials waren er verschillende stukjes die moest worden ingesteld om de timer en interrupts te maken doen wat we wilden. Een snelle controle met onze analyzer doen en zien wat er momenteel in de TCCR0A, TCCR0B, TIFR0 en TIMSK registers (Vergeet niet dat de TIMSK0 niet in het i/o-register bereik is dus je moet de opdracht een duurder dan "in" het is inhoud laden in een register!)

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