Indholdsfortegnelse:

AVR Assembler Tutorial 1: 5 trin
AVR Assembler Tutorial 1: 5 trin

Video: AVR Assembler Tutorial 1: 5 trin

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

Jeg har besluttet at skrive en række selvstudier om, hvordan man skriver samlingssprogrammer til Atmega328p, som er mikrokontrolleren, der bruges i Arduino. Hvis folk forbliver interesserede, vil jeg fortsætte med at udsende en om ugen eller deromkring, indtil jeg løber tør for fritid, eller ellers stopper folk med at læse dem.

Jeg kører Arch linux, og jeg arbejder på en atmega328p-pu opsat på et brødbræt. Du kan gøre det på samme måde som mig, eller du kan simpelthen tilslutte en arduino til din computer og arbejde på mikrokontrolleren på den måde.

Vi skriver programmer til 328p som den, der er i de fleste arduinoer, men du skal bemærke, at de samme programmer og teknikker også vil fungere for enhver af Atmel -mikrokontrollerne, og senere (hvis der er interesse), vil vi arbejde med nogle af også de andre. Detaljer om mikrokontrolleren findes i Atmel -databladene og instruktionssættet. Jeg vedhæfter dem til dette instruerbare.

Her er hvad du skal bruge:

1. Et brødbræt

2. En Arduino, eller bare mikrokontrolleren

3. En computer, der kører Linux

4. Avra -samleren ved hjælp af git: git -klon https://github.com/Ro5bert/avra.git, eller hvis du bruger ubuntu eller et debianbaseret system, skal du bare skrive "sudo apt install avra", og du får både avr -samleren og avrdude. Men hvis du får den nyeste version ved hjælp af github, får du også alle de nødvendige inkluderingsfiler, med andre ord har den allerede m328Pdef.inc og tn85def.inc filerne.

5. avrdude

Det komplette sæt af mine AVR assembler-øvelser kan findes her:

Trin 1: Konstruer et testbræt

Konstruer et testbræt
Konstruer et testbræt

Du kan simpelthen bruge din arduino og gøre alt i disse tutorials om det, hvis du vil. Men da vi taler om kodning i samlingssprog, er vores filosofi iboende at fjerne alle periferier og interagere direkte med selve mikrokontrolleren. Så synes du ikke, det ville være sjovere at gøre det på den måde?

For dem af jer, der er enige, kan du trække mikrokontrolleren ud af din arduino og derefter starte med at konstruere en "Breadboard Arduino" ved at følge instruktionerne her:

På billedet viser jeg min opsætning, som består af to selvstændige Atmega328p'er på et stort brødbræt (jeg vil gerne kunne beholde den tidligere tutorial kablet og indlæst på en mikrokontroller, mens jeg arbejder på den næste). Jeg har strømforsyningen sat op, så den aller øverste skinne er 9V, og alle de andre er 5V fra spændingsregulatoren. Jeg bruger også et FT232R breakout board til at programmere chipsene. Jeg købte dem og satte bootloadere på dem selv, men hvis du bare trak en ud af en Arduino, er den allerede fin.

Bemærk, at hvis du prøver dette med en ATtiny85, kan du bare få Sparkfun Tiny Programmer her: https://www.sparkfun.com/products/11801# og derefter blot tilslutte den til USB -porten på din computer. Du skal først installere en bootloader på Attiny85, og den nemmeste måde er bare at bruge Arduino IDE. Du skal dog klikke på filen og præferencer og derefter tilføje denne URL for nye bestyrelser: https://raw.githubusercontent.com/damellis/attiny/ide-1.6.x-boards-manager/package_damellis_attiny_index.json, som vil giver dig mulighed for at installere bootloaderen (hvis din ATtiny85 ikke allerede fulgte med en.)

Trin 2: Installer Assembler og Avrdude

Du kan nu downloade og installere assembler og avrdude fra linkene i det første trin i denne vejledning. Det er sandsynligt, at hvis du allerede har arbejdet med Arduino's, så har du allerede installeret avrdude.

