Innholdsfortegnelse:

AVR Assembler Opplæring 1: 5 trinn
AVR Assembler Opplæring 1: 5 trinn

Video: AVR Assembler Opplæring 1: 5 trinn

Video: AVR Assembler Opplæring 1: 5 trinn
Video: LDmicro 10: Регулятор температуры инкубатора (лестничное программирование ПЛК микроконтроллера с помощью LDmicro) 2024, Juli
Anonim
AVR Assembler Tutorial 1
AVR Assembler Tutorial 1

Jeg har bestemt meg for å skrive en serie opplæringsprogrammer om hvordan du skriver samlingsspråklige programmer for Atmega328p som er mikrokontrolleren som brukes i Arduino. Hvis folk forblir interessert, vil jeg fortsette å legge ut en i uken eller så til jeg går tom for fritid, ellers slutter folk å lese dem.

Jeg kjører Arch linux og jobber med et atmega328p-pu satt opp på et brødbrett. Du kan gjøre det på samme måte som meg, eller du kan ganske enkelt koble en arduino til datamaskinen og jobbe på mikrokontrolleren på den måten.

Vi skal skrive programmer for 328p som det som er i de fleste arduinoer, men du bør merke deg at de samme programmene og teknikkene også vil fungere for noen av Atmel -mikrokontrollerne, og senere (hvis det er interesse) vil vi jobbe med noen av de andre også. Detaljene om mikrokontrolleren finner du i Atmel -databladene og bruksanvisningen. Jeg knytter dem til dette instruerbare.

Her er hva du trenger:

1. Et brødbrett

2. En Arduino, eller bare mikrokontrolleren

3. En datamaskin som kjører Linux

4. Avra -samleren som bruker git: git -klon https://github.com/Ro5bert/avra.git, eller hvis du bruker ubuntu eller et debianbasert system, skriver du bare "sudo apt install avra", og du får både avr -assembler og avrdude. MEN hvis du får den nyeste versjonen ved hjelp av github, vil du også få alle nødvendige inkluderingsfiler, med andre ord har den allerede m328Pdef.inc- og tn85def.inc -filene.

5. avrdude

Det komplette settet med mine veiledninger for AVR-assembler finner du her:

Trinn 1: Konstruer et testbord

Bygg et testbord
Bygg et testbord

Du kan ganske enkelt bruke arduinoen din og gjøre alt i disse opplæringene om det hvis du vil. Men siden vi snakker om koding i samlingsspråk, er filosofien vår iboende å fjerne alle periferiene og samhandle direkte med selve mikrokontrolleren. Så tror du ikke det ville vært morsommere å gjøre det på den måten?

For de av dere som er enige, kan du trekke mikrokontrolleren ut av arduinoen din og deretter starte med å bygge en "Breadboard Arduino" ved å følge instruksjonene her:

På bildet viser jeg oppsettet mitt som består av to frittstående Atmega328p på et stort brødbrett (jeg vil kunne beholde den forrige opplæringen kablet og lastet på en mikrokontroller mens jeg jobber med den neste). Jeg har strømforsyningen satt opp slik at den aller øverste skinnen er 9V og alle de andre er 5V fra spenningsregulatoren. Jeg bruker også et FT232R breakout board for å programmere chipsene. Jeg kjøpte dem og satte bootloaders på dem selv, men hvis du bare dro en ut av en Arduino, er den allerede fin.

Vær oppmerksom på at hvis du prøver dette med en ATtiny85, kan du bare få Sparkfun Tiny Programmer her: https://www.sparkfun.com/products/11801# og deretter bare koble den til USB -porten på datamaskinen. Du må først installere en bootloader på Attiny85, og den enkleste måten er bare å bruke Arduino IDE. Du må imidlertid klikke på filen og preferanser, og deretter legge til denne URL-en til New Boards: https://raw.githubusercontent.com/damellis/attiny/ide-1.6.x-boards-manager/package_damellis_attiny_index.json som vil lar deg installere bootloader (hvis ATtiny85 ikke allerede hadde en.)

Trinn 2: Installer Assembler og Avrdude

Du kan nå laste ned og installere assembler og avrdude fra koblingene gitt på det første trinnet i denne opplæringen. Det er sannsynlig at hvis du allerede har jobbet med Arduino's, så har du allerede installert avrdude.

