AVR Assembler Tutorial 10 (8 / 10 stap)

Stap 8: Codering de slaaf


Voordat we in de TWI-subroutine, die in het geval van de slaaf een interrupt handler is, instellen we eerst de rest van de code om het te gebruiken. Allereerst moeten we voegen de interrupt (gedefinieerd in tabel 12-6 op pagina 65):

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

Dit zegt dat deze regel op locatie 0x0030 zal worden uitgevoerd als globale interrupts zijn ingeschakeld door de instelling ik beet in SREG 1, en wordt, in de TWCR, de TWIE bit een 1 en de TWI interrupt-vlag ingesteld is.

We duidelijke opnieuw de TWI en de bits Timer/Counter0 in de macht vermindering registreren PRR zoals we hebben gedaan met de meester. Het is niet nodig de bitsnelheid instellen op de slaaf aangezien de meester de SCL-frequentie bepaalt en de slave alleen hierop reageert.

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

Boven, initialiseren we (per pagina 223) we het adres van de slaaf in de TW adres registreren, TWAR laden. Het laatste stukje is een 1, wat betekent dat de slaaf op algemene oproepen reageren zal. We zijn niet met behulp van algemene gesprekken hier maar kunnen we willen hen later gebruiken wanneer er meer dan één slave.

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

Vervolgens maken wij de beoordelen bit (zodat overdracht zal worden gereageerd door te trekken langs de lijn van de SDA na ontvangst van de gegevens), waardoor de TWI, en de TWI onderbreekt (TWIE). TWI interrupts inschakelt, dat onze interrupt handler op .org 0x0030 zullen worden aangeroepen wanneer TWINT is ingesteld op 1 door hardware (dat wil zeggen de vlag is ingeschakeld).

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

De bovenstaande regels wordt onze SDA en SCL pennen gestoken door invoermodus met interne pullups.

Ten slotte komen we bij onze slaaf TWI interrupt handler:

tw_int:
Push temp

Het is altijd verstandig om op te slaan uw tijdelijke registers bij het invoeren van een interrupt. Je weet niet wanneer een interrupt zal worden genoemd en gebruikt u 'temp' in de interrupt naar uw belangrijkste code met vuilnis in het terugkeren zal. Dus het hier push en pop het terug aan het eind.

rcall display_off

Onderaan ziet u wat ik heb voor de display_off-subroutine. Het eigenlijk uitschakelt gewoon als de 4-cijferige displays totdat de nieuwe getallen weergeven door deze handler worden geladen.

LDS temp, TWSR
CPI temp, 0x60
Brně fout

Tabel 22-4 geeft de statuscodes voor een slaaf in de modus van de ontvanger. Hier zijn we gewoon de controle om te zien dat het ons adres en een beetje schrijven die kwam uit de lijn en veroorzaakt deze interrupt was.

LDI temp, (1--TWINT) | (1--TWEA) | (1--TWEN)
St TWCR, temp
rcall tw_wait
LDS temp, TWSR
CPI temp, 0x80
Brně fout

Vooral wij duidelijk de TWI interrupt-vlag met (1--TWINT), de anderen zijn gewoon om hen te houden op het wanneer wij temp in TWCR laden. Als we niet hebben (1--TWEA) en (1--TWEN) dan zij zou worden ingesteld op nul in het register van de TWCR in de volgende regel. Dan wachten we totdat de TWI is voltooid en weer beschikbaar is. We controleren vervolgens het register van de status om te zien dat de gegevensbyte is ontvangen, opgeslagen in TWDR en er is een acknowledge terug gestuurd.

LDS-playercashH, TWDR

Dit laadt de gegevensbyte die we van de regel in het register van onze playercashH kregen.

LDI temp, (1--TWINT) | (1--TWEA) | (1--TWEN)
St TWCR, temp
rcall tw_wait
LDS temp, TWSR
CPI temp, 0x80
Brně fout

Precies zoals hierboven, wij ontvangen een gegevensbyte, erkennen en controleren van de status.

LDS-playercashL, TWDR

Ditmaal slaan we de gegevensbyte in playercashL. Hierin zal onze totale met de dobbelstenen.

LDI temp, (1--TWINT) | (1--TWEA) | (1--TWEN)
St TWCR, temp
rcall tw_wait
LDS temp, TWSR
CPI temp, 0xA0
Brně fout
rjmp tw_return

Inschakelen van de TWI, krijgen de volgende gegevensbyte, controleert u de status om ervoor te zorgen is het STOP signaal en ten slotte Spring naar onze label opruimen en afsluiten.

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

Onze foutafhandelingsroutine doet niets, maar alle 1's laden in het display tonen ons dat iets misgegaan en daarna opnieuw van de interrupt.

Nu dat we onze display "playercash" registreert geladen, noemen we de "loadcash"-routine die zal hen omzetten in decimale cijfers en weer te geven.

LDI temp, (1--TWINT) | (1--TWEA) | (1--TWEN) | (1--TWIE)
St TWCR, temp
rcall loadcash
pop temp
Sei
Réti

Het bovenstaande wordt opnieuw ingeschakeld de TWIE zodat het opnieuw van de interrupt handler op 0x0030 uitvoeren zal wanneer er een interrupt TWI optreedt. Vervolgens wij pop onze temp terug uit de stack, global interrupts re-toe te laten en terug te keren naar waar we werden genoemd. Het volgende is onze tw_wait-subroutine die identiek is aan die wordt gebruikt in de Master code:

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

Tot slot, hier is onze display_off-routine die zichzelf:

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

In de volgende stap geef ik de code en de video van de operatie.

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