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?