AVR Assembler handledning 10 (4 / 10 steg)

Steg 4: TWI kommunikation översikt



I den här guiden vill vi ställa in kommunikationen mellan våra dice-roller och våra 4-siffrig display så att resultatet från tärningsslag visas på displayen. Vi lätt bara kunde använda den "rulla dina egna" metod för kommunikation som vi gjorde innan med våra "register analyzer" och dice rullen, men, i framtiden handledning kommer vi att lägga fler komponenter och vi vill alla av dem för att kunna kommunicera med varandra. Det är så mycket bättre om vi använder ett protokoll som bara använder två kablar och kan fortfarande kommunicera med flera slav domänkontrollanter. Det är precis vad det tolerabla VECKOINTAGET byggdes till AVR microcontroller gör. Så lära vi nu dig att använda den.

Du kommer att vända sig till kapitel 22, sida 206, i ATmega328P databladet där det diskuterar det tolerabla VECKOINTAGET. Det vore en god idé att granska det och få en allmän överblick över hur det fungerar. Vi kommer att använda lätt metoden för att komma igång som att titta på exempelkoden de ger på sidan 216 och ändra den för våra ändamål. Just nu vi bara kommunicera mellan två mikrokontroller och så denna kod är ganska mycket allt vi behöver. Senare kommer vi att expandera på den men vi kommer att täcka det extra materialet när vi faktiskt behöver.

Här är koden fragmentet som de ger i databladet:

LDI r16, (1--TWINT) | (1--TWS) | (1--TWEN)
ut TWCR, r16
wait1:
i r16, TWCR
SBRs r16, TWINT
rjmp wait1
i r16, TWSR
Andi r16, 0xF8
CPI r16, START
brne fel
LDI r16, SLA_W
ut TWDR, r16
LDI r16, (1--TWINT) | (1--TWEN)
ut TWCR, r16
wait2:
i r16, TWCR
SBRs r16, TWINT
rjmp wait2:
i r16, TWSR
Andi r16, 0xF8
CPI r16, MT_SLA_ACK
brne fel
LDI r16, DATA
ut TWDR, r16
LDI r16, (1--TWINT) | (1--TWEN)
wait3:
i r16, TWCR
SBRs r16, TWINT
rjmp wait3
i r16, TWSR
Andi r16, 0xF8
CPI r16, MT_DATA_ACK
brne fel
LDI r16, (1--TWINT) | (1--TWEN) | (1--TWSTO)
ut TWCR, r16

Observera att i ovanstående kod uttalanden som

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

faktiskt ska ha "<" i dem i stället för den "-" tecken men av någon anledning den dumma redaktören att Instructables har valt att ge oss gillar att göra antaganden om vad vi skriver och raderas allt efter en "<" när du försöker publicera den. Detta beror på att den antar att när du skriver "koden" är det html och allt efter en "<" är en länk eller instruktion att inte visas. Den lägger även till den
radbrytning symboler tillbaka i slumpmässigt gånger så att jag får allt rätt, och nästa gång jag loggar in på, jag ser att koden har blivit alla en lång rad med"
"är där radbrytningarna ska vara! Argh. Tyvärr, om jag försöker att skriva vår kod i någon annan typ, som "citat" eller "lista" eller "vanlig text" det kommer att göra antaganden på avstånd och formatering och det kommer inte att tillåta jag till har kodrader på olika linjer utan dubbel avstånd mellan dem och indrag. Alla förstöra utseendet på koden och gör det svårt för dig att läsa ordentligt. Jag använda formatet "kod" avsedda för html och arbeta bara runt problemet delar. Vad de egentligen behöver är en typ liknar den LaTeX en kallas "ordagrant" där bara skrivs ut ordagrant vad du skriver och inte försöka kuk med det. Anwyay, du förmodligen börjar se några av anledningarna till varför jag gillar kommandoraden redaktörer (som vi) och kommandoraden kodning bättre än IDE: s och HTML/Java baserat redaktörer. Dessutom är en mer störning att om du skriver saker i en annan editor och sedan klistra in denna som den tar bort allt av din formatering och klistrar in det hela som en lång rad som du sedan har att gå igenom och formatera om! Detta redaktör är tröttsamt och irriterande. Skriver dessa tutorials har varit en övning i tålamod och tolerans, låt mig säga och när vi är färdiga om jag inte har drivits till alkoholism och receptbelagda droger, jag är säker på att jag kommer att vara kvalificerad för ett liv som munk Benedictine eller Bhuddist.

Usch! Okej! Låt oss få att fungera.

Om du undersöka ovanstående kodfragmentet ser du att det är avgränsade i flera block med wait1, wait2 och wait3 märkt loopar. Inuti varje av dessa väntar vi flaggan TWINT ställas in att visa att det tolerabla VECKOINTAGET har avslutad vad vi senast berättade det att göra. Mellan dessa vänta block är koden för att starta kommunikation, för att överföra slavadress av vilka microcontroller vi vill prata med, att överföra uppgifterna till den slaven, och slutligen att stoppa överföringen. Detta resulterar i en enda byte i data som överförs.

Innan vi fortsätter med kodfragmentet överföring bör du ta ditt exemplar av m328Pdef.inc filen och gå till det avsnitt som behandlingen TWI. Du kommer att se definitionerna av de register som associeras med det tolerabla VECKOINTAGET och namnen på de olika bitarna i dessa register. I koden fragmentet ovan, som vanligt, använder vi namnen på bitarna och vänster SKIFT funktion snarare än bitarstal så att koden är lättare att läsa. Assembler bryr sig inte om. Som jag har nämnt flera gånger i förflutnan, om du ville skriva

LDI r16, 0b10010100

ut 0xbc, r16

Istället för

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

ut TWCR, r16

Det skulle fungera mycket väl, i själva verket assembler ser den första en, men du måste vara regn-man att förstå koden sex månader från och med nu och skulle du ha några dator vänner eftersom alla försöker läsa din kod hatar du. Jag bara nämna det igen för att påminna om skillnaden mellan vad är en del av församlingen språkutveckling och vad är bara etiketter vi har skrivit oss för att hjälpa oss att förstå vår kod. Det är alla m328Pdef.inc inkluderar filen är. Om du ville gå igenom include-filen och ändra namnen på allt kunde du göra det också. Man kan kalla TWINT "beavis" och TWEN "butthead" om du ville, men då du skulle ha svårt att läsa i databladet. I själva verket är alla att "Kompis", killen (eller dator) som skrev inkluderingsfilen gjorde, i huvudsak, bara gick igenom databladet och tittade på alla tabeller definiera registren (som den på sidan 217 definiera TWCR registret) och skrev .equ uttalanden för dem och deras bitar. Så om du skulle skriva kod för en ny mikrokontroller och du inte har en include-fil kan du helt enkelt använda databladet och definiera bitar och register som du använder i din kod överst i ditt program med några .equ uttalanden. Hur som helst, kan gå vidare...

Det finns några saker i kodfragmentet ovan som inte i include-filen. Till exempel START, DATA och fel. DATA är de register som du vill skicka. FEL är en subrutin som du kanske vill skriva till fånga problem med överföring och ta itu med dem. START är det tillstånd i TWI status register (TWSR) som du vill jämföra med. Detta ändrar enligt vad du gör. Till exempel om du master mikrokontroller i sändaren läge sedan tabell 22-2 ger statuskoder som du kan välja mellan. På motsvarande sätt ge tabeller 22-3 22-4, 22-5 statuskoder för Master mottagare, slav sändare och slav mottagare lägen respektive. Så beroende på vilken mikrokontroller i nätverket din kod är samlats för dig kommer att ange START därmed.

Så vad du verkligen bör göra om du vill förstå det här är att gå igenom den kod fragment rad-för-rad, tittar upp registren i databladet och räkna ut exakt vad som händer vid varje steg. Vi kommer att skriva vår egen version av ovanstående kodfragmentet i vår dice-roller och vår 4-siffrig display kod. I denna tutorial kommer vår dice rulle att befälhavaren och den 4-siffriga displayen kommer att vara slav. Men i framtiden blir det fler slavar och det blir mer masters inklusive en som kör showen och kommunicerar med dem alla. Vi ska gå igenom detaljerade driften av det tolerabla VECKOINTAGET som läser varje kodrad vår så att vi vet exakt vad som händer på linjen, och varför vi måste koppla raderna och kommandon vi gör. Dock måste vi först titta på hur du ansluter två mikrokontroller tillsammans och vad exakt som händer över varje rad som TWI.

Övning 2: Leta upp registret minnesadresser i databladet för den TW kontroll Register (TWCR), den TW Status Register (TWSR) och den TW Data registrera (TWDR). Sedan undersöka prov koden ovan som är kopierat direkt från databladet. Kan du hitta ett flagrant fel vilket gör koden obrukbar på ATmega328P? Kan du lista ut de förändringar som behövs för att fixa det?

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