Talaan ng mga Nilalaman:

Tutorial sa AVR Assembler 1: 5 Mga Hakbang
Tutorial sa AVR Assembler 1: 5 Mga Hakbang

Video: Tutorial sa AVR Assembler 1: 5 Mga Hakbang

Video: Tutorial sa AVR Assembler 1: 5 Mga Hakbang
Video: Arduino MASTERCLASS | Full Programming Workshop in 90 Minutes! 2024, Hulyo
Anonim
Tutorial sa AVR Assembler 1
Tutorial sa AVR Assembler 1

Napagpasyahan kong magsulat ng isang serye ng mga tutorial sa kung paano magsulat ng mga programa sa wika ng pagpupulong para sa Atmega328p na ginamit ang microcontroller sa Arduino. Kung mananatiling interes ang mga tao magpapatuloy akong maglabas ng isa sa isang linggo o higit pa hanggang sa maubusan ako ng libreng oras o kung hindi man ang mga tao ay tumigil sa pagbabasa ng mga ito.

Nagpapatakbo ako ng Arch linux at nagtatrabaho ako sa isang atmega328p-pu na naka-set up sa isang breadboard. Maaari mo itong gawin sa parehong paraan tulad ng sa akin o maaari mo lamang mai-plug ang isang arduino sa iyong computer at magtrabaho sa microcontroller sa ganoong paraan.

Kami ay magsusulat ng mga programa para sa 328p tulad ng isa na nasa karamihan sa arduino ngunit dapat mong tandaan na ang mga parehong programa at diskarte na ito ay gagana rin para sa alinman sa mga microcontroller ng Atmel at sa paglaon (kung may interes) ay makikipagtulungan kami sa ilan sa yung iba din. Ang mga detalye ng microcontroller ay matatagpuan sa mga sheet ng data ng Atmel at ng Manwal na Itakda ng Tagubilin. Inilalagay ko ang mga ito sa itinuturo na ito.

Narito ang kakailanganin mo:

1. Isang pisara

2. Isang Arduino, o lamang ang microcontroller

3. Isang computer na nagpapatakbo ng Linux

4. Ang avra assembler na gumagamit ng git: git clone https://github.com/Ro5bert/avra.git o kung gumagamit ka ng ubuntu o isang debian based system i-type lamang ang "sudo apt install avra" at makukuha mo ang parehong avr assembler at avrdude. Gayunpaman, kung nakakuha ka ng pinakabagong bersyon gamit ang github pagkatapos makakakuha ka rin ng lahat ng kinakailangang isama ang mga file, sa madaling salita mayroon na itong mga m328Pdef.inc at tn85def.inc file.

5. avrdude

Ang kumpletong hanay ng aking mga tutorial na AVR assembler ay matatagpuan dito:

Hakbang 1: Bumuo ng isang Lupon sa Pagsubok

Bumuo ng isang Lupon sa Pagsubok
Bumuo ng isang Lupon sa Pagsubok

Maaari mo lamang gamitin ang iyong arduino at gawin ang lahat sa mga tutorial na ito kung nais mo. Gayunpaman, dahil pinag-uusapan natin ang tungkol sa pag-coding sa wika ng pagpupulong ang aming pilosopiya ay likas na alisin ang lahat ng mga periferal at direktang nakikipag-ugnay sa mismong microcontroller. Kaya hindi ba sa tingin mo magiging mas masaya ang gawin ito sa ganoong paraan?

Para sa iyo na sumasang-ayon, maaari mong hilahin ang microcontroller mula sa iyong arduino at pagkatapos ay magsimula sa pamamagitan ng pagbuo ng isang "Breadboard Arduino" sa pamamagitan ng pagsunod sa mga tagubilin dito:

Sa larawan ipinakita ko ang aking set up na binubuo ng dalawang standalone Atmega328p's sa isang malaking breadboard (nais kong mapanatili ang dating tutorial na naka-wire at na-load sa isang microcontroller habang nagtatrabaho sa susunod). Mayroon akong naka-set up na supply ng kuryente upang ang tuktok na riles ay 9V at lahat ng iba pa ay 5V mula sa voltage regulator. Gumagamit din ako ng isang FT232R breakout board upang mai-program ang mga chips. Binili ko sila at inilagay ko mismo sa kanila ang mga bootloader, ngunit kung inilabas mo lamang ang isa sa isang Arduino pagkatapos ay mabuti na.

