AVR Assembler Tutorial 2 (2 / 4 steg)
Steg 2: Skriva assemblerkod
Skriv följande kod i en text arkivera alarmerat pushbutton.asm och kompilera den med avra som du gjorde i handledning 1.
Observera att i denna kod vi har massor av kommentarer. Varje gång assembler ser ett semikolon det kommer hoppa över resten av raden och gå vidare till nästa rad. Det är bra programmering praxis (särskilt i assembler!) tungt kommentera din kod så att när du återvänder till det i framtiden kommer att du vet vad du gjorde. Jag ska kommentera saker ganska mycket i första några tutorials så att vi vet exakt vad som händer och varför. Senare när vi bli lite bättre på församlingen kodning ska jag kommentera saker lite mindre detaljerat.
;************************************
; Skrivet av: 1o_o7
; datum: < 2014|10|23 >
; version: 1.0
; filen sparas som: pushbutton.asm
; för AVR: atmega328p
; klockfrekvens: 16MHz
;************************************
; Programmera funktion:---
; Svängar på en led ansluten till PB0 (digital 0)
; När du trycker en knapp ansluten till PD0
;-----------------------------------------------
;
; PB0 (normalt 0V)---> LED -> 220 Ohm---> 5V
;
; PD0 (normalt 5V)---> knappen---> GND
;
.nolist
.include ". / m328Pdef.inc"
.lista
;==============
; Deklarationer
.def temp = r16; utnämner temp arbetande register r16
;=================
; Början av Program
rjmp Init; första raden avrättades
;============
Init:
ser härda; Ange alla bitar i temp till 1.
ut DDRB, temp; ställa in lite som 1 på Data riktning I/O
; Registrera dig för PortB, som är DDRB, som
; PIN-kod som utgång, en 0 skulle ställa det klämmer fast som indata
; så här, är alla PortB stift utgångar (värdet 1)
LDI temp, 0b11111110; Ladda för "omedelbar" numret temp registret
; om det var bara ld då det andra argumentet
; måste vara en minnesplats i stället
ut DDRD, temp; MV temp till DDRD, resultatet är att PD0 input
; och resten är utgångar
Färgtemp; alla bitarna i temp anges till 0 är
ut PortB, temp; som alla bitar (dvs stift) i PortB till 0V
LDI temp, 0b00000001; Ladda omedelbara nummer för att härda
ut PortD, temp; flytta temp till PortD. PD0 har en dra upp motstånd
; (dvs in 5V) eftersom den har en 1 i det lite
; resten är 0V sedan 0's.
;======================
; Huvuddelen av programmet:
Main:
i temp, PinD; PinD innehar tillståndet för PortD, kopiera detta för att härda
; Om knappen är ansluten till PD0 detta kommer att vara
; 0 när knappen trycks, 1 annars sedan
; PD0 har en dra upp motstånd det är normalt på 5V
ut PortB, temp; skickar 0 och 1 är läsa ovan till PortB
; Detta innebär att vi vill ha LED ansluten till PB0,
; När PD0 är låg, det anger PB0 till låg och vända
; på LED (eftersom den andra sidan av LED är
; ansluten till 5V och detta kommer PB0 att 0V så
; strömmen flyter)
rjmp huvudsakliga; loopar tillbaka till början av Main
Observera att denna tid vi har många fler kommentarer i vår kod, men vi har också ett rubrikavsnitt som ger lite information om vem som skrev det, när det skrevs, vilken typ av controller den skrevs för, och jag har även tagit med en enkel krets diagrammet för att visa hur du konstruerar kretsen. Resten av koden är också uppdelad i avsnitt.
Efter att du har sammanställt ovanstående kod bör du ladda den på mikrokontroller och se att det fungerar. LAMPAN bör slå på medan du trycker på knappen och sedan stänga av igen när du släpper. Jag har visat hur det ser ut på bilden.