Daftar Isi:

Tutorial Perakitan AVR 1: 5 Langkah
Tutorial Perakitan AVR 1: 5 Langkah

Video: Tutorial Perakitan AVR 1: 5 Langkah

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

Saya telah memutuskan untuk menulis serangkaian tutorial tentang cara menulis program bahasa rakitan untuk Atmega328p yang merupakan mikrokontroler yang digunakan di Arduino. Jika orang tetap tertarik, saya akan terus menerbitkannya seminggu atau lebih sampai saya kehabisan waktu luang atau orang berhenti membacanya.

Saya menjalankan Arch linux dan saya sedang mengerjakan pengaturan atmega328p-pu di papan tempat memotong roti. Anda dapat melakukannya dengan cara yang sama seperti saya atau Anda cukup mencolokkan arduino ke komputer Anda dan bekerja pada mikrokontroler seperti itu.

Kami akan menulis program untuk 328p seperti yang ada di kebanyakan arduino tetapi Anda harus mencatat bahwa program dan teknik yang sama ini juga akan berfungsi untuk mikrokontroler Atmel mana pun dan nanti (jika ada minat) kami akan bekerja dengan beberapa yang lain juga. Rincian mikrokontroler dapat ditemukan di lembar data Atmel dan Instruksi Set Manual. Saya melampirkannya ke instruksi ini.

Inilah yang Anda perlukan:

1. Papan tempat memotong roti

2. Arduino, atau hanya mikrokontroler

3. Komputer yang menjalankan Linux

4. Assembler avra menggunakan git: git clone https://github.com/Ro5bert/avra.git atau jika Anda menggunakan ubuntu atau sistem berbasis debian ketik saja "sudo apt install avra" dan Anda akan mendapatkan kedua assembler avr dan setia. NAMUN, jika Anda mendapatkan versi terbaru menggunakan github maka Anda juga akan mendapatkan semua file include yang diperlukan, dengan kata lain sudah memiliki file m328Pdef.inc dan tn85def.inc.

5. avrdude

Kumpulan lengkap tutorial assembler AVR saya dapat ditemukan di sini:

Langkah 1: Buat Papan Pengujian

Bangun Papan Pengujian
Bangun Papan Pengujian

Anda cukup menggunakan arduino Anda dan melakukan semuanya dalam tutorial ini jika Anda mau. Namun, karena kita berbicara tentang pengkodean dalam bahasa assembly, filosofi kita secara inheren menghapus semua periferal dan berinteraksi langsung dengan mikrokontroler itu sendiri. Jadi tidakkah menurut Anda akan lebih menyenangkan melakukannya dengan cara itu?

Bagi Anda yang setuju, Anda dapat mengeluarkan mikrokontroler dari arduino Anda dan kemudian mulai dengan membangun "Breadboard Arduino" dengan mengikuti petunjuk di sini:

Dalam gambar saya menunjukkan pengaturan saya yang terdiri dari dua Atmega328p yang berdiri sendiri pada papan tempat memotong roti yang besar (saya ingin dapat menjaga kabel tutorial sebelumnya dan dimuat pada satu mikrokontroler saat mengerjakan yang berikutnya). Saya mengatur catu daya sehingga rel paling atas adalah 9V dan yang lainnya 5V dari pengatur tegangan. Saya juga menggunakan papan breakout FT232R untuk memprogram chip. Saya membelinya dan memasang bootloader sendiri, tetapi jika Anda baru saja mengeluarkannya dari Arduino maka itu sudah baik-baik saja.

Perhatikan bahwa jika Anda mencoba ini dengan ATtiny85 maka Anda bisa mendapatkan Sparkfun Tiny Programmer di sini: https://www.sparkfun.com/products/11801# dan kemudian cukup tancapkan ke port USB di komputer Anda. Anda harus menginstal bootloader pada Attiny85 terlebih dahulu dan cara termudah adalah dengan menggunakan Arduino IDE. Namun, Anda perlu mengklik file, dan preferensi, lalu menambahkan URL Papan Baru ini: https://raw.githubusercontent.com/damellis/attiny/ide-1.6.x-boards-manager/package_damellis_attiny_index.json yang akan memungkinkan Anda untuk menginstal bootloader (jika ATtiny85 Anda belum disertakan.)

Langkah 2: Instal Assembler dan Avrdude

Anda sekarang dapat mengunduh dan menginstal assembler dan avrdude dari tautan yang diberikan pada langkah pertama tutorial ini. Kemungkinan jika Anda telah bekerja dengan Arduino maka Anda sudah menginstal avrdude.

