AVR Assembler Tutorial 1 (4 / 5 steg)
Steg 4: Hello.asm rad-för-rad
För att avsluta denna inledande handledning kommer vi gå igenom det hello.asm programmet rad-för-rad att se hur det fungerar.
; hello.asm
; vänder på en LED som är ansluten till PB5 (digital ut 13)
Allt efter ett semikolon ignoreras av assembler och därmed dessa två första raderna är helt enkelt "kommentarer" förklarar vad programmet gör.
.include ". / m328Pdef.inc"
Den här raden instruerar assembler ska omfatta filen m328Pdef.inc som du hämtat. Du kanske vill sätta detta i en katalog av liknande filer och sedan ändra raden ovan till peka till den där.
LDI r16, 0b00100000
LDI står för "last omedelbar" och berättar assembler att ta ett fungerande register, r16 i detta fall, och läsa in ett binärt tal till det, 0b00100000 i detta fall. 0b framme säger att vårt nummer är i binärt. Om vi ville kunde vi ha valt en annan bas, som hexadecimalt. I så fall hade vårt nummer 0x20 som är hexadecimalt för 0b00100000. Eller vi kunde ha använt 32 som är basen 10 decimal för samma nummer.
Övning 1: Prova att ändra numret på raden ovanför till hexadecimalt och sedan till decimal i koden och kontrollera att det fortfarande fungerar i varje fall.
Med hjälp av binär är enklaste men på grund av den sätt hamnen och register arbete. Vi kommer att diskutera hamnarna och register över atmega328p i mer detalj i framtiden tutorials men för nu ska jag bara säga att vi använder r16 så, vår "arbetande register" som vi bara kommer att använda den som en variabel som vi lagrar numrerar i. Ett "register" är en uppsättning av 8 bitar. Vilket betyder 8 ställen som kan vara 0 eller 1 ("off" eller "på"). När vi läser in den binära tal 0b00100000 i registret med hjälp av raden ovan har vi helt enkelt sparat numret i registret r16.
ut DDRB, r16
Den här raden instruerar kompilatorn att kopiera innehållet i registret r16 in i DDRB-registret. DDRB står för "Data riktning registrera B" och sätter upp "pins" på PortB. På pinut kartan för 328p kan du se att det finns 8 stift märkt PB0, PB1,..., PB7. Dessa pins föreställa "bitar" av "PortB" och när vi läser in det binära talet 00100000 i DDRB register vi säger att vi vill ha PB0, PB1, PB2, PB3, PB4, PB6 och PB7 uppsättning som INPUT stiften eftersom de har 0's i dem används, och PB5 som en utgångsstiftet eftersom vi sätta en 1 på den platsen.
ut PortB, r16
Vi kan nu sätta spänningar på dem nu när vi har fasta riktningarna av stiften. Raden ovan kopierar samma binära nummer från våra lagring register r16 till PortB. Detta ställer alla stift till 0 volt utom pin PB5 till hög som är 5 volt.
Övning 2: Ta en digitala multimetern, plugg svart bly i marken (GND) och sedan testas varje stift PB0 genom PB7 med röda bly. Är spänningar på varje stift exakt de som motsvarar att sätta 0b00100000 i PortB? Om det finns några som inte finns, varför tror du att det är? (se pin karta)
Start:
rjmp Start
Slutligen är den första raden ovan en "label" som etiketter en plats i koden. I detta fall märkning som plats som "Start". Den andra raden säger "relativa hoppa på etiketten Start." Resultatet är att datorn är placerad i en oändlig loop som bara håller cykling tillbaka till Start. Vi behöver detta eftersom vi inte kan ha programmet bara avsluta, eller faller från en klippa, har programmet att bara hålla igång för att ljuset bo upplysta.
Övning 3: Ta bort ovanstående två rader från din kod så att programmet faller från en klippa. Vad händer? Du borde se något som ser ut som traditionella "blink" programmet används av Arduino som deras "hello world!". Varför tror du det fungerar detta sätt? (Tror om vad måste hända när programmet faller från en klippa...)