Tandaan na kung sinusubukan mo ito sa isang ATtiny85 pagkatapos ay maaari mo lamang makuha ang Sparkfun Tiny Programmer dito: https://www.sparkfun.com/products/11801# at pagkatapos ay simpleng i-plug ito sa USB port sa iyong computer. Kakailanganin mong i-install muna ang isang bootloader sa Attiny85 at ang pinakamadaling paraan ay ang paggamit lamang ng Arduino IDE. Gayunpaman, kakailanganin mong mag-click sa file, at mga kagustuhan, at pagkatapos ay idagdag ang URL ng New Boards na ito: https://raw.githubusercontent.com/damellis/attiny/ide-1.6.x-boards-manager/package_damellis_attiny_index.json alin ang paganahin kang i-install ang bootloader (kung ang iyong ATtiny85 ay hindi pa kasama ng isa.)

Hakbang 2: I-install ang Assembler at Avrdude

Maaari mo na ngayong i-download at mai-install ang assembler at avrdude mula sa mga link na ibinigay sa unang hakbang ng tutorial na ito. Malamang na kung nakikipagtulungan ka na sa Arduino pagkatapos mayroon kang naka-install na avrdude.

Matapos mong mai-install ang avra mapapansin mo na mayroong isang subdirectory na kasama nito na tinatawag na "mga mapagkukunan" at sa loob ng direktoryo na iyon ay isang pangkat ng mga isama na mga file. Ito ang lahat ng mga microcontroller na maaari mong mai-program sa avra. Mapapansin mo kaagad na walang file para sa 328p na ginagamit namin dito. Nag-attach ako ng isa. Ang file ay dapat tawaging m328Pdef.inc at dapat mong ilagay sa loob ng kasamang direktoryo o saanman nais mo. Isasama namin ito sa aming mga programa sa wika ng pagpupulong. Ang lahat ng ginagawa nito ay ibigay ang bawat isa sa mga rehistro sa mga pangalan ng microcontroller mula sa sheet ng data upang hindi namin magamit ang kanilang mga pangalan na hexidecimal. Ang nasa itaas na file ay naglalaman ng "mga direktiba ng pragma" dahil ito ay dinisenyo para sa C at C ++ na programa. Kung nagsawa ka nang makita ang nagtitipon na dumura ang mga reklamo na "hindi pinapansin ang direktiba ng pragma" pumunta lamang sa file at tanggalin o puna ang lahat ng mga linya na nagsisimula sa #pragma

Okay, ngayong handa mo na ang iyong microcontroller, handa na ang iyong assembler, at handa na ang iyong programmer, maaari naming isulat ang aming unang programa.

Tandaan: Kung gumagamit ka ng ATtiny85 sa halip na ATmega328P pagkatapos ay kailangan mo ng ibang isama ang file na tinatawag na tn85def.inc. Ikakabit ko din ito (tandaan na kailangan kong tawagan ito tn85def.inc.txt upang pahintulutan ako ng mga Instructable na i-upload ito.) PAANO, kung nakuha mo ang avra assembler mula sa github pagkatapos ay mayroon ka nang pareho ng mga file na ito. Kaya inirerekumenda ko ang pagkuha nito at pagsasama-sama nito: git clone

Hakbang 3: Kamusta Mundo

Ang layunin ng unang tutorial na ito ay upang buuin ang pamantayang unang programa na sinusulat ng isang tao kapag natututo ng anumang bagong wika o paggalugad ng anumang bagong platform ng electronics. "Hello World !." Sa aming kaso nais lamang naming magsulat ng isang programa sa wika ng pagpupulong, tipunin ito, at i-upload ito sa aming microcontroller. Ang programa ay magiging sanhi ng pag-on ng isang LED. Naging sanhi ng isang LED na "kumurap" tulad ng ginagawa nila para sa normal na Arduino hello world program ay talagang isang mas kumplikadong programa sa wika ng pagpupulong at sa gayon hindi pa namin gagawin iyon. Isusulat namin ang pinakasimpleng "hubad na mga buto" na code na may kaunting hindi kinakailangang himulmol.

Una ikonekta ang isang LED mula sa PB5 (tingnan ang diagram ng pinout) na tinatawag ding Digital Out 13 sa isang arduino, sa isang resistor na 220 ohm, pagkatapos ay sa GND. I.e.

PB5 - LED - R (220 ohm) - GND

Ngayon upang isulat ang programa. Buksan ang iyong paboritong text editor at lumikha ng isang file na tinatawag na "hello.asm"

; hello.asm

; lumiliko sa isang LED na konektado sa PB5 (digital out 13). isama ang "./m328Pdef.inc" ldi r16, 0b00100000 out DDRB, r16 out PortB, r16 Start: rjmp Start

Ang nasa itaas ay ang code. Dadaanin namin ito nang sunud-sunod sa isang minuto, ngunit unang siguraduhin na matiyak namin itong gumagana sa iyong aparato.

Matapos mong likhain ang file, pagkatapos ay sa isang terminal tipunin mo ito tulad ng sumusunod:

avra hello.asm

tipunin nito ang iyong code at lilikha ng isang file na tinatawag na hello.hex na maaari naming i-upload ito tulad ng sumusunod:

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

kung gumagamit ka ng isang breadboard arduino kakailanganin mong itulak ang pindutan ng pag-reset sa breadboard arduino bago mo ipatupad ang utos sa itaas. Tandaan na maaari mo ring idagdag ang isang sudo sa harap o ipatupad ito bilang ugat. Tandaan din na sa ilang arduino's (tulad ng Arduino UNO) maaari mong baguhin ang bitrate sa -b 115200 at ang port -P / dev / ttyACM0 (kung nakakakuha ka ng isang error mula sa avrdude tungkol sa isang hindi wastong lagda ng aparato magdagdag lamang ng isang - F sa utos)

Kung ang lahat ay nagtrabaho tulad ng nararapat mayroon ka ng isang LED naiilawan ….. "Hello World!"

Kung gumagamit ka ng ATtiny85 kung gayon ang avrdude na utos ay:

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

Hakbang 4: Hello.asm Line-by-line

Upang tapusin ang panimulang tutorial na ito dumaan kami sa hello.asm na programa sa pamamagitan ng linya upang makita kung paano ito gumagana.

; hello.asm

; buksan ang isang LED na konektado sa PB5 (digital out 13)

Lahat matapos ang isang semicolon ay hindi pinapansin ng nagtitipon at samakatuwid ang mga unang dalawang linya ay simpleng "mga puna" na nagpapaliwanag kung ano ang ginagawa ng programa.

. isama ang "./m328Pdef.inc"

Sinasabi sa linyang ito ang nagtitipon na isama ang m328Pdef.inc file na iyong na-download. Maaaring gusto mong ilagay ito sa isang direktoryo ng katulad na isama ang mga file at pagkatapos ay baguhin ang linya sa itaas upang ituro ito doon.

ldi r16, 0b00100000

Ang ldi ay nangangahulugang "agad na pag-load" at sinasabi sa nagtitipon na kumuha ng isang gumaganang rehistro, r16 sa kasong ito, at mag-load ng isang binary na numero dito, 0b00100000 sa kasong ito. Sinasabi ng 0b sa harap na ang aming numero ay nasa binary. Kung nais namin maaari kaming pumili ng ibang base, tulad ng hexidecimal. Sa kasong iyon ang aming numero ay magiging 0x20 na kung saan ay hexidecimal para sa 0b00100000. O maaari naming magamit ang 32 na kung saan ay base 10 decimal para sa parehong numero.

Pagsasanay 1: Subukang baguhin ang numero sa linya sa itaas sa hexidecimal at pagkatapos ay sa decimal sa iyong code at i-verify na gumagana pa rin ito sa bawat kaso.

Ang paggamit ng binary ay pinakasimpleng dahil sa paraan ng paggana ng Mga Port at Rehistro. Tatalakayin namin ang mga port at rehistro ng atmega328p nang mas detalyado sa mga tutorial sa hinaharap ngunit sa ngayon ay sasabihin ko lamang na ginagamit namin ang r16 bilang aming "gumaganang rehistro" na nangangahulugang gagamitin lamang namin ito bilang isang variable na iniimbak namin mga numero sa. Ang isang "rehistro" ay isang hanay ng 8 bits. Nangangahulugan ng 8 mga spot na maaaring alinman sa 0 o 1 (`off 'o` on'). Kapag na-load namin ang numero ng binary na 0b00100000 sa rehistro gamit ang linya sa itaas ay naimbak lamang namin ang numerong iyon sa rehistro na r16.

out DDRB, r16

Sinasabi ng linyang ito ang tagatala na kopyahin ang mga nilalaman ng rehistro r16 sa rehistro ng DDRB. Ang DDRB ay nangangahulugang "Data Direction Rehistro B" at itinatakda nito ang "mga pin" sa PortB. Sa mapa ng pinout para sa 328p maaari mong makita na mayroong 8 mga pin na may label na PB0, PB1,…, PB7. Ang mga pin na ito ay kumakatawan sa "bits" ng "PortB" at kapag na-load namin ang binary number na 00100000 sa rehistro ng DDRB sinasabi namin na nais namin ang PB0, PB1, PB2, PB3, PB4, PB6, at PB7 na itinakda bilang mga INPUT na pin dahil mayroon silang Ang mga 0 ay nasa kanila, at ang PB5 ay itinakda bilang isang OUTPUT pin dahil inilagay namin ang isang 1 sa lugar na iyon.

sa labas ng PortB, r16

Ngayon na naayos namin ang mga direksyon ng mga pin maaari na nating maitakda ang mga boltahe sa kanila. Ang linya sa itaas ay kumokopya ng parehong numero ng binary mula sa aming pagrehistro ng imbakan r16 sa PortB. Itinatakda nito ang lahat ng mga pin sa 0 volts maliban sa pin PB5 hanggang SA TAAS na 5 volts.

Pagsasanay 2: Kumuha ng isang digital multimeter, isaksak ang itim na tingga sa lupa (GND) at pagkatapos ay subukan ang bawat isa sa mga pin PB0 sa pamamagitan ng PB7 na may pulang tingga. Ang mga voltages ba sa bawat isa sa mga pin ay eksaktong naaayon sa paglalagay ng 0b00100000 sa PortB? Kung may mga hindi, bakit sa palagay mo iyan? (tingnan ang mapa ng pin)

Simula:

rjmp Magsimula

Sa wakas, ang unang linya sa itaas ay isang "label" na kung saan ay may label na isang lugar sa code. Sa kasong ito, ang pag-label sa lugar na iyon bilang "Start". Sinasabi ng pangalawang linya na "kamag-anak na tumalon sa Start ng label." Ang net na resulta ay ang computer ay inilalagay sa isang infinite loop na pinapanatili lamang ang pagbibisikleta pabalik sa Start. Kailangan namin ito dahil wala tayong tatapusin lamang na programa, o mahuhulog sa isang bangin, ang programa ay patuloy na tumatakbo upang ang ilaw ay manatiling naiilawan.

Exercise 3: Alisin ang dalawang linya sa itaas mula sa iyong code upang ang programa ay mahulog sa isang bangin. Anong nangyayari Dapat kang makakita ng isang bagay na mukhang tradisyonal na "blink" na programa na ginamit ni Arduino bilang kanilang "hello world!". Bakit sa palagay mo kumikilos ito sa ganitong paraan? (Isipin kung ano ang dapat mangyari kapag ang programa ay nahulog sa isang bangin …)

Hakbang 5: Konklusyon

Kung nakakuha ka ng hanggang sa ito ay binabati kita! Nakapagsulat ka na ngayon ng code ng pagpupulong, tipunin ito, at i-load ito sa iyong microcontroller.

Sa tutorial na ito natutunan mo kung paano gamitin ang mga sumusunod na utos:

ldi hregister, naglo-load ang numero ng isang numero (0-255) sa isang itaas na kalahating rehistro (16-31)

out ioregister, magparehistro ng mga kopya ng isang numero mula sa isang gumaganang rehistro sa isang rehistro ng I / O

Ang label ng rjmp ay tumatalon sa linya ng program na may label na "label" (na hindi maaaring lumayo sa 204 na mga tagubilin ang layo - ibig sabihin, relatibong pagtalon)

Ngayon na wala sa daan ang mga pangunahing kaalaman na ito, maaari naming magpatuloy na magsulat ng mas kawili-wiling code at mas kawili-wiling mga circuit at aparato nang hindi kinakailangang talakayin ang mekanika ng pag-iipon at pag-upload.

Inaasahan kong nasiyahan ka sa panimulang tutorial na ito. Sa susunod na tutorial ay magdagdag kami ng isa pang bahagi ng circuit (isang pindutan) at palawakin ang aming code upang isama ang mga input port at desisyon.

Inirerekumendang: