AVR Assembler handledning 10 (5 / 10 steg)

Steg 5: Inkoppling av TWI



Vi kommer att genomföra det tolerabla VECKOINTAGET som ett avbrott subrutin i slav (4-siffrig display) och som en normal subrutin i master (den dice-rollern). Detta sätt varje gång det är ett kast (dvs när du trycker på knappen), dice rullen kommer att kommunicera resultatet till displayen som visar resultatet i de två sista siffrorna i displayen.

Så, till exempel en rulle av dubbla sexor skulle leda till överföring av nummer 12 till displayen och detta att tolkas av rutinen vi skrev tidigare i denna tutorial och visas som en 1 och 2 på de två sista 7-segment visar. Observera att vi inte ens behöver det "höga" register som orsakat oss så mycket problem i binärfilen till decimal konvertering kod. Du har nog räknat ut nu, är vår slutliga användning för den 4-siffriga displayen inte helt enkelt att Visa tärningskast. Vi gör det för nu eftersom det är ett enkelt sätt att få kommunikation koden kommer utan att lägga för mycket nya grejer på en gång.

Så låt oss börja genom att analysera hur det tolerabla VECKOINTAGET fungerar. Vi börjar med våra Dice rulle och Lägg ett par rader kod bara för att få saker och ting. Både på displayen och i dice rulle måste vi få SDA och SCL stiften på ingång och hög. Dvs.

CBI DDRC, 4 < br > sbi PORTC, 4 < br > cbi DDRC, 5 < br > sbi PORTC, 5

Nu, i avsnittet INIT i koden låt oss lägga till följande

LDS temp, PRR < br > andi temp, 0b01011111 < br > sts PRR, temp

Detta anger den PRTWI biten och de BRTIM0 bitarna i makt minskade Register till 0. Se sidan 45 i databladet. Detta ser till både modulen TWI och Timer/Counter0-modulen är vaken. Vi behöver Timer/Counter0 för våra "delay" kommandon som vi använde på andra ställen i koden. Det tolerabla VECKOINTAGET en är den vi koncentrerar oss på för tillfället.

Nu vill vi ställa in SCL (seriell klocka linje) frekvens. Vi använder formeln på sidan 213. Nu, för våra nuvarande ändamål, jag kommer att ställa in frekvens så lågt som jag bara kan så att vi kan analysera signalen lite lättare. Jag kan då sätta den högre igen senare men för nu kan göra det lilla. Här är formeln:

SCL freq = CPU / [16 + 2 * TWBR * Prescaler]

Om jag vill detta så låg som möjligt, bör jag ställa TWBR och Prescalar så hög som möjligt. TWI bithastighet registret, TWBR, är en 8-bitars register och så det största värdet jag kan göra det är 255 (vilket är alla 1, dvs TWBR = 0b11111111), också den prescaler bitar definieras i tabell 22-7 på sidan 232. Dessa är bit 0 och 1 del TWSR (två Wire interface Status registrera). Tabellen säger oss att om vi vill ha den högsta prescaler bör jag välja TWPS1 = 1 och TWPS0 = 1 och detta ger oss en prescaler faktor på 64. Därav kommer min följetong klockfrekvens för min TWI linje, med hjälp av formeln ovan, att

16 MHz / (16 + 2 * 255 * 64) = 16000000Hz/32656 = 489.9 Hz eller ca 490 Hz.

Så kommer att vi göra detta i vår INIT del av koden med raderna:

LDI temp, 255 < br > sts TWBR, temp < br > ldi temp, 0b00000011 < br > sts TWSR, temp

Nu när vi börjar det tolerabla VECKOINTAGET kommer våra SCL klockfrekvens av 490 cyklar per understöder (490 Hz). Vi nu lägga till följande rader till starta upp det tolerabla VECKOINTAGET som anges på sidan 217 (dvs Master sändaren läge):

LDI temp, (1--TWINT) | (1--TWSTA) | (1--TWEN) < br > sts TWCR, temp