Etter at du har avra installert, vil du legge merke til at det er en underkatalog som følger med den som kalles "kilder", og i den katalogen er det en haug med inkluderingsfiler. Dette er alle mikrokontrollerne du kan programmere med avra. Du vil umiddelbart merke at det ikke er noen fil for 328p som vi bruker her. Jeg har lagt ved en. Filen skal kalles m328Pdef.inc, og du bør sette den inne i katalogen inkludert eller andre steder du liker. Vi vil inkludere det i våre språkprogrammer. Alt dette er å gi hvert av registerene i mikrokontrollernavnene fra databladet, slik at vi ikke trenger å bruke deres heksidesimale navn. Den ovennevnte inkluderer -filen inneholder "pragma -direktiver" siden den var designet for C og C ++ programmering. Hvis du blir lei av å se montøren spytte ut "ignorerer pragmadirektivet" klager bare gå inn i filen og slette eller kommentere alle linjene som begynner med #pragma

Ok, nå som du har mikrokontrolleren klar, montøren klar og programmereren klar, kan vi skrive vårt første program.

Merk: Hvis du bruker ATtiny85 i stedet for ATmega328P, trenger du en annen inkluderingsfil som heter tn85def.inc. Jeg vil også legge ved den (merk at jeg måtte kalle den tn85def.inc.txt slik at Instructables ville tillate meg å laste den opp.) MEN hvis du har avra assembler fra github, har du allerede begge disse filene med seg. Så jeg anbefaler å få det og kompilere det selv: git -klon

Trinn 3: Hei verden

Målet med denne første opplæringen er å bygge det standard første programmet man skriver når man lærer et nytt språk eller utforsker en ny elektronikkplattform. "Hei Verden!." I vårt tilfelle vil vi ganske enkelt skrive et samlingsspråkprogram, montere det og laste det opp til mikrokontrolleren vår. Programmet vil føre til at en LED slås på. Å få en LED til å "blinke" som de gjør for det vanlige Arduino hallo world -programmet, er faktisk et mye mer komplisert program i samlingsspråk, og vi vil ikke gjøre det ennå. Vi skal skrive den enkleste "bare bein" -koden med minimal unødvendig lo.

Koble først en LED fra PB5 (se pinout -diagrammet) som også kalles Digital Out 13 på en arduino, til en 220 ohm motstand, deretter til GND. Dvs.

PB5 - LED - R (220 ohm) - GND

Nå skal jeg skrive programmet. Åpne din favoritt tekstredigerer og lag en fil som heter "hello.asm"

; hei.asm

; slår på en LED som er koblet til PB5 (digital ut 13). inkluderer "./m328Pdef.inc" ldi r16, 0b00100000 ut DDRB, r16 ut PortB, r16 Start: rjmp Start

Ovenstående er koden. Vi går gjennom det linje for linje i løpet av et minutt, men la oss først sørge for at vi kan få det til å fungere på enheten din.

Etter at du har opprettet filen, monterer du den i en terminal på følgende måte:

avra hallo.asm

dette vil samle koden din og opprette en fil som heter hello.hex som vi kan laste den opp på følgende måte:

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

Hvis du bruker en breadboard -arduino, må du trykke på reset -knappen på breadboard -arduinoen rett før du utfører kommandoen ovenfor. Vær oppmerksom på at du kanskje også må legge til en sudo foran eller kjøre den som root. Vær også oppmerksom på at på noen arduinoer (som Arduino UNO) må du sannsynligvis endre bithastigheten til -b 115200 og porten -P /dev /ttyACM0 (hvis du får en feilmelding fra avrdude om en ugyldig enhetssignatur, legg bare til en - F til kommandoen)

Hvis alt har fungert som det skal, vil du nå få en LED til å lyse … "Hello World!"

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

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

Trinn 4: Hello.asm Linje for linje

For å fullføre denne innledende opplæringen, går vi gjennom hello.asm-programmet linje for linje for å se hvordan det fungerer.

; hei.asm

; slår på en LED som er koblet til PB5 (digital ut 13)

Alt etter et semikolon ignoreres av samleren, og derfor er disse to første linjene ganske enkelt "kommentarer" som forklarer hva programmet gjør.

. inkludere "./m328Pdef.inc"

Denne linjen forteller montøren å inkludere m328Pdef.inc -filen som du lastet ned. Det kan være lurt å sette dette i en katalog med lignende inkluderer -filer og deretter endre linjen ovenfor for å peke på det der.

ldi r16, 0b00100000

