AVR Assembler handledning 3 (3 / 9 steg)
Steg 3: Blink.asm
Här är koden kommer vi att diskutera idag:
;************************************
; Skrivet av: 1o_o7
; datum: < 2014|10|29 >
; version: 1.0
; filen sparas som: blink.asm
; för AVR: atmega328p
; klockfrekvens: 16MHz (valfritt)
;************************************
; Programmera funcion:---
; räknas av sekunder av blinkar en LED
;
; PD4---> LED---> R (330 ohm)---> GND
;
;--------------------------------------
.nolist
.include ". / m328Pdef.inc"
.lista
;==============
; Förklaringar:
.def temp = r16
.def flödar över = r17
.org 0x0000; minnesplats (PC) för reset handler
rjmp Reset; JMP kostar 2 cpu-cykler och rjmp kostar endast 1
; så om du inte behöver hoppa över 8 k bytes
; du behöver bara rjmp. Vissa mikrokontroller därför endast
; har rjmp och inte jmp
.org 0x0020; minnesplats för Timer0 overflow handler
rjmp overflow_handler; gå hit om en timer0 spill avbrott inträffar
;============
Reset:
LDI temp, 0b00000101
ut TCCR0B, temp; ställa klocka Selector bitar CS00, CS01, CS02 till 101
; Detta sätter Timer Counter0, TCNT0 i FCPU/1024-läge
; så det fästingar på CPU freq/1024
LDI temp, 0b00000001
STS TIMSK0, temp; anges Timer Overflow avbryta aktiverar (TOIE0)
; Timer-avbrott Mask register (TIMSK0)
SEI; aktiverar global avbrott--motsvarar "sbi SREG, jag"
Färgtemp
ut TCNT0, temp; initiera Timer/Counter 0
SBI DDRD, 4. ställa in PD4 att produktionen
;======================
; Huvuddelen av programmet:
Blink:
SBI PORTD, 4. slå på lampan på PD4
rcall försening. dröjsmål är 1/2 andra
CBI PORTD, 4. stänga av lampan på PD4
rcall försening. dröjsmål är 1/2 andra
rjmp blink; loop tillbaka till början
fördröjning:
CLR översvämningar; uppsättning flödar över till 0
sec_count:
CPI översvämningar, 30; Jämför antalet översvämningar och 30
brne sec_count; filial för att tillbaka till sec_count om inte lika
ret; om 30 svämmar över har inträffat att blinka
overflow_handler:
Inc översvämningar; lägga till 1 till variabeln svämmar över
CPI översvämningar, 61; Jämför med 61
brne PC + 2. Program Counter + 2 (hoppa över nästa rad) om inte lika
CLR översvämningar; om 61 flödar över inträffade nollställs räknaren
Reti; returnera från avbrott
Som ni kan se är mina kommentarer lite mer kort nu. När vi vet vad kommandon i instruktionsuppsättningen gör behöver vi inte förklara det i kommentarer. Vi måste bara förklara vad som händer från synpunkt av programmet.
Vi kommer att diskutera vad alla innebär denna bit för bit, men först låt oss försöka få ett globalt perspektiv. Huvuddelen av programmet fungerar på följande sätt.
Först vi ställa in bit 4 i PORTD med "sbi PORTD, 4" detta skickar en 1 till PD4 som sätter spänningen till 5V på det klämmer fast. Detta kommer att slå på lampan. Vi sedan hoppa till "delay" subrutin som räknar ut 1/2 en sekund (vi kommer att förklara hur det gör detta senare). Vi återvänder sedan för att blinka och rensa bit 4 på PORTD som anger PD4 till 0V och därmed stänger av lysdioden. Vi sedan fördröja för en annan 1/2 sekund och sedan hoppa tillbaka till början av blink igen med "rjmp blink".
Ni kör den här koden och se att den gör vad den ska.
Och där har du det! Det är all denna kod gör fysiskt. Inre mekaniken i vad mikrokontroller gör är lite mer engagerade och det är därför vi gör denna tutorial. Så låt oss diskutera varje avsnitt i sin tur.