och kom ihåg att-tecken i ovanstående är tänkt för att vara "mindre än" tecken men dum Instructables redaktören gillar inte dem.

Detta anger 3 bitar i de två tråd Control Register (TWCR) och du kan läsa om dessa bitar (vippströmbrytare) i beskrivningen av detta register på sidorna 230 och 231. I huvudsak, TWINT bit värdet 1 rensar flaggan två wire avbryta, TWSTA bitars som till en definierar dice rullen som befälhavaren på raden och en start villkor signal ner två wire interface linjen, slutligen TWEN lite att en möjliggör det tolerabla VECKOINTAGET och aktiverar gränssnittet.

Det är allt för nu! Bara sätta dessa linjer i INIT delen av koden, montera den, och låt oss se vad som händer.

Vi vill koppla saker så att vår TWI kablar gå från vår diceroller till våra displayen. Vi behöver inte skriva något för att visa ännu förutom att vi vill att SDA och SDC stiften vara INPUT och 5V på båda tärningarna rullen och displayen. Nu om vi slår på våra diceroller och våra display och koppla in ett oscilloskop mellan våra SCL linje och GND ser vi räckvidd spår visas i de två första bilderna. Du kan se att det är 490 Hz precis som vi ville att det skulle vara. [se bilder 1 och 2]

Nu, om du har läst avsnittet i databladet om det tolerabla VECKOINTAGET kommer du att märka att de säger att du behöver dra upp motstånd till 5V på varje linje som SDA och SCL. Varför är detta? Vi tittade bara på vår signal och det ser ut som en mycket trevlig 490 Hz fyrkantsvåg utan något annat än våra interna pullup motstånd på varje stift! Det är exakt typ av signal som vi vill för kommunikation (som vi kommer att diskutera mer i lite).

Vad skulle pullup motstånd på SDA och SCL linjerna? Tja, gör de helt enkelt signalen gå tillbaka till 5V snabbare. Om jag skulle dra ner till 0V och sedan släppa, skulle det våren tillbaka till 5V mycket snabbare med dessa extra extern pullup motstånd än med bara interna dem på stiften. På frekvensen av 490Hz gör det dock ingen skillnad. Signalen är bra utan dem. I själva verket kommer vi att använda 490Hz som vår TWI frekvens eftersom vår ansökan inte behöver gå snabbare. Jag tror inte någon kommer att ta hand om du kan bara skicka 490 databitar per sekund. Om vi hade ett program som behövs för hög hastighet vi skulle öka vår klockfrekvens och kanske måste vi lägga till externa dra upp motstånd.

Låt mig nu visa dig varför du kanske en dag vill sätta pullup motstånd på raderna. Låt oss öka våra SCL frekvens. Gå tillbaka till raderna i avsnittet INIT i dice rulle koden (Master anger hastigheten på raden inte slav) och ändra det så att vår frekvens är den högst möjliga denna gång istället för de lägsta. Detta innebär i vår formel

SCL freq = CPU / [16 + 2 * TWBR * Prescaler]

Vi vill att nämnaren vara så liten som möjligt. Så kan bara lämna prescaler ensam och TWBR = 0. Då kommer vår frekvens att 16MHz/16, vilket är 1MHz (Observera att Processorn fortfarande kommer att vara 16 gånger större än SCL-värdet).

Nu monterar det, kör det och granska oscilloskop tracen (jag använder en DSO Nano oscilloskop från Seeedstudio.com som är en mycket billig oscilloskop som kommer väl till pass med denna typ av grejer). [Se bild 3]

Nu ta en titt på nya spår. Du märker genast att SCL linjen på denna hög frekvens, ännu inte har tid att komma till 5V innan den skickas tillbaka till 0 igen! Så vi inte får en trevlig fyrkantsvåg. Vi behöver en lägre frekvens så att åtminstone vi pendlar mellan 0V och 5V. Om vi övergår nu till sidan 308 ser vi att tabell 29-14 ger de egenskaper och begränsningar av det tolerabla VECKOINTAGET. Det säger den som SCL klockfrekvens bör vara högst 400kHz. Inte konstigt att våra spår sög så illa. Så låter TWBR inställd på 12 och stänga av prescaler bitar. Detta kommer att ge SCL freq = 16000/(16+24) = 400kHz. Montera sedan, ladda upp och titta på nya spår.