ldi står for "last umiddelbar" og ber montøren om å ta et arbeidsregister, r16 i dette tilfellet, og last et binært tall inn i det, 0b00100000 i dette tilfellet. 0b foran sier at tallet vårt er i binært. Hvis vi ville, kunne vi ha valgt en annen base, for eksempel heksidasimal. I så fall hadde tallet vårt vært 0x20 som er heksidimal for 0b00100000. Eller vi kunne ha brukt 32 som er basis 10 desimal for det samme tallet.

Oppgave 1: Prøv å endre tallet i linjen ovenfor til heksidecimal og deretter til desimal i koden, og bekreft at det fortsatt fungerer i hvert enkelt tilfelle.

Å bruke binær er imidlertid enklest på grunn av måten porter og registre fungerer på. Vi vil diskutere porter og registre for atmega328p mer detaljert i fremtidige opplæringsprogrammer, men for nå skal jeg bare oppgi at vi bruker r16 som vårt "arbeidsregister", noe som betyr at vi bare skal bruke det som en variabel som vi lagrer tall i. Et "register" er et sett med 8 bits. Betydning 8 flekker som enten kan være 0 eller 1 (`` av '' eller `` på ''). Når vi laster det binære tallet 0b00100000 inn i registret ved hjelp av linjen ovenfor, har vi ganske enkelt lagret det tallet i registeret r16.

ut DDRB, r16

Denne linjen forteller kompilatoren om å kopiere innholdet i registeret r16 til DDRB -registeret. DDRB står for "Data Direction Register B" og den setter opp "pins" på PortB. På pinout -kartet for 328p kan du se at det er 8 pins merket PB0, PB1,…, PB7. Disse pinnene representerer "bitene" til "PortB", og når vi laster det binære tallet 00100000 inn i DDRB -registeret, sier vi at vi vil at PB0, PB1, PB2, PB3, PB4, PB6 og PB7 skal settes som INPUT -pinner siden de har 0 er i dem, og PB5 er satt som en OUTPUT pin siden vi satte en 1 på det stedet.

ut PortB, r16

Nå som vi har fikset retningene til pinnene, kan vi nå sette spenningene på dem. Linjen ovenfor kopierer det samme binære nummeret fra lagringsregisteret r16 til PortB. Dette setter alle pinnene til 0 volt unntatt pin PB5 til HIGH som er 5 volt.

Øvelse 2: Ta et digitalt multimeter, koble den svarte ledningen til bakken (GND) og test deretter hver av pinnene PB0 til og med PB7 med den røde ledningen. Er spenningene på hver av pinnene nøyaktig de som tilsvarer å sette 0b00100000 i PortB? Hvis det er noen som ikke er det, hvorfor tror du det er det? (se pin -kartet)

Start:

rjmp Start

Til slutt er den første linjen ovenfor en "etikett" som merker et sted i koden. I dette tilfellet merkes dette stedet som "Start". Den andre linjen sier "relativ hopp til etiketten Start." Nettoresultatet er at datamaskinen plasseres i en uendelig sløyfe som bare fortsetter å sykle tilbake til Start. Vi trenger dette fordi vi ikke kan la programmet bare slutte, eller falle av en klippe, programmet må bare fortsette å kjøre for at lyset skal forbli tent.

Øvelse 3: Fjern de to linjene ovenfor fra koden slik at programmet faller av en klippe. Hva skjer? Du bør se noe som ligner det tradisjonelle "blink" -programmet som brukes av Arduino som deres "hei verden!". Hvorfor tror du det fungerer slik? (Tenk på hva som må skje når programmet faller av et stup …)

Trinn 5: Konklusjon

Hvis du har kommet så langt, gratulerer! Du kan nå skrive monteringskode, montere den og laste den inn på mikrokontrolleren.

I denne opplæringen har du lært hvordan du bruker følgende kommandoer:

ldi hregister, nummer laster inn et tall (0-255) i et øvre halvregister (16-31)

ut ioregister, register kopier et nummer fra et arbeidsregister til et I/O -register

rjmp label hopper til linjen i programmet merket med "label" (som ikke kan være lenger enn 204 instruksjoner unna - dvs. relativ hopp)

Nå som disse grunnleggende er ute av veien, kan vi fortsette å skrive mer interessant kode og mer interessante kretser og enheter uten å måtte diskutere mekanikken ved å kompilere og laste opp.

Jeg håper du har hatt glede av denne innledende opplæringen. I den neste opplæringen vil vi legge til en annen kretskomponent (en knapp) og utvide koden vår til å inkludere inngangsporter og beslutninger.

Anbefalt: