AVR Assembler handledning 10 (8 / 10 steg)

Steg 8: Kodning slav



Innan vi går in TWI subrutinen, som i fallet med slav är en avbrottshanterare, lägga vi först upp resten av koden att använda den. Först måste vi lägga till avbrottet (definieras i tabell 12-6 på sidan 65):

.org 0x0000
JMP Reset
.org 0x0020
JMP timer_overflow_int
.org 0x0030
JMP tw_int

Detta säger att denna linje på plats 0x0030 kommer att genomföras om globala avbryter aktiveras av inställningen jag bet i SREG 1, och om, i TWCR, TWIE bit är en 1 och TWI avbrott flaggan är inställd.

Det tydliga igen det tolerabla VECKOINTAGET och Timer/Counter0 bitar i makt minskade registrera PRR som vi gjorde med befälhavaren. Det är inte nödvändigt att ange bithastigheten på slaven eftersom befälhavaren styr SCL frekvensen och slaven bara svarar på det.

LDS temp, PRR
Andi temp, 0b01011111
STS PRR, temp ldi temp, 0b10100001
STS TWAR, temp

Ovan, vi initiera (enligt sidan 223) vi ladda slavadress i TW adress registrera, TWAR. Den sista biten är en 1 vilket innebär att slaven svarar på allmänna samtal. Vi använder inte allmänna samtal här men vi kanske vill använda dem senare när vi har mer än en slav.

LDI temp, (1--TWEA) | (1--TWEN) | (1--TWIE)
STS TWCR, temp

Nästa vi aktiverar bekräfta lite (så att överföringen kommer att besvaras genom att dra ner på SDA linjen efter att ha fått data), aktivering av det tolerabla VECKOINTAGET och TWI avbryter (TWIE). Att aktivera TWI avbryter innebär att våra avbrottshanterare på .org 0x0030 kommer att anropas när TWINT är satt till 1 av hårdvara (dvs. flaggan är på).

CBI DDRC, 4
SBI PORTC, 4
CBI DDRC, 5
SBI PORTC, 5

Ovanstående rader sätta våra SDA och SCL stift i inmatningsläge med inre pullups.

Slutligen kommer vi till vår slav TWI avbrottshanterare:

tw_int:
Tryck temp

Det är alltid god praxis att lagra din temp register när du anger ett avbrott. Du vet inte när ett avbrott kommer att kallas och om du använder "temp" i avbrottet den kommer tillbaka till din huvudsakliga koden med sopor i den. Så tryck in det här och pop det tillbaka i slutet.

rcall display_off

Längst ner ser du vad jag har för display_off-subrutin. Det i princip stänger bara av de 4-siffriga displayerna tills de nya Visa tal läses av denna handler.

LDS temp, TWSR
CPI temp, 0x60
brne fel

Tabell 22-4 ger statuskoder för en slav i mottagaren läge. Här vi bara kontroll för att se att det var vår adress och lite skriva som kom från linjen och orsakade detta avbrott.

LDI temp, (1--TWINT) | (1--TWEA) | (1--TWEN)
STS TWCR, temp
rcall tw_wait
LDS temp, TWSR
CPI temp, 0x80
brne fel

Framför vi tydliga flaggan TWI avbrott med (1--TWINT), de andra är bara för att hålla dem på när vi läsa in temp i TWCR. Om vi inte hade (1--TWEA) och (1--TWEN) då de skulle sättas till noll i TWCR register på raden. Vi vänta sedan tills det tolerabla VECKOINTAGET slutar och blir tillgänglig igen. Sedan kontrollerar vi statusregistret för att se att byten som data har tagits emot, lagras i TWDR och en kvittering har skickats tillbaka.

LDS playercashH, TWDR

Detta laddar databyte som vi fick från linjen i vårt playercashH register.

LDI temp, (1--TWINT) | (1--TWEA) | (1--TWEN)
STS TWCR, temp
rcall tw_wait
LDS temp, TWSR
CPI temp, 0x80
brne fel

Precis som ovan, vi får en databyte, erkänna det, och kontrollera status.

LDS playercashL, TWDR

Denna gång vi lagrar databyte på playercashL. Denna kommer att innehålla vår totala tärningskast.

LDI temp, (1--TWINT) | (1--TWEA) | (1--TWEN)
STS TWCR, temp
rcall tw_wait
LDS temp, TWSR
CPI temp, 0xA0
brne fel
rjmp tw_return

Aktivera det tolerabla VECKOINTAGET, få den nästa databyte, kontrollera status att se till att det är stopp-signal och slutligen hoppa till vår rensning och exit etikett.

FEL:
LDI playercashH,high(1111)
LDI playercashL,low(1111)
tw_return:

Våra fel hanterare gör ingenting men ladda alla 1 i displayen att visa oss något gick fel och sedan återvända från avbrottet.

Nu när vi har våra display "playercash" registrerar lastade, vi kallar den "loadcash" rutin som kommer att konvertera dem till decimaler och visa dem.

LDI temp, (1--TWINT) | (1--TWEA) | (1--TWEN) | (1--TWIE)
STS TWCR, temp
rcall loadcash
pop temp
SEI
Reti

Ovanstående återaktiverar TWIE så att den kommer återigen att köra avbrottshanterare på 0x0030 när en TWI avbrott inträffar. Sedan vi pop vår temp backa stacken, re-möjliggöra globala avbrott och gå tillbaka till där vi var kallade. Följande är våra tw_wait subrutin som är identisk med den som används i Master koden:

tw_wait:
LDS temp, TWCR
SBRs temp, TWINT
rjmp tw_wait
ret

Slutligen, här är vår display_off rutin som är självförklarande:

display_off:
CBI PortC, 0
CBI PortC, 1
CBI PortC, 2
CBI PortC, 3
ret

I nästa steg ger jag koden och video av operation.

Se Steg
Relaterade Ämnen

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

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

Välkommen till Övningsexempel 9.Idag kommer vi att visa hur du kan styra både 7-segment display och en 4-siffrig display med våra ATmega328P och AVR assembler kod. I samband med detta får vi ta omvägar till hur du använder stacken för att minska anta...

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

En avancerad metod för Arduino & AVR programmering

Detta instructable är ett måste läsa för alla som är bekanta med core AVR chips och Arduino.Tja, mer konkret, när jag läste den instructable kommer du att kunna:1) vet väl skillnaden mellan AVR och Arduino.2) programmering Arduino med WinAVR & använd...

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

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

65xx teknik-församlingen språk programmering med W65C02SXB-handledning 1

Western Design Center (WDC) har beslutat att skriva en serie tutorials på hur du kommer igång med vår 65xx teknik och hur man skriver assembler program för 65xx familjen för ICs. Denna handledning kommer att baseras på använda det Standard W65C02 chi...

AVR fuse grunderna: kör en avr med en extern klocka

säkringar är bland de svåraste ämnen som jag stött på samtidigt lära sig om programmering microcontrollers. Även efter att söka och läsa flitigt, kunde jag fortfarande inte lyckas rensa mitt begrepp om dem. Men sedan jag började lära dem ta en i tage...

AVR programmering med Arduino, AVRdude och AVR-gcc

AVR är en gemensam, billig typ av mikro-controller som kan verka skrämmande att arbeta med, men oroa dig inte! När du har Ställ in grundläggande kunskap och kan de bli inte bara nyttigt, men viktigt att nya projektidéer som du drömmer upp!Denna handl...

Idiot's Guide till programmering AVR: s på de billiga (med Arduino IDE!)

Mikrokontroller är, utan tvekan, fantastiska små saker. De är mångsidiga, kraftfull och mycket små. Tyvärr, den sistnämnda drag också delas av både min plånbok och mina kunskaper i programmering. Min förståelse av C är dålig, och jag har knappt råd a...