Jag kommer inte att bifoga en bild. Låt oss bara säga vi fortfarande få ett skit spår som inte riktigt gör det till toppen. Vi skulle kunna lägga till några motstånd till linjen på denna punkt, men låt oss göra frekvensen bara lite lägre så att du kan verkligen se vad som händer.

Kan ställa in TWBR till 72. Detta ger oss en frekvens på 100kHz. Ta en titt på bilden av spårningen. [Se bilderna 4 och 5]

Nu ser du att signalen pendlande mellan 0V och 5V men det blir inte tillbaka till 5V mycket snabbt! I själva verket tar det så lång tid att få tillbaka upp till 5V att när det blir det är det redan dags att gå tillbaka till 0V igen. Detta är inte vad vi vill om vi vill sända data.

Ta en titt på figur 22-2 på sidan 207. Du kommer se hur data överförs. Processorn i huvudsak jämför signalerna på de två linjerna (SDA SCL) och det bestämmer vad data är av hur de jämför. Det är därför CPU klockan måste vara minst 16 gånger högre frekvens än SCL klockan. Processorn behöver de extra cyklerna att skilja vad som händer med signalerna som SCL och SDA och fatta beslut baserade på dessa. Det behöver två typer av regioner som visas i diagrammet. Det behöver regioner där data är "stable" menande det är stadigt på antingen 5V eller på 0V för en viss tidsperiod. Det måste också regioner där signalen förändras, antingen kommer från 0V upp till 5V eller 5V till 0V. Vi kommer att diskutera hur det blir information ur detta på en sekund, men min poäng är att vi i den 100 kHz-signal som vi bara tittade på, inte har en tillräckligt lång "stabil" region. I huvudsak har vi inget annat än övergångar. Så det kommer inte att fungera. För att åtgärda detta lägger vi pullup motstånd till de två raderna. Detta kommer att orsaka signalen för att få tillbaka upp till 5V snabbare och ge oss en längre stabil region på toppen. Låt oss prova det. Ta två resistorer. Jag kommer att använda 4.7kOhm motstånd. Då binder dem i rader som i diagrammet på sidan 206. Jag kommer att bifoga en bild på mitt ledningar jobb. [se bild 6]

Nu titta på tracen! Vi har signalen hoppar tillbaka upp till 5V och återstående platt för en stund före falla snabbt tillbaka till 0V. Med andra ord har vi en fyrkantsvåg trace som Processorn använder för att skicka data. [se bild 7 och bild 8]

Så det är därför de föreslår att du lägger till pullup motstånd till raderna. I själva verket om du vill räkna ut vilken storlek motstånd du behöver du kan antingen räkna ut linjen kapacitans och använda formeln de ger i tabell 29-14 eller du kan helt enkelt titta på oscilloskop tracen och byta motstånd tills du får en trevlig fyrkantsvåg.

Hur som helst! Vi kommer gå tillbaka till 490 Hz vi sätta våra TWBR tillbaka till 255 och våra prescaler tillbaka till 64 och sedan vi kan bli av pullup motstånd helt och hållet och bara koppla en mikrokontroller till den andra. De inre pullups bra för dra upp 490 Hz signalen tillräckligt snabbt för att få en fin fyrkantsvåg som vi redan visade i bilderna. Titta på den sista bild [9] visar den 490 Hz våg med pullup motstånd och jämföra det med de första två bilder som visar den samma 490 Hz våg utan pullup motstånd. Se någon skillnad? Inte jag heller. Så kommer att vi avstå från motstånden och bara koppla vår dice rulle direkt till våra 4-siffrig display.

Nu när vi vet hur raderna SDA och SCL arbete (dvs. med Kvadrera vinkar signalerar) vi ska nu kika på hur data är överförs med hjälp av dem.

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