Når du har installeret avra, vil du bemærke, at der er en underkatalog, der følger med, kaldet "kilder", og inde i mappen er der en masse inkluderede filer. Disse er alle de mikrokontrollere, du kan programmere med avra. Du vil straks bemærke, at der ikke er nogen fil til 328p, som vi bruger her. Jeg har vedhæftet en. Filen skal hedde m328Pdef.inc, og du skal lægge den inde i mappen inklusive eller andre steder, du kan lide. Vi vil inkludere det i vores samlingsprogrammer. Alt dette gør er at give hvert af registrene i mikrokontrollernavnene fra databladet, så vi ikke behøver at bruge deres hexidecimale navne. Ovenstående inkluderer -fil indeholder "pragmadirektiver", da den er designet til C- og C ++ - programmering. Hvis du bliver træt af at se samleren spytte "ignorere pragmadirektivet" klager, skal du bare gå ind i filen og slette eller kommentere alle linjerne, der begynder med #pragma

Okay, nu hvor du har din mikrokontroller klar, din montør klar og din programmør klar, kan vi skrive vores første program.

Bemærk: Hvis du bruger ATtiny85 i stedet for ATmega328P, skal du bruge en anden include -fil kaldet tn85def.inc. Jeg vil også vedhæfte det (bemærk jeg var nødt til at kalde det tn85def.inc.txt, så Instructables ville give mig mulighed for at uploade det.) Men hvis du fik avra assembler fra github, så har du allerede begge disse filer med. Så jeg anbefaler at få det og kompilere det selv: git -klon

Trin 3: Hej verden

Målet med denne første vejledning er at opbygge det første standardprogram, man skriver, når man lærer noget nyt sprog eller udforsker en ny elektronikplatform. "Hej Verden!." I vores tilfælde vil vi simpelthen skrive et montagesprogsprogram, samle det og uploade det til vores mikrokontroller. Programmet får en LED til at tænde. At få en LED til at "blinke", som de gør for det normale Arduino hejverdensprogram, er faktisk et meget mere kompliceret program i samlingssprog, og det gør vi ikke lige endnu. Vi kommer til at skrive den enkleste kode "bare knogler" med minimal unødvendig fnug.

Tilslut først en LED fra PB5 (se pinout -diagrammet), som også kaldes Digital Out 13 på en arduino, til en 220 ohm modstand, derefter til GND. Dvs.

PB5 - LED - R (220 ohm) - GND

Nu til at skrive programmet. Åbn din foretrukne teksteditor og opret en fil kaldet "hello.asm"

hej.asm

; tænder en LED, der er tilsluttet PB5 (digital ud 13). inkluderer "./m328Pdef.inc" ldi r16, 0b00100000 ud DDRB, r16 ud PortB, r16 Start: rjmp Start

Ovenstående er koden. Vi går igennem det linje for linje på et minut, men lad os først sikre os, at vi kan få det til at fungere på din enhed.

Når du har oprettet filen, samler du den i en terminal som følger:

avra hej.asm

dette samler din kode og opretter en fil kaldet hello.hex, som vi kan uploade den som følger:

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

hvis du bruger en breadboard -arduino, skal du trykke på reset -knappen på breadboard -arduinoen lige før du udfører ovenstående kommando. Bemærk, at du muligvis også skal tilføje en sudo foran eller udføre den som root. Bemærk også, at på nogle arduinoer (som Arduino UNO) skal du sandsynligvis ændre bitrate til -b 115200 og porten -P /dev /ttyACM0 (hvis du får en fejl fra avrdude om en ugyldig enheds signatur, skal du blot tilføje en - F til kommandoen)

Hvis alt har fungeret som det skal, vil du nu have en LED tændt….. "Hej verden!"

Hvis du bruger ATtiny85, vil avrdude -kommandoen være:

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

Trin 4: Hello.asm Linje for linje

For at afslutte denne indledende vejledning går vi linjen for linje igennem programmet hello.asm for at se, hvordan det fungerer.

hej.asm

; tænder en LED, der er tilsluttet PB5 (digital ud 13)

Alt efter et semikolon ignoreres af samleren, og derfor er disse to første linjer simpelthen "kommentarer", der forklarer, hvad programmet gør.

. inkludere "./m328Pdef.inc"

Denne linje fortæller assembler til at inkludere filen m328Pdef.inc, som du downloadede. Du vil måske lægge dette i en mappe med lignende include -filer og derefter ændre ovenstående linje for at pege på det der.

ldi r16, 0b00100000

