AVR Assembler Övningsexempel 4 (2 / 9 steg)

Steg 2: Första utkast till koden



Den första versionen av koden vi ska skriva att köra denna krets kallas "brute force" metod. Vi kommer bara skriva ett program som fungerar och inte oroa dig ännu om att göra den kompakt och "vacker". Vi kommer att göra det mer elegant senare. Det sättet jag gör saker är att se till att du kan få ditt program arbetar och gör vad den gör utan att införa alltför många nya begrepp. En gång du har den arbetande, då vi kommer att justera saker med nya koncept en bit i taget så att programmet fungerar fortfarande korrekt på varje iteration. Så om något går fel, vet du exakt var problemet kommer ifrån.

Så låt oss börja med följande program att rulla tärningarna. Du bör sätta ihop det, ladda upp den och se till att det fungerar på din mikroprocessor.

;********************************
; Skrivet av: 1o_o7
; datum: < 2014|11|01 >
; version: 1.0
; filen sparas som: paradise1.asm
; för AVR: atmega328p
; klockfrekvens: 16MHz
;********************************

; Programmera funcion:---
;
; En tärning roller
;
; Lysdioderna på PC0 till 5
; och en center på PB1
; Knappen på PB0
; anoder på PB4 och PB5
;
;--------------------------------

.nolist
.include ". / m328Pdef.inc"
.lista

;=================
; Förklaringar:

.def temp = r16
.def flödar över = r17
def die1 = r18
def die2 = r19
.def millisekunder = r20
.def utsäde = r21

;=================
; Början av Program

.org 0x0000
rjmp Reset
.org 0x0020; Timer0 spill handler
rjmp overflow_handler

;=================

Reset:
LDI temp, 0b00000011
ut TCCR0B, temp; TCNT0 i FCPU/64-läge, så 250000 cnts/SEK
LDI temp, 249
ut OCR0A, temp; toppen av disk på 250 räknas/spill
; så Buffertspill inträffar varje 1/1000 SEK
; Detta innebär ett dataspill varje 1ms
LDI temp, 0b00000010
ut TCCR0A, temp; återställa TCNT0 på värdet i OCR0A
STS TIMSK0, temp; Aktivera timern Overflow avbryter
SEI; Aktivera global avbryter

LDI temp, 0b11111110
ut DDRB, temp; PB0 ingång resten utdata
LDI temp, 0b11111111
ut DDRC, temp; PortC alla utgång

viktigaste:
ser temp
ut PORTB, temp; alla PortB på 5V
ut PORTC, temp; alla PortC på 5V
rcall button_push; vänta tills knappen
rcall random; få rand tal die1, die2
rcall dice; Ställ in tärningarna lysdioder
ser härda; Set temp för cykel
rcall cykel. Animera tärningar kasta
rcall displayen. Visa resultatet
rjmp huvudsakliga

button_push:
sbic PINB, 0; hoppa över om PB0 är GND
rjmp button_push
ret

Random:
; att generera slumptal
Lägg till die1, utsäde
swap utsäde
rcall fördröjning
Lägg till die2, utsäde
CLC
D1:
CPI die1, 6. Jämför die1 med 5
brlo d2; om die1 < 6 rulla sedan
Johan die1, 6. annars subtrahera 6
rjmp d1; gå tillbaka och jämföra igen
D2:
CPI die2, 6. Jämför die2 med 6
brlo rullen. om die < 6 då rulla
Johan die2, 6. annars subtrahera 6
rjmp d2; gå tillbaka och jämföra igen
rulle:
Inc die1; Lägg till 1 så mellan 1 och 6
Inc die2
ret

Dice:
CPI die1, 1. Jämför die1 med 1
brne PC + 2. om inte lika inte ställa in die1
LDI die1, 0b01111111; 7th bit iväg betecknar en 1
CPI die2, 1. Jämför die2 med 1
brne PC + 2. om inte lika inte ställa in die2
LDI die2, 0b01111111

CPI die1, 2
brne PC + 2
LDI die1, 0b11011110
CPI die2, 2
brne PC + 2
LDI die2, 0b11011110

CPI die1, 3
brne PC + 2
LDI die1, 0b01011110
CPI die2, 3
brne PC + 2
LDI die2, 0b01011110

CPI die1, 4
brne PC + 2
LDI die1, 0b11010010
CPI die2, 4
brne PC + 2
LDI die2, 0b11010010

CPI die1, 5
brne PC + 2
LDI die1, 0b01010010; en 4 bitar med 7: e lite off så 5
CPI die2, 5
brne PC + 2
LDI die2, 0b01010010

CPI die1, 6
brne PC + 2
LDI die1, 0b11000000
CPI die2, 6
brne PC + 2
LDI die2, 0b11000000
ret

cykel:
rol härda; Shift bitar kvar med sjal runt omkring
LDI millisekunder, 100. fördröjning (upp till 250 ms)
rcall fördröjning
SEK; SREG bär flaggan
ut PORTC, temp; PortC börjar som 0b11111110
sbrc temp, 6. hoppa över om bit 6 rensas
rjmp cykel. annars loop tillbaka upp
ret

display:
SBI PORTB, 0; SET-knappen off
SBI PORTB, 1. stänga av centrera ledde
LDI millisekunder, 2. ställa in en kort fördröjning
SBI PORTB, 4. Aktivera die1
CBI PORTB, 5. stänga av die2
SBRs die1, 7. hoppa över om center ledde bort
CBI PORTB, 1. slå på center ledde om det behövs
ut PORTC, die1; slå på andra
rcall försening. kort fördröjning
SBI PORTB, 1. stänga av centrera ledde
CBI PORTB, 4. stänga av die1
SBI PORTB, 5. Aktivera die2
SBRs die2, 7. hoppa över om center ledde bort
CBI PORTB, 1. slå på center ledde om det behövs
ut PORTC, die2; slå på andra
rcall försening. kort fördröjning
sbic PINB, 0; utgång till main om knappen trycker
rjmp displayen. slinga till toppen
ret

fördröjning:
CLR svämmar över
sec_count:
cpse flödar över, millisekunder
rjmp sec_count
ret

overflow_handler:
Inc översvämningar; ökar värdet 1000 gånger / SEK
Lägg till utsäde, svämmar över
Reti

Se Steg
Relaterade Ämnen

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

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

Enklaste AVR parallell port programmerare

Hej, är detta min första instructables, som handlar om avr programmerare. Detta är den enklaste krets med vilka AVR (Atmega serie, Attiny serien, AT90S serien) microcontrollers kan programmeras. Det finns en hel del programmerare, men detta är enkel...

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

Mitt svar på WS2811 med en AVR sak

första off - vill sägaBra om du Alan Burlison.Detta är inte menat att uppsamlare du på något sätt. Din kod gjorde det det måste göra. Stor framgång. Min första reaktion i en forum kommentar var faktiskt riktat mot folk som när det gäller icke-arbetan...

Fattig mans AVR speldosa

detta är en enkel AVR speldosa, kostar ca 10$ för att bygga.DISCLAIMER: Detta projekt är vad man skulle kalla en SMOP, "en enkel fråga om programmering". Det innebär att det är av trivial komplexitet men långa... så om du kan tolerera tristess i...

Montering av Dragon Rider 500 för användning med AVR Dragon

inte länge sedan företaget Atmel kom ut med ett bra verktyg för användning med AVR microcontrollers kallas AVR Dragon. Denna lilla USB-enhet ger proffs och amatörer både förmågan att använda: I System programmering (ISP), JTAG, felsöka tråd och hög s...

16-nyckel knappsatsen avkodning med en AVR MCU

detta instructable visar dig hur gränssnittet en 16-nyckel knappsats till din AVR microcontroller och läsa nyckeln när en tangent är nedtryckt. Jag ska presentera knappsatsen först, sedan 74HC922 16-nyckel dekodern IC som pin-saving mekanism, sedan s...