Setelah Anda menginstal avra, Anda akan melihat bahwa ada subdirektori yang menyertainya yang disebut "sumber" dan di dalam direktori itu ada banyak file yang disertakan. Ini semua adalah mikrokontroler yang dapat Anda program dengan avra. Anda akan segera melihat bahwa tidak ada file untuk 328p yang kami gunakan di sini. Saya telah melampirkan satu. File tersebut harus bernama m328Pdef.inc dan Anda harus meletakkannya di dalam direktori include atau di mana pun Anda suka. Kami akan memasukkannya ke dalam program bahasa assembly kami. Semua ini dilakukan adalah memberikan masing-masing register dalam nama mikrokontroler dari lembar data sehingga kita tidak perlu menggunakan nama heksadesimalnya. File include di atas berisi "pragma directives" karena dirancang untuk pemrograman C dan C++. Jika Anda bosan melihat assembler mengeluarkan keluhan "mengabaikan pragma directive" cukup masuk ke file dan hapus atau komentari semua baris yang dimulai dengan #pragma

Oke, sekarang setelah mikrokontroler Anda siap, assembler Anda siap, dan programmer Anda siap, kami dapat menulis program pertama kami.

Catatan: Jika Anda menggunakan ATtiny85 alih-alih ATmega328P maka Anda memerlukan file penyertaan yang berbeda yang disebut tn85def.inc. Saya akan melampirkannya juga (perhatikan saya harus menyebutnya tn85def.inc.txt sehingga Instructables mengizinkan saya untuk mengunggahnya.) NAMUN, jika Anda mendapatkan assembler avra dari github maka Anda sudah memiliki kedua file ini bersamanya. Jadi saya sarankan untuk mendapatkannya dan kompilasi sendiri: git clone

Langkah 3: Halo Dunia

Tujuan dari tutorial pertama ini adalah untuk membangun program pertama standar yang ditulis seseorang saat mempelajari bahasa baru atau menjelajahi platform elektronik baru. "Halo Dunia!." Dalam kasus kami, kami hanya ingin menulis program bahasa rakitan, merakitnya, dan mengunggahnya ke mikrokontroler kami. Program akan menyebabkan LED menyala. Menyebabkan LED "berkedip" seperti yang mereka lakukan untuk program hello world Arduino normal sebenarnya adalah program yang jauh lebih rumit dalam bahasa assembly dan jadi kami tidak akan melakukannya dulu. Kami akan menulis kode "tulang telanjang" paling sederhana dengan sedikit bulu yang tidak perlu.

Pertama hubungkan LED dari PB5 (lihat diagram pinout) yang disebut juga Digital Out 13 pada arduino, ke resistor 220 ohm, lalu ke GND. Yaitu.

PB5 -- LED -- R (220 ohm) -- GND

Sekarang untuk menulis programnya. Buka editor teks favorit Anda dan buat file bernama "hello.asm"

;halo.asm

; menyalakan LED yang terhubung ke PB5 (digital out 13).include "./m328Pdef.inc" ldi r16, 0b00100000 out DDRB, r16 out PortB, r16 Start: rjmp Start

Di atas adalah kodenya. Kami akan membahasnya baris demi baris dalam satu menit, tetapi pertama-tama pastikan kami dapat membuatnya berfungsi di perangkat Anda.

Setelah Anda membuat file, maka di terminal Anda merakitnya sebagai berikut:

avra hello.asm

ini akan merakit kode Anda dan membuat file bernama hello.hex yang dapat kami unggah sebagai berikut:

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

jika Anda menggunakan arduino papan tempat memotong roti, Anda harus menekan tombol reset pada papan tempat memotong roti arduino tepat sebelum Anda menjalankan perintah di atas. Perhatikan bahwa Anda mungkin juga harus menambahkan sudo di depan atau menjalankannya sebagai root. Perhatikan juga bahwa pada beberapa arduino (seperti Arduino UNO) Anda mungkin harus mengubah bitrate menjadi -b 115200 dan port -P /dev/ttyACM0 (jika Anda mendapatkan kesalahan dari avrdude tentang tanda tangan perangkat yang tidak valid, tambahkan saja - F untuk perintah)

Jika semuanya telah bekerja sebagaimana mestinya, Anda sekarang akan memiliki LED yang menyala….. "Halo Dunia!"

Jika Anda menggunakan ATtiny85 maka perintah avrdude adalah:

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

Langkah 4: Hello.asm Baris demi baris

Untuk menyelesaikan tutorial pengantar ini kita akan melalui program hello.asm baris demi baris untuk melihat cara kerjanya.

;halo.asm

; menyalakan LED yang terhubung ke PB5 (digital out 13)

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

.include "./m328Pdef.inc"

Baris ini memberi tahu assembler untuk menyertakan file m328Pdef.inc yang Anda unduh. Anda mungkin ingin meletakkan ini di direktori file penyertaan yang serupa dan kemudian mengubah baris di atas untuk menunjuk ke sana.

ldi r16, 0b00100000