ldi står for "belastning øjeblikkelig" og fortæller montøren til at tage et arbejdsregister, r16 i dette tilfælde, og indlæse et binært tal i det, 0b00100000 i dette tilfælde. 0b foran siger, at vores tal er i binært. Hvis vi ville, kunne vi have valgt en anden base, såsom hexidecimal. I så fald ville vores nummer have været 0x20, hvilket er hexadecimalt for 0b00100000. Eller vi kunne have brugt 32, som er basis 10 decimal for det samme tal.

Øvelse 1: Prøv at ændre tallet i linjen ovenfor til hexadecimal og derefter til decimal i din kode, og kontroller, at det stadig fungerer i hvert enkelt tilfælde.

Brug af binært er dog enklest på grund af måden porte og registre fungerer på. Vi vil diskutere porte og registre for atmega328p mere detaljeret i fremtidige selvstudier, men for nu vil jeg bare oplyse, at vi bruger r16 som vores "arbejdsregister", hvilket betyder, at vi bare vil bruge det som en variabel, som vi gemmer tal i. Et "register" er et sæt med 8 bits. Betydning 8 punkter, der enten kan være 0 eller 1 (`off 'eller` on'). Når vi indlæser det binære tal 0b00100000 i registret ved hjælp af ovenstående linje, har vi simpelthen gemt dette nummer i registret r16.

ud DDRB, r16

Denne linje fortæller kompilatoren om at kopiere indholdet af registret r16 til DDRB -registret. DDRB står for "Data Direction Register B", og det opsætter "benene" på PortB. På pinout -kortet til 328p kan du se, at der er 8 ben mærket PB0, PB1,…, PB7. Disse ben repræsenterer "bits" i "PortB", og når vi indlæser det binære nummer 00100000 i DDRB -registret, siger vi, at vi vil have PB0, PB1, PB2, PB3, PB4, PB6 og PB7 indstillet som INPUT -pins, da de har 0'er i dem, og PB5 er indstillet som en OUTPUT -pin, da vi satte et 1 på det sted.

ud PortB, r16

Nu hvor vi har fastlagt stifternes retninger, kan vi nu indstille spændingerne på dem. Ovenstående linje kopierer det samme binære tal fra vores lagerregister r16 til PortB. Dette sætter alle stifter til 0 volt undtagen pin PB5 til HIGH, som er 5 volt.

Øvelse 2: Tag et digitalt multimeter, sæt den sorte ledning i jorden (GND), og test derefter hver af stifterne PB0 gennem PB7 med den røde ledning. Er spændingerne på hver af stifterne nøjagtigt dem, der svarer til at sætte 0b00100000 i PortB? Hvis der er nogen, der ikke er det, hvorfor tror du så det er? (se pin -kortet)

Start:

rjmp Start

Endelig er den første linje ovenfor en "etiket", der mærker et sted i koden. I dette tilfælde mærkes dette sted som "Start". Den anden linje siger "relativ hop til etiketten Start." Nettoresultatet er, at computeren placeres i en uendelig loop, der bare bliver ved med at cykle tilbage til Start. Vi har brug for dette, fordi vi ikke kan få programmet til bare at slutte eller falde ned af en klippe, programmet skal bare fortsætte med at køre, for at lyset skal forblive tændt.

Øvelse 3: Fjern ovenstående to linjer fra din kode, så programmet falder ud af en klippe. Hvad der sker? Du bør se noget, der ligner det traditionelle "blink" -program, der bruges af Arduino som deres "hej verden!". Hvorfor tror du, det fungerer på denne måde? (Tænk på, hvad der skal ske, når programmet falder ud af en klippe …)

Trin 5: Konklusion

Hvis du er nået så langt, så tillykke! Du er nu i stand til at skrive samlingskode, samle den og indlæse den på din mikrokontroller.

I denne vejledning har du lært, hvordan du bruger følgende kommandoer:

ldi hregister, nummer indlæser et tal (0-255) i et øvre halvregister (16-31)

out ioregister, register kopierer et nummer fra et arbejdsregister til et I/O -register

rjmp label hopper til linjen i programmet mærket med "label" (som ikke må være længere end 204 instruktioner væk - dvs. relativ hop)

Nu hvor disse grundlæggende ting er ude af vejen, kan vi fortsætte med at skrive mere interessant kode og mere interessante kredsløb og enheder uden at skulle diskutere mekanikken ved at kompilere og uploade.

Jeg håber, at du har nydt denne indledende vejledning. I den næste vejledning tilføjer vi en anden kredsløbskomponent (en knap) og udvider vores kode til at omfatte inputporte og beslutninger.

Anbefalede: