Innehållsförteckning:

AVR Assembler Tutorial 1: 5 Steg
AVR Assembler Tutorial 1: 5 Steg

Video: AVR Assembler Tutorial 1: 5 Steg

Video: AVR Assembler Tutorial 1: 5 Steg
Video: AVR Ассемблер. Урок 1. Вводный. AVR Assembler. Lesson 1. Promo. 2024, Juli
Anonim
AVR -monteringshandledning 1
AVR -monteringshandledning 1

Jag har bestämt mig för att skriva en serie självstudier om hur man skriver monteringsspråkprogram för Atmega328p som är mikrokontrollern som används i Arduino. Om människor förblir intresserade fortsätter jag att lägga ut en i veckan eller så tills jag tar slut på fritiden eller annars slutar folk läsa dem.

Jag kör Arch linux och arbetar med en atmega328p-pu som är installerad på en brödbräda. Du kan göra det på samma sätt som jag eller så kan du helt enkelt ansluta en arduino till din dator och arbeta på mikrokontrollen på det sättet.

Vi kommer att skriva program för 328p som det som finns i de flesta arduinoer, men du bör notera att samma program och tekniker också kommer att fungera för någon av Atmel -mikrokontroller och senare (om det finns intresse) kommer vi att arbeta med några av de andra också. Detaljer om mikrokontrollern finns i Atmel -datablad och bruksanvisningen. Jag bifogar dem till detta instruerbara.

Här är vad du behöver:

1. En brödbräda

2. En Arduino, eller bara mikrokontroller

3. En dator som kör Linux

4. Avra assembler som använder git: git clone https://github.com/Ro5bert/avra.git eller om du använder ubuntu eller ett debianbaserat system skriver du bara "sudo apt install avra" så får du både avr assembler och avrdude. MEN om du får den senaste versionen med github får du också alla nödvändiga inkluderingsfiler, med andra ord har den redan m328Pdef.inc- och tn85def.inc -filerna.

5. avrdude

Den kompletta uppsättningen av mina AVR-monteringsstudier finns här:

Steg 1: Konstruera en testbräda

Konstruera en testbräda
Konstruera en testbräda

Du kan helt enkelt använda din arduino och göra allt i dessa självstudier om det om du vill. Men eftersom vi pratar om kodning i samlingsspråk är vår filosofi i sig att ta bort alla periferier och interagera direkt med själva mikrokontrollern. Så tycker du inte att det skulle vara roligare att göra det på det sättet?

För de av er som håller med kan du dra ut mikrokontrollen ur din arduino och sedan börja med att bygga en "Breadboard Arduino" genom att följa instruktionerna här:

På bilden visar jag mitt upplägg som består av två fristående Atmega328p på en stor brödbräda (jag vill kunna behålla den föregående handledningen trådbunden och laddad på en mikrokontroller medan jag arbetar med nästa). Jag har strömförsörjningen inställd så att den översta skenan är 9V och alla andra är 5V från spänningsregulatorn. Jag använder också en FT232R breakout board för att programmera chipsen. Jag köpte dem och satte bootloaders på dem själv, men om du bara drog ut en ur en Arduino är det redan bra.

Observera att om du försöker detta med en ATtiny85 kan du bara få Sparkfun Tiny Programmer här: https://www.sparkfun.com/products/11801# och sedan helt enkelt ansluta den till USB -porten på din dator. Du måste installera en bootloader på Attiny85 först och det enklaste sättet är bara att använda Arduino IDE. Du måste dock klicka på filen och inställningarna och sedan lägga till den här nya Boards URL: https://raw.githubusercontent.com/damellis/attiny/ide-1.6.x-boards-manager/package_damellis_attiny_index.json som kommer gör att du kan installera startladdaren (om din ATtiny85 inte redan följde med en.)

Steg 2: Installera Assembler och Avrdude

Du kan nu ladda ner och installera assembler och avrdude från länkarna i det första steget i den här självstudien. Det är troligt att om du redan har arbetat med Arduinos så har du redan avrdude installerat.