ldi singkatan dari "memuat segera" dan memberitahu assembler untuk mengambil register kerja, r16 dalam kasus ini, dan memuat nomor biner ke dalamnya, 0b00100000 dalam kasus ini. 0b di depan mengatakan bahwa nomor kami dalam biner. Jika kita mau, kita bisa memilih basis lain, seperti heksadesimal. Dalam hal ini nomor kami adalah 0x20 yang merupakan heksadesimal untuk 0b00100000. Atau kita bisa menggunakan 32 yang merupakan basis 10 desimal untuk angka yang sama.

Latihan 1: Coba ubah angka pada baris di atas ke heksadesimal dan kemudian ke desimal dalam kode Anda dan verifikasi bahwa itu masih berfungsi dalam setiap kasus.

Menggunakan biner paling sederhana karena cara kerja Port dan Register. Kita akan membahas port dan register atmega328p secara lebih rinci di tutorial mendatang tetapi untuk saat ini saya hanya akan menyatakan bahwa kita menggunakan r16 sebagai "register kerja" yang berarti bahwa kita hanya akan menggunakannya sebagai variabel yang kita simpan nomor masuk Sebuah "register" adalah satu set 8 bit. Berarti 8 titik yang dapat berupa 0 atau 1 (`mati' atau `aktif'). Ketika kita memuat bilangan biner 0b00100000 ke dalam register menggunakan baris di atas, kita hanya menyimpan nomor itu di register r16.

keluar DDRB, r16

Baris ini memberitahu compiler untuk menyalin isi register r16 ke register DDRB. DDRB adalah singkatan dari "Data Direction Register B" dan mengatur "pin" pada PortB. Pada peta pinout untuk 328p Anda dapat melihat bahwa ada 8 pin berlabel PB0, PB1, …, PB7. Pin ini mewakili "bit" dari "PortB" dan ketika kita memuat bilangan biner 00100000 ke register DDRB, kita mengatakan bahwa kita ingin PB0, PB1, PB2, PB3, PB4, PB6, dan PB7 ditetapkan sebagai pin INPUT karena mereka memiliki 0 di dalamnya, dan PB5 ditetapkan sebagai pin OUTPUT karena kita menempatkan 1 di tempat itu.

keluar PortB, r16

Sekarang kita telah memperbaiki arah pin, sekarang kita dapat mengatur voltase pada pin. Baris di atas menyalin nomor biner yang sama dari register penyimpanan kami r16 ke PortB. Ini mengatur semua pin ke 0 volt kecuali pin PB5 ke HIGH yaitu 5 volt.

Latihan 2: Ambil multimeter digital, pasang kabel hitam ke ground (GND) dan kemudian uji setiap pin PB0 melalui PB7 dengan kabel merah. Apakah voltase pada masing-masing pin sama persis dengan voltase yang dipasang pada 0b00100000 di PortB? Jika ada yang tidak, menurut Anda mengapa? (lihat peta pin)

Awal:

rjmp Mulai

Akhirnya, baris pertama di atas adalah "label" yang memberi label tempat dalam kode. Dalam hal ini memberi label tempat itu sebagai "Mulai". Baris kedua mengatakan "lompatan relatif ke label Mulai." Hasil akhirnya adalah bahwa komputer ditempatkan ke dalam loop tak terbatas yang terus berputar kembali ke Start. Kami membutuhkan ini karena kami tidak dapat membuat program berakhir begitu saja, atau jatuh dari tebing, program harus terus berjalan agar lampu tetap menyala.

Latihan 3: Hapus dua baris di atas dari kode Anda sehingga program jatuh dari tebing. Apa yang terjadi? Anda akan melihat sesuatu yang terlihat seperti program "berkedip" tradisional yang digunakan oleh Arduino sebagai "halo dunia!". Menurut Anda mengapa tindakannya seperti ini? (Pikirkan tentang apa yang harus terjadi ketika program jatuh dari tebing…)

Langkah 5: Kesimpulan

Jika Anda sudah sejauh ini, selamat! Anda sekarang dapat menulis kode perakitan, merakitnya, dan memuatnya ke mikrokontroler Anda.

Dalam tutorial ini Anda telah belajar bagaimana menggunakan perintah berikut:

ldi hregister, nomor memuat nomor (0-255) ke dalam register setengah bagian atas (16-31)

keluar ioregister, register menyalin nomor dari register kerja ke register I/O

rjmp label melompat ke baris program yang diberi label oleh "label" (yang tidak boleh lebih dari 204 instruksi -- yaitu lompatan relatif)

Sekarang setelah dasar-dasar ini tidak ada lagi, kita dapat terus menulis kode yang lebih menarik dan sirkuit serta perangkat yang lebih menarik tanpa harus membahas mekanisme kompilasi dan pengunggahan.

Saya harap Anda menikmati tutorial pengantar ini. Dalam tutorial berikutnya kita akan menambahkan komponen sirkuit lain (tombol) dan memperluas kode kita untuk memasukkan port input dan keputusan.

Direkomendasikan: