AVR Assembler Tutorial 10 (4 / 10 stap)

Stap 4: TWI communicatie overzicht


In deze tutorial wil wij de communicatie tussen onze dobbelstenen-roller en onze 4-cijferige weergave zo instellen dat het resultaat van de dobbelstenen rollen op het display verschijnt. We kunnen heel gemakkelijk gebruiken de "roll uw eigen" methode van communiceren die we met onze "register analyzer" en de rol van de dobbelstenen, echter voorheen, in de toekomst tutorials die we zullen het toevoegen van meer onderdelen en wij willen ze allemaal te kunnen communiceren met elkaar. Dus het is veel beter als we gebruiken een protocol waarmee alleen twee draden gebruikt en nog steeds met meerdere slaaf domeincontrollers kunt communiceren. Dat is precies wat de TWI gebouwd in de AVR microcontroller doet. Zo zullen we nu leren hoe het te gebruiken.

U zult willen wenden tot hoofdstuk 22, pagina 206, in het gegevensblad van de ATmega328P waar het bespreekt de TWI. Het zou een goed idee om kennisnemen van het en het krijgen van een algemeen overzicht van hoe het werkt. Wij zullen met behulp van de eenvoudige methode van de slag die is te kijken naar de voorbeeldcode die ze op pagina 216 geven en wijzigen voor onze doeleinden. Op dit moment zijn wij alleen communicatie tussen twee microcontrollers en dus deze code vrij is veel alles wat we nodig hebben. Later zullen we moeten ingaan op het, maar wij zullen behandelen dat extra materiaal wanneer we eigenlijk nodig hebben.

Hier is het codefragment dat zij in het gegevensblad geven:

LDI r16, (1--TWINT) | (1--TWS) | (1--TWEN)
uit TWCR, r16
Wait1:
in r16, TWCR
SBRs r16, TWINT
rjmp wait1
in r16, TWSR
Andi r16, 0xF8
CPI r16, START
Brně fout
LDI r16, SLA_W
uit TWDR, r16
LDI r16, (1--TWINT) | (1--TWEN)
uit TWCR, r16
Wait2:
in r16, TWCR
SBRs r16, TWINT
rjmp wait2:
in r16, TWSR
Andi r16, 0xF8
CPI r16, MT_SLA_ACK
Brně fout
LDI r16, gegevens
uit TWDR, r16
LDI r16, (1--TWINT) | (1--TWEN)
wait3:
in r16, TWCR
SBRs r16, TWINT
rjmp wait3
in r16, TWSR
Andi r16, 0xF8
CPI r16, MT_DATA_ACK
Brně fout
LDI r16, (1--TWINT) | (1--TWEN) | (1--TWSTO)
uit TWCR, r16

Merk op dat in de bovenstaande code verklaringen zoals

(1--TWINT) | (1--TWEN)

eigenlijk worden geacht te hebben "<" in hen in plaats van de "-" ondertekent, maar met een bepaalde bedoeling de Dom editor die Instructables heeft ervoor gekozen om ons graag aannames over wat wij schrijven en wordt verwijderd alles na een "<" wanneer u probeert om het te publiceren. Dit is omdat het veronderstelt dat wanneer u het schrijven van "code" is het html en alles na een "<" is een koppeling of instructie niet moet worden weergegeven. Het voegt ook de
regeleinde symbolen terug in op willekeurige tijden zodat ik alles goed, en de volgende keer dat ik me aanmeld op, ik zie dat de code alle één lange regel met is geworden"
"is waar de regeleinden zou moeten zijn! Argh. Helaas, als ik probeer te schrijven van onze code in een ander type, zoals "citaat" of "list" of "gewone tekst" zal het veronderstellingen op de afstand en opmaak en het zal niet toestaan dat mij om de coderegels op verschillende lijnen zonder dubbele afstand tussen hen en inspringen. Die allemaal het uiterlijk van de code ruïne en maken het moeilijk voor u om te lezen het goed. Dus ik gebruik van de indeling van de "code" die is bedoeld voor html en gewoon werken rond het probleem onderdelen. Wat ze echt nodig hebben is een vergelijkbaar met de LaTeX één genaamd "letterlijk" waar het gewoon letterlijk uitprinten zal wat u typt en niet proberen om lul met het type. Anwyay, je bent waarschijnlijk beginnen te zien een aantal van de redenen waarom ik hou van opdrachtregel editors (zoals vi) en opdrachtregel beter dan IDE van codering en HTML/Java gebaseerde editors. Ook is een meer ergernis dat als je dingen in een andere editor schrijft en vervolgens kopiëren/plakken in dit één het verwijdert alle opmaak en geplakt het allemaal als één lange regel die je dan moet doorlopen en formatteert! Deze editor is saai en vervelend. Het schrijven van deze tutorials is een oefening in geduld en tolerantie, laat ik zeggen, en tegen de tijd dat we klaar zijn als ik niet alcoholisme en voorschrift medicijnen verdreven zijn, ik weet zeker dat ik zal worden gekwalificeerd voor een leven als een monnik Benedictijnse of Bhuddist.

Oef! Oke! Laten we om te werken.

Als u het bovenstaande codefragment u ziet dat het is verdeeld in verschillende blokken door wait1 bekijkt, wait2 en wait3 label lussen. Binnen elk van deze wachten we de TWINT vlag worden ingesteld om aan te geven dat de TWI klaar is met wat we laatst vertelde om te doen. Tussen deze wachten blokken is de code om te beginnen met communicatie, voor het verzenden van het adres van de slaaf van welke microcontroller we praten willen met verstrekken de gegevens die slaaf, en ten slotte om te stoppen met de transmissie. Dit resulteert in een enkele byte van de gegevens die worden overgebracht.

Voordat we verder gaan met het codefragment transmissie, u moet grijp uw exemplaar van de m328Pdef.inc bestand en ga naar de sectie behandelt TWI. Hier ziet u de definities van de registers die zijn gekoppeld aan de TWI en de namen van de diverse bits in deze registers. In het bovenstaande codefragment, zoals gebruikelijk, gebruiken we de namen van de bits en de schuifbewerking naar links in plaats van het aantal bits zodat de code eenvoudiger te lezen is. De assembler schelen niet al. Zoals ik heb gezegd meerdere malen in het verleden, als je wilde schrijven

LDI r16, 0b10010100

uit 0xbc, r16

In plaats van

LDI r16, (1--TWINT) | (1--TWEN)

uit TWCR, r16

het zou heel goed werken, in feite de assembler ziet de ene, maar u zou moeten worden regen-man te begrijpen uw code van zes maanden vanaf nu en u geen computer vrienden zou hebben omdat iedereen probeert te lezen van uw code zou u haat. Ik noem slechts het weer om u te herinneren voor het onderscheid tussen wat is onderdeel van de assembler en wat zijn alleen labels hebben we onszelf om te helpen ons te begrijpen onze code geschreven. Dat is alles wat de m328Pdef.inc zijn bestand is. Als je wilde het include-bestand doorlopen en wijzigen van de namen van alles kon u dat ook doen. Je zou kunnen noemen TWINT "beavis" en TWEN "butthead" als je wilde, maar dan heb je zou moeite lezen van het gegevensblad. In feite, is al dat 'Buddy', de kerel (of computer) schreef dat het include-bestand deed, in wezen, gewoon ging door het gegevensblad en bekeek alle tabellen definiëren de registers (zoals op pagina 217 definiëren van het TWCR-register) en schreef de verklaringen van de .equ voor hen en hun bits. Dus als u waren het schrijven van code voor een nieuwe microcontroller en je hoefde niet het include-bestand kun je gewoon gebruik van het gegevensblad en definiëren van de bits en registers die u in uw code aan de bovenkant van uw programma met een paar .equ verklaringen gebruikt. Anyway, laat gaan...

Er zijn een paar dingen in het bovenstaande codefragment die niet in het include-bestand. Bijvoorbeeld START, gegevens en fout. GEGEVENS is het register dat u wilt verzenden. FOUT is een subroutine die u schrijven wilt te vangen van de problemen met de transmissie en ermee omgaan. START is de voorwaarde in het TWI status register (TWSR) die u vergelijken wilt met. Dit is afhankelijk van wat je aan het doen zijn. Bijvoorbeeld, als u de meester microcontroller in zender modus bent dan tabel 22-2 geeft de statuscodes waaruit u kunt kiezen. Ook geven tabellen 22-3, 22-4 en 22-5 de statuscodes voor de Master-ontvanger, Slave zender en ontvanger van de Slave modi respectievelijk. Dus afhankelijk van welke microcontroller in uw netwerk wordt uw code geassembleerd voor zult u START dienovereenkomstig instellen.

Dus wat je echt moet doen als je wilt begrijpen van dit spul is door de code fragment-per-regel, het opzoeken van de registers in het gegevensblad gaan en erachter te komen wat precies bij elke stap gebeurt er. We zullen onze eigen versie van het bovenstaande codefragment in onze dobbelstenen-roller en onze 4-cijferige weergave code schrijven. In deze tutorial zullen onze dobbelstenen roller de kapitein en de 4-cijferige weergave zullen de slaaf. Echter in de toekomst zullen er meer slaven en zal er meer masters, waaronder een die loopt van de show en communiceert met ze allemaal. We gaan door de gedetailleerde werking van de TWI zoals het leest elke regel van onze code, zodat wij weten precies wat er gebeurt op de regel, en daarom moeten we de regels draad en de opdrachten die wij uitvoeren. Wij moeten echter eerst om te kijken hoe de twee microcontrollers om elkaar te verbinden en wat precies is gaande over elk van de TWI-lijnen.

Oefening 2: Opzoeken in het register geheugenlocaties in het gegevensblad voor de TW besturingselement registreren (TWCR), de TW Status registreren (TWSR) en de TW gegevens registreren (TWDR). Bekijkt u de code van de steekproef gegeven boven die rechtstreeks uit het gegevensblad gekopieerd. Vindt u een flagrante fout waardoor de code niet meer werkt op de ATmega328P? Kunt u postuur uiterlijk de veranderingen die nodig zijn om het te bevestigen?

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