När du har installerat avra kommer du att märka att det finns en underkatalog som medföljer den som kallas "källor" och i den katalogen finns en massa inkluderade filer. Dessa är alla mikrokontroller som du kan programmera med avra. Du kommer att märka direkt att det inte finns någon fil för 328p som vi använder här. Jag har bifogat en. Filen ska kallas m328Pdef.inc och du bör lägga in den i katalogen inklusive eller någon annanstans du vill. Vi kommer att inkludera det i våra församlingsspråkprogram. Allt detta är att ge var och en av registren i mikrokontrollernamnen från databladet så att vi inte behöver använda deras hexadecimala namn. Ovanstående fil innehåller "pragmadirektiv" eftersom den är utformad för C- och C ++ - programmering. Om du blir trött på att se montören spotta ut "ignorerar pragmadirektivet" klagomål, gå bara in i filen och ta bort eller kommentera alla rader som börjar med #pragma

Okej, nu när du har din mikrokontroller redo, din monterare redo och din programmerare redo kan vi skriva vårt första program.

Obs! Om du använder ATtiny85 istället för ATmega328P behöver du en annan inkluderingsfil som heter tn85def.inc. Jag kommer också att bifoga den (notera att jag var tvungen att kalla den tn85def.inc.txt så att Instructables skulle tillåta mig att ladda upp den.) MEN om du fick avra assembler från github har du redan båda dessa filer med sig. Så jag rekommenderar att skaffa det och kompilera det själv: git -klon

Steg 3: Hej världen

Målet med denna första handledning är att bygga det första standardprogrammet man skriver när man lär sig något nytt språk eller utforskar någon ny elektronikplattform. "Hej världen!." I vårt fall vill vi helt enkelt skriva ett monteringsspråkprogram, montera det och ladda upp det till vår mikrokontroller. Programmet gör att en lysdiod tänds. Att få en LED att "blinka" som de gör för det vanliga Arduino hejvärldsprogrammet är faktiskt ett mycket mer komplicerat program i monteringsspråk och så kommer vi inte att göra det ännu. Vi kommer att skriva den enklaste "bara ben" -koden med minimal onödig ludd.

Anslut först en LED från PB5 (se pinout -diagrammet) som också kallas Digital Out 13 på en arduino, till ett 220 ohm motstånd, sedan till GND. D.v.s.

PB5 - LED - R (220 ohm) - GND

Nu ska jag skriva programmet. Öppna din favorittextredigerare och skapa en fil som heter "hello.asm"

; hej.asm

; tänder en lysdiod som är ansluten till PB5 (digital ut 13). inkludera "./m328Pdef.inc" ldi r16, 0b00100000 ut DDRB, r16 ut PortB, r16 Start: rjmp Start

Ovanstående är koden. Vi kommer att gå igenom det rad-för-rad om en minut, men låt oss först se till att vi kan få det att fungera på din enhet.

När du har skapat filen monterar du den i en terminal enligt följande:

avra hej.asm

detta kommer att samla din kod och skapa en fil som heter hello.hex som vi kan ladda upp den enligt följande:

avrdude -p m328p -c stk500v1 -b 57600 -P /dev /ttyUSB0 -U blixt: w: hej.hex

om du använder en breadboard -arduino måste du trycka på reset -knappen på breadboard -arduino strax innan du utför kommandot ovan. Observera att du kanske också måste lägga till en sudo framför eller köra den som root. Observera också att på vissa arduino (som Arduino UNO) måste du förmodligen ändra bitrate till -b 115200 och porten -P /dev /ttyACM0 (om du får ett felmeddelande från avrdude om en ogiltig enhetssignatur lägger du bara till en - F till kommandot)

Om allt har fungerat som det ska ska du nu ha en lysdiod tänd …. "Hej världen!"

Om du använder ATtiny85 kommer avrdude -kommandot att vara:

avrdude -p attiny85 -c usbtiny -U flash: w: hej.hex

Steg 4: Hello.asm rad för rad

För att avsluta denna inledande handledning går vi igenom programmet hello.asm rad för rad för att se hur det fungerar.

; hej.asm

; tänder en lysdiod som är ansluten till PB5 (digital ut 13)

Allt efter ett semikolon ignoreras av monteraren och därför är dessa två första rader helt enkelt "kommentarer" som förklarar vad programmet gör.

.inkludera "./m328Pdef.inc"

Den här raden uppmanar montören att inkludera filen m328Pdef.inc som du laddade ner. Du kanske vill lägga detta i en katalog med liknande inkluderingsfiler och sedan ändra raden ovan för att peka på den där.

ldi r16, 0b00100000

ldi står för "ladda omedelbart" och uppmanar montören att ta ett arbetsregister, r16 i det här fallet, och ladda in ett binärt tal i det, 0b00100000 i det här fallet. 0b framför säger att vårt tal är i binärt. Om vi ville hade vi kunnat välja en annan bas, till exempel hexadecimal. I så fall skulle vårt antal ha varit 0x20 vilket är hexadecimalt för 0b00100000. Eller så kunde vi ha använt 32 som är bas 10 decimal för samma tal.

Övning 1: Försök ändra numret i raden ovan till hexadecimal och sedan till decimal i koden och kontrollera att det fortfarande fungerar i varje fall.

Att använda binärt är dock enklast på grund av hur portar och register fungerar. Vi kommer att diskutera portarna och registren för atmega328p mer detaljerat i framtida självstudier, men för närvarande ska jag bara konstatera att vi använder r16 som vårt "arbetsregister", vilket betyder att vi bara kommer att använda det som en variabel som vi lagrar siffror i. Ett "register" är en uppsättning av 8 bitar. Betyder 8 punkter som antingen kan vara 0 eller 1 (`av 'eller' på '). När vi laddar det binära numret 0b00100000 i registret med raden ovan har vi helt enkelt lagrat det numret i registret r16.

ut DDRB, r16

Denna rad uppmanar kompilatorn att kopiera innehållet i registret r16 till DDRB -registret. DDRB står för "Data Direction Register B" och det sätter upp "stiften" på PortB. På pinout -kartan för 328p kan du se att det finns 8 stift märkta PB0, PB1,…, PB7. Dessa stift representerar "bitarna" i "PortB" och när vi laddar det binära numret 00100000 i DDRB -registret säger vi att vi vill att PB0, PB1, PB2, PB3, PB4, PB6 och PB7 ska sättas som INPUT -stift eftersom de har 0: orna i dem, och PB5 är inställd som ett OUTPUT -stift eftersom vi satte ett 1 på den platsen.

ut PortB, r16

Nu när vi har fixerat riktningarna på stiften kan vi nu ställa in spänningarna på dem. Ovanstående rad kopierar samma binära nummer från vårt lagringsregister r16 till PortB. Detta sätter alla stiften till 0 volt förutom stift PB5 till HÖG vilket är 5 volt.

Övning 2: Ta en digital multimeter, anslut den svarta kabeln till jord (GND) och testa sedan var och en av stiften PB0 genom PB7 med den röda ledningen. Är spänningarna på var och en av stiften exakt de som motsvarar att sätta 0b00100000 i PortB? Om det finns några som inte är det, varför tror du att det är så? (se stiftkartan)

Start:

rjmp Start

Slutligen är den första raden ovan en "etikett" som märker en plats i koden. I det här fallet märker du den platsen som "Start". Den andra raden säger "relativ hopp till etiketten Start". Nettoresultatet är att datorn placeras i en oändlig slinga som bara fortsätter att cykla tillbaka till Start. Vi behöver detta eftersom vi inte kan få programmet att bara avslutas eller falla från en klippa, programmet måste bara fortsätta att köra för att ljuset ska förbli tänt.

Övning 3: Ta bort ovanstående två rader från din kod så att programmet faller från en klippa. Vad händer? Du bör se något som ser ut som det traditionella "blink" -programmet som används av Arduino som deras "hej värld!". Varför tror du att det fungerar så här? (Tänk på vad som måste hända när programmet faller från en klippa …)

Steg 5: Slutsats

Om du har kommit så långt, grattis! Du kan nu skriva monteringskod, montera den och ladda den på din mikrokontroller.

I den här självstudien har du lärt dig hur du använder följande kommandon:

ldi hregister, nummer laddar ett tal (0-255) i ett övre halvregister (16-31)

ut ioregister, register kopierar ett nummer från ett arbetsregister till ett I/O -register

rjmp -etiketten hoppar till raden i programmet märkt med "label" (som inte kan vara längre än 204 instruktioner bort - dvs. relativ hoppning)

Nu när dessa grunder är ur vägen kan vi fortsätta skriva mer intressant kod och mer intressanta kretsar och enheter utan att behöva diskutera mekaniken för att kompilera och ladda upp.

Jag hoppas att du har gillat den här introduktionshandledningen. I nästa handledning kommer vi att lägga till en annan kretskomponent (en knapp) och utöka vår kod till att inkludera ingångsportar och beslut.

Rekommenderad: