Isi kandungan:

Tutorial Penyusun AVR 1: 5 Langkah
Tutorial Penyusun AVR 1: 5 Langkah

Video: Tutorial Penyusun AVR 1: 5 Langkah

Video: Tutorial Penyusun AVR 1: 5 Langkah
Video: Cara Pasang AVR Genset 1 Phase. (PART 1) |PASANG AVR DI ALTERNATOR| 2024, November
Anonim
Tutorial Penyusun AVR 1
Tutorial Penyusun AVR 1

Saya telah memutuskan untuk menulis satu siri tutorial mengenai cara menulis program bahasa pemasangan untuk Atmega328p yang merupakan mikrokontroler yang digunakan di Arduino. Sekiranya orang tetap berminat, saya akan terus mengeluarkan satu minggu atau lebih sehingga saya kehabisan masa lapang atau orang berhenti membacanya.

Saya menjalankan Arch linux dan saya mengusahakan atega atmega328p-pu di papan roti. Anda boleh melakukannya dengan cara yang sama seperti saya atau anda boleh memasukkan arduino ke komputer anda dan mengusahakan mikrokontroler dengan cara itu.

Kami akan menulis program untuk 328p seperti yang ada di kebanyakan arduino tetapi anda harus perhatikan bahawa program dan teknik yang sama ini juga akan berfungsi untuk mana-mana mikrokontroler Atmel dan kemudian (jika ada minat) kami akan bekerjasama dengan beberapa yang lain juga. Perincian mikrokontroler boleh didapati di lembaran data Atmel dan Manual Set Arahan. Saya melampirkannya kepada arahan ini.

Inilah yang anda perlukan:

1. Papan roti

2. Arduino, atau hanya mikrokontroler

3. Komputer yang menjalankan Linux

4. Avra assembler menggunakan git: git clone https://github.com/Ro5bert/avra.git atau jika anda menggunakan ubuntu atau sistem berasaskan debian, ketik "sudo apt install avra" dan anda akan mendapat kedua-dua avr assembler dan avrdude. Bagaimanapun, jika anda mendapat versi terbaru menggunakan github maka anda juga akan mendapat semua fail termasuk yang diperlukan, dengan kata lain ia sudah mempunyai fail m328Pdef.inc dan tn85def.inc.

5. avrdude

Set lengkap tutorial penghimpun AVR saya boleh didapati di sini:

Langkah 1: Bina Papan Ujian

Bina Papan Ujian
Bina Papan Ujian

Anda boleh menggunakan arduino anda dan melakukan semua perkara dalam tutorial ini jika anda mahu. Walau bagaimanapun, kerana kita bercakap mengenai pengekodan dalam bahasa pemasangan, falsafah kita sememangnya melucutkan semua periferal dan berinteraksi secara langsung dengan mikrokontroler itu sendiri. Oleh itu, tidakkah anda rasa lebih senang melakukannya?

Bagi anda yang bersetuju, anda boleh mengeluarkan mikrokontroler dari arduino anda dan kemudian mulakan dengan membina "Breadboard Arduino" dengan mengikuti arahan di sini:

Dalam gambar saya menunjukkan susunan saya yang terdiri daripada dua Atmega328p yang berdiri sendiri pada papan roti yang besar (saya ingin dapat menyimpan tutorial sebelumnya dengan kabel dan dimuat pada satu mikrokontroler semasa bekerja pada yang berikutnya). Saya telah menyediakan bekalan kuasa supaya rel paling atas adalah 9V dan yang lain adalah 5V dari pengatur voltan. Saya juga menggunakan papan pemecah FT232R untuk memprogram cip. Saya membelinya dan meletakkan bootloader pada mereka sendiri, tetapi jika anda mengeluarkannya dari Arduino maka sudah baik.

Perhatikan bahawa jika anda mencuba ini dengan ATtiny85 maka anda boleh mendapatkan Sparkfun Tiny Programmer di sini: https://www.sparkfun.com/products/11801# dan kemudian pasangkannya ke port USB di komputer anda. Anda perlu memasang bootloader pada Attiny85 terlebih dahulu dan cara termudah adalah dengan menggunakan Arduino IDE. Walau bagaimanapun, anda perlu mengklik fail, dan pilihan, dan kemudian tambahkan URL Papan Baru ini: https://raw.githubusercontent.com/damellis/attiny/ide-1.6.x-boards-manager/package_damellis_attiny_index.json yang akan membolehkan anda memasang bootloader (jika ATtiny85 anda belum disertakan.)

Langkah 2: Pasang Assembler dan Avrdude

Anda kini boleh memuat turun dan memasang assembler dan avrdude dari pautan yang diberikan pada langkah pertama tutorial ini. Mungkin jika anda sudah bekerja dengan Arduino maka anda sudah memasang avrdude.

Setelah anda memasang avra, anda akan melihat bahawa ada subdirektori yang disertakan dengan itu disebut "sumber" dan di dalam direktori itu terdapat sekumpulan fail termasuk. Ini adalah semua pengawal mikro yang boleh anda atur dengan avra. Anda akan segera mengetahui bahawa tidak ada fail untuk 328p yang kami gunakan di sini. Saya telah melampirkan satu. Fail tersebut harus dipanggil m328Pdef.inc dan anda harus memasukkan ke dalam direktori termasuk atau di mana sahaja yang anda suka. Kami akan memasukkannya ke dalam program bahasa perhimpunan kami. Semua ini dilakukan adalah memberikan setiap daftar dalam nama mikrokontroler dari lembaran data sehingga kita tidak perlu menggunakan nama heksidecimal mereka. Fail termasuk di atas mengandungi "arahan pragma" kerana ia dirancang untuk pengaturcaraan C dan C ++. Sekiranya anda bosan melihat pengumpul yang mengeluarkan "mengabaikan arahan pragma" aduan masuk ke fail dan hapus atau komen semua baris yang bermula dengan #pragma

Baiklah, setelah anda menyediakan mikrokontroler, penyusun anda, dan pengaturcara anda siap, kami boleh menulis program pertama kami.

Catatan: Sekiranya anda menggunakan ATtiny85 dan bukan ATmega328P maka anda memerlukan fail termasuk yang lain yang disebut tn85def.inc. Saya akan melampirkannya juga (perhatikan saya harus memanggilnya tn85def.inc.txt supaya Instructables membenarkan saya memuat naiknya.) Bagaimanapun, jika anda mendapat penyusun avra dari github maka anda sudah mempunyai kedua-dua fail ini dengannya. Oleh itu, saya cadangkan mendapatkannya dan menyusunnya sendiri: git clone

Langkah 3: Hello World

Matlamat tutorial pertama ini adalah untuk membina program pertama standard yang ditulis seseorang ketika belajar bahasa baru atau menjelajahi mana-mana platform elektronik baru. "Hai dunia!." Dalam kes kami, kami hanya ingin menulis program bahasa pemasangan, memasangnya, dan memuat naiknya ke mikrokontroler kami. Program ini akan menyebabkan LED menyala. Menyebabkan LED "berkedip" seperti yang mereka lakukan untuk program Arduino hello world biasa sebenarnya adalah program yang jauh lebih rumit dalam bahasa perhimpunan dan oleh itu kita belum akan melakukannya. Kami akan menulis kod "tulang kosong" termudah dengan sedikit bulu yang tidak perlu.

Mula-mula sambungkan LED dari PB5 (lihat gambarajah pinout) yang juga disebut Digital Out 13 pada arduino, ke perintang 220 ohm, kemudian ke GND. I. E.

PB5 - LED - R (220 ohm) - GND

Sekarang untuk menulis program. Buka editor teks kegemaran anda dan buat fail bernama "hello.asm"

; hello.asm

; menghidupkan LED yang disambungkan ke PB5 (keluar digital 13). sertakan "./m328Pdef.inc" ldi r16, 0b00100000 keluar DDRB, r16 keluar PortB, r16 Mula: rjmp Mula

Di atas adalah kodnya. Kami akan menelusuri baris demi baris dalam satu minit, tetapi pertama-tama pastikan kami dapat membuatnya berfungsi pada peranti anda.

Setelah anda membuat fail, kemudian di terminal anda memasangnya seperti berikut:

avra hello.asm

ini akan mengumpulkan kod anda dan membuat fail bernama hello.hex yang boleh kami muat naik seperti berikut:

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

jika anda menggunakan arduino papan roti, anda harus menekan butang set semula pada arduino papan roti sebelum anda melaksanakan perintah di atas. Perhatikan bahawa anda mungkin juga harus menambahkan sudo di depan atau melaksanakannya sebagai root. Perhatikan juga bahawa pada beberapa arduino (seperti Arduino UNO), anda mungkin perlu menukar bitrate menjadi -b 115200 dan port -P / dev / ttyACM0 (jika anda mendapat ralat dari avrdude mengenai tandatangan peranti yang tidak sah, cukup tambahkan - F kepada arahan)

Sekiranya semuanya berfungsi sebagaimana mestinya, sekarang anda akan menyalakan LED….. "Hello World!"

Sekiranya anda menggunakan ATtiny85 maka perintah avrdude adalah:

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

Langkah 4: Talian demi baris Hello.asm

Untuk menyelesaikan tutorial pendahuluan ini, kita akan melalui program hello.asm satu demi satu untuk melihat bagaimana ia berfungsi.

; hello.asm

; menghidupkan LED yang disambungkan ke PB5 (digital out 13)

Segala sesuatu setelah titik koma diabaikan oleh assembler dan oleh itu dua baris pertama ini hanyalah "komen" yang menjelaskan apa yang dilakukan oleh program.

.masuk "./m328Pdef.inc"

Garis ini memberitahu assembler untuk memasukkan fail m328Pdef.inc yang anda muat turun. Anda mungkin mahu memasukkan ini ke dalam direktori fail termasuk yang serupa dan kemudian menukar baris di atas untuk menunjuk ke sana.

ldi r16, 0b00100000

ldi bermaksud "muat segera" dan memberitahu assembler untuk mengambil daftar kerja, r16 dalam kes ini, dan memuatkan nombor binari ke dalamnya, 0b00100000 dalam kes ini. 0b di hadapan mengatakan bahawa nombor kami dalam bentuk binari. Sekiranya kita mahu, kita boleh memilih pangkalan lain, seperti heksidecimal. Dalam kes itu, nombor kita adalah 0x20 iaitu heksidecimal untuk 0b00100000. Atau kita boleh menggunakan 32 yang merupakan asas 10 perpuluhan untuk nombor yang sama.

Latihan 1: Cuba ubah nombor pada baris di atas menjadi heksidecimal dan kemudian perpuluhan dalam kod anda dan sahkan bahawa ia masih berfungsi dalam setiap kes.

Menggunakan binari adalah yang paling mudah kerana cara Pelabuhan dan Pendaftaran berfungsi. Kami akan membincangkan port dan daftar atmega328p dengan lebih terperinci dalam tutorial akan datang tetapi buat masa ini saya hanya akan menyatakan bahawa kami menggunakan r16 sebagai "register kerja" kami yang bermaksud bahawa kami hanya akan menggunakannya sebagai pemboleh ubah yang kami simpan nombor dalam. "Daftar" adalah sekumpulan 8 bit. Maksudnya 8 tempat yang boleh menjadi 0 atau 1 (`off 'atau' on '). Apabila kita memuatkan nombor binari 0b00100000 ke dalam daftar menggunakan baris di atas, kita hanya menyimpan nombor itu dalam daftar r16.

keluar DDRB, r16

Garis ini memberitahu penyusun untuk menyalin kandungan daftar r16 ke dalam daftar DDRB. DDRB adalah singkatan dari "Data Direction Register B" dan ia menetapkan "pin" di PortB. Pada peta pinout untuk 328p anda dapat melihat bahawa terdapat 8 pin berlabel PB0, PB1,…, PB7. Pin ini mewakili "bit" dari "PortB" dan apabila kami memuatkan nombor binari 00100000 ke dalam daftar DDRB, kami mengatakan bahawa kami mahu PB0, PB1, PB2, PB3, PB4, PB6, dan PB7 ditetapkan sebagai pin INPUT kerana mereka mempunyai 0 di dalamnya, dan PB5 ditetapkan sebagai pin OUTPUT kerana kami meletakkan 1 di tempat itu.

keluar PortB, r16

Sekarang kita telah menetapkan arah pin, kita sekarang boleh menetapkan voltan padanya. Garis di atas menyalin nombor binari yang sama dari daftar simpanan kami r16 ke PortB. Ini menetapkan semua pin menjadi 0 volt kecuali pin PB5 hingga TINGGI iaitu 5 volt.

Latihan 2: Ambil multimeter digital, pasangkan plumbum hitam ke dalam tanah (GND) dan kemudian uji setiap pin PB0 hingga PB7 dengan plumbum merah. Adakah voltan pada setiap pin sesuai dengan meletakkan 0b00100000 di PortB? Sekiranya ada yang tidak, mengapa anda berpendapat demikian? (lihat peta pin)

Mulakan:

rjmp Mula

Akhirnya, baris pertama di atas adalah "label" yang melabel tempat dalam kod. Dalam kes ini melabel tempat itu sebagai "Mula". Baris kedua mengatakan "melompat relatif ke label Mula." Hasilnya adalah bahawa komputer dimasukkan ke dalam gelung tak terhingga yang terus berpusing kembali ke Mula. Kami memerlukannya kerana program ini tidak dapat berakhir, atau jatuh dari tebing, program harus terus berjalan agar lampu tetap menyala.

Latihan 3: Keluarkan dua baris di atas dari kod anda sehingga program jatuh dari tebing. Apa yang berlaku? Anda harus melihat sesuatu yang kelihatan seperti program "berkedip" tradisional yang digunakan oleh Arduino sebagai "hello world!" Mereka. Mengapa anda fikir ia bertindak seperti ini? (Fikirkan apa yang mesti berlaku semasa program jatuh dari tebing …)

Langkah 5: Kesimpulannya

Sekiranya anda berjaya mencapai tahap ini, tahniah! Anda kini dapat menulis kod pemasangan, memasangnya, dan memuatkannya ke mikrokontroler anda.

Dalam tutorial ini, anda telah mempelajari cara menggunakan perintah berikut:

ldi hregister, nombor memuatkan nombor (0-255) ke dalam daftar separuh atas (16-31)

keluar ioregister, daftar salinan nombor dari daftar kerja ke daftar I / O

label rjmp melonjak ke barisan program yang dilabelkan oleh "label" (yang tidak boleh lebih dari 204 arahan lagi - iaitu lompatan relatif)

Oleh kerana asas-asas ini tidak sesuai, kita dapat terus menulis kod yang lebih menarik dan litar dan peranti yang lebih menarik tanpa perlu membincangkan mekanisme penyusunan dan muat naik.

Saya harap anda dapat menikmati tutorial pengenalan ini. Dalam tutorial seterusnya kami akan menambahkan komponen litar lain (butang) dan memperluas kod kami untuk memasukkan port input dan keputusan.

Disyorkan: