AVR Assembler handledning 3 (5 / 9 steg)

Steg 5: Timer/Counter 0




Ta en titt på bilden ovan. Detta är beslutet att göra processen för "PC" när någon påverkan utifrån "vattenflödet" vårt program. Första den gör när det blir en signal från utanför att ett avbrott har inträffat är det kontroller för att se om vi har satt "avbrott aktivera" lite för den typen av avbrott. Om vi inte har, sedan fortsätter det bara att köra vår nästa kodrad. Om vi har satt som särskilt avbrott aktivera lite (så att det finns en 1 i bit dit i stället för en 0) kommer det så kolla om huruvida vi har aktiverat "globala avbrott", om inte det kommer återigen gå till nästa rad i koden och fortsätta. Om vi har aktiverat globala avbryter också, kommer att då gå till programminne platsen av den typen av avbrott (som visas i tabell 12-6) och utföra oavsett kommando vi har placerats där. Så låt oss se hur vi har genomfört detta i vår kod.

Återställ märkt avsnitt i vår kod börjar med följande två rader:

Reset:
LDI temp, 0b00000101
ut TCCR0B, temp

Som vi redan vet, detta läser in i temp (dvs R16) numret direkt efter, som är 0b00000101. Sedan skriver det här numret till registret kallas TCCR0B med kommandot "ut". Vad är detta register? Nåväl, låt oss chef över till sidan 614 i databladet. Detta är mitt i en tabell som sammanfattar alla registren. På adress 0x25 hittar du TCCR0B. (Nu vet du var line "out 0x25, r16" kom från i min un-Kommenterad version av koden). Vi ser av kodsegmentet ovan att vi har satt det 0: e och 2: a bitars och rensat alla resten. Genom att titta på tabellen kan du se att detta innebär att vi har satt CS00 och CS02. Kan nu chef över till kapitel i databladet kallas "8-bitars Timer/Counter0 med PWM". I synnerhet, gå till sidan 107 i det kapitlet. Du kommer att se samma beskrivning av registret "Timer/Counter kontroll registrera B" (TCCR0B) som vi såg i registret Sammanfattning tabell (så vi kunde komma direkt här, men jag ville se hur man använder sammanfattande tabeller för framtida referens). Databladet fortsätter att ge en beskrivning av varje bitar i detta register och vad de gör. Vi kommer att hoppa över allt som för nu och vända blad till tabell 15-9. Den här tabellen visar "Klockan Välj Bit beskrivningen". Nu titta ner tabellen tills du hittar den rad som motsvarar de bitar som vi just satt i registret. Linjen säger "clk/1024 från prescaler)". Vad detta betyder är att vi vill ha Timer/Counter0 (TCNT0) kryssa längs med en hastighet som är CPU frekvens dividerat med 1024. Eftersom vi har våra microcontroller matas av en 16MHz kristalloscillator innebär det att andelen som vår CPU körs instruktionerna är 16million instruktioner per sekund. Så som vår TCNT0 counter kommer att kryssa är sedan 16million/1024 = 15625 gånger per sekund (prova med olika klockan Välj bitar och se vad som händer - kom ihåg vår filosofi?). Låt oss hålla antalet 15625 på baksidan av vårt sinne för senare och gå vidare till de följande två kodrader:

LDI temp, 0b00000001
STS TIMSK0, temp

Detta anger 0. biten av ett register som kallas TIMSK0 och rensar alla resten. Om du tar en titt på sidan 109 i databladet ser du att TIMSK0 står för "Timer/Counter avbryta Mask Register 0" och vår kod har anges 0. som heter TOIE0 som står för "Timer/Counter0 Overflow avbryta aktivera"... Det finns! Nu kan du se vad detta handlar om. Nu har vi "avbryta aktivera bitars som" som vi ville från det första beslutet i vår bild överst. Så nu allt vi behöver göra är att aktivera "globala avbrott" och vårt program kommer att kunna svara på dessa typ av avbrott. Inom kort kommer vi att ge global avbryter, men innan vi gör det du kan ha varit förvirrad av något... Varför i helsike jag använde kommandot "sts" Kopiera till TIMSK0 registret i stället för den vanliga "ut"?

När du ser mig använda en instruktion som du inte har sett förut är det första du bör göra vända till sida 616 i databladet. Detta är "Anvisning ställa Summary". Nu hitta instruktionen "STS" som är den jag använt. Det står att det tar ett nummer från ett R register (vi använde R16) och "Store direkt till SRAM" plats k (i vårt fall ges av TIMSK0). Så varför har vi att använda "sts" som tar 2 klockcykler (se sista kolumnen i tabellen) för att lagra i TIMSK0 och vi bara behövde "out", som äger endast en klockcykel, lagra i TCCR0B innan? För att besvara denna fråga måste vi gå tillbaka till våra register sammanfattande tabell på sidan 614. Du ser att TCCR0B registret finns på adressen 0x25 men också på (0x45) rätt? Detta innebär att det är ett register i SRAM, men det är också en viss typ av register kallas en "port" (eller i/o-registret). Om man tittar på tabellen instruktion Sammanfattning bredvid kommandot "ut" kommer du att se att det tar värden från "arbetande registren" gillar R16 och skickar dem till en PORT. Så kan vi använda "out" när du skriver att TCCR0B och rädda oss en klockcykel. Men nu ser upp TIMSK0 i tabellen register. Du ser att den har adressen 0x6e. Detta är utanför intervallet för portar (som är endast den första 0x3F av SRAM) och så du måste falla tillbaka till med kommandot sts och med två CPU klockcykler det. Läs anmärkning 4 slutet av instruktion översiktstabellen på sidan 615 just nu. Också märka att alla våra input och output portar, som PORTD är belägna längst ned i tabellen. Till exempel PD4 är lite 4 på adress 0x0b (nu ser du varifrån alla 0x0b grejer kom i min un-kommenterade kod!)... Okej, snabb fråga: har du ändrat "sts" för att "ut" och se vad som händer? Kom ihåg vår filosofi! bryta det! bara ta inte mitt ord för saker.

Okej, innan vi går vidare, vända sig till sidan 19 i databladet för en minut. Du ser en bild av dataminne (SRAM). De första 32 register i SRAM (från 0x0000 till 0x001F) är "general purpose arbetande registren" R0 genom R31 som vi använder hela tiden som variabler i vår kod. Nästa 64 registren är I/O portar upp till 0x005f (dvs. de som vi talade om med de FN-varierade adresserna bredvid dem i registret bord som vi kan använda kommandot "ut" istället för "sts") slutligen i nästa avsnitt av SRAM innehåller alla andra register i tabellen Sammanfattning upp till adress 0x00FF, och slutligen resten är inre SRAM. Snabbt, låt oss nu till sidan 12 för en sekund. Där ser du en tabell av "general purpose arbetande register" som vi använder alltid som vår variabler. Du ser den tjocka linjen mellan nummer R0 till R15 och sedan R16 till R31? Den linjen är därför använder vi alltid R16 som den minsta och jag kommer att komma in i det lite mer i nästa handledning där vi måste också de tre 16-bitars indirekt adress register, X, Y och Z. Jag kommer inte få in det ännu men eftersom vi inte behöver det nu och vi är att få köra fast nog här.

Vänd tillbaka en sida till sida 11 i databladet. Du kommer att se ett diagram över SREG registret längst upp till höger? Du ser det lite 7 registrets kallas "Jag". Nu gå ner på sidan och läsa beskrivningen av lite 7... Yay! Det är den globala avbryta aktiverar lite. Det är vad vi behöver att passera genom det andra beslutet i våra diagrammet ovan och tillåta timer/counter overflow avbrott i vårt program. Nästa rad i vårt program bör därför läsa:

SBI SREG, jag

som anger biten kallas "Jag" i SREG registret. Men i stället för detta har vi använt instruktionen

SEI

i stället. Denna bit är som så ofta i program att de bara gjorde ett enklare sätt att göra det.

Okej! Nu har vi fått overflow avbrotten redo att gå så att våra "jmp overflow_handler" kommer att genomföras så fort något inträffar.

Innan vi går vidare, ta en snabb titt på SREG registret (Status Register) eftersom det är mycket viktigt. Läs vad varje flaggor representerar. Särskilt kommer att många av de instruktioner som vi använder ställa och kontrollera dessa flaggor hela tiden. Till exempel kommer vi senare att använda kommandot "KPI" vilket betyder "jämför omedelbart". Ta en titt på tabellen instruktion Sammanfattning för denna instruktion och märker hur många flaggor den sätter i kolumnen "flaggor". Dessa är alla flaggor i SREG och vår kod kommer att ställa dem och kontrollera dem hela tiden. Du kommer snart se exempel. Slutligen är den sista biten av denna del av koden:

Färgtemp
ut TCNT0, temp
SBI DDRD, 4

Den sista raden här är ganska uppenbart. Det anger bara den 4: e lite Data riktning registrera för PortD orsakar PD4 som ska ut.

Den första anger variabeln temp till noll och sedan kopieras som till TCNT0 registret. TCNT0 är vår Timer/Counter0. Detta ställer det till noll. Så snart som datorn utför denna linje i timer0 börjar på noll och räkna med en hastighet av 15625 gånger i sekunden. Problemet är detta: TCNT0 är en "8-bit" register rätt? Så vad är det största talet som en 8-bitars register kan hålla? Det är väl 0b11111111. Detta är nummer 0xFF. Som är 255. Så ser du vad som händer? Timern zippa längs öka 15625 gånger per sekund och varje gång det når 255 det "svämmar över" och går tillbaka till 0 igen. Samtidigt som det går tillbaka till noll det signal en Timer Overflow avbryta. Datorn får detta och vet du vad den gör vid nu rätt? Japp. Det går till programminne plats 0x0020 och utför den instruktion som det finner där.

Stor! Om du fortfarande med mig då är du en outtröttlig superhjälte! Låt oss hålla igång...

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 10

Välkommen till handledning 10!Ledsen att det tog så lång tid för att få denna nästa avbetalning ut men detta är en ganska hektisk tid på året. I alla fall, är här det!Vi har kommit långt och du förmodligen redan är kompetenta nog att skriva många int...

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