Pemrograman tingkat rendah mikrokontroler seri-0 tinyAVR





Apakah Anda seorang programmer 8-bit atau 32-bit? Kami di OMZLO telah memfokuskan upaya kami pada chip ARM Cortex 32-bit baru (STM32 dan SAMD), yang, dibandingkan dengan mikrokontroler 8-bit yang lebih lama (Unit Pengontrol Mikro, MCU), biasanya menawarkan lebih banyak RAM, kinerja yang lebih baik. , mendukung lebih banyak periferal. Dan semua ini - dengan harga yang sama, atau dengan harga yang lebih rendah. Tetapi MCU 8-bit belum kehilangan relevansinya. Secara khusus, Microchip telah merilis serangkaian chip baru, "tinyAVR 0-series", yang, jika dibandingkan dengan chip AVR yang dirilis sebelumnya, memungkinkan untuk bekerja dengan periferal yang lebih modern. Pada saat yang sama, chip baru memiliki harga yang sangat menarik. Tampaknya chip ini sempurna untuk mengembangkan perangkat sederhana yang tidak membutuhkan kemampuanapa yang ditawarkan MCU 32-bit yang lebih baru. Selain itu, mikrokontroler 8-bit jauh lebih mudah untuk diprogram, yang mengarah pada peningkatan kecepatan pengembangan bagian perangkat lunak dari perangkat yang dibuat berdasarkan mereka.



Berkat keberhasilan Arduino UNO, ada banyak tutorial di Internet yang menjelaskan fitur pemrograman mikrokontroler ATmega328 8-bit dan mitranya seperti ATtiny85. Kita berbicara tentang akses langsung ke register tanpa menggunakan bahasa pemrograman yang digunakan untuk Arduino, dan tanpa menggunakan IDE yang dibuat oleh produsen chip seperti Atmel Studio. Untuk memverifikasi ini, cukup cari Google untuk "atmega328 blinky". Untuk memprogram mikrokontroler Anda hanya memerlukan kompiler C untuk AVR, editor teks, avrdude dan programmer AVR. Tentang beberapa sumberbahkan panduan dapat ditemukan tentang cara mengaktifkan dan menjalankan ATmega328 dengan papan tempat memotong roti universal. Namun, jika kita berbicara tentang chip seri tinyAVR 0 yang lebih baru, tidak mudah untuk menemukan informasi semacam ini pada mereka.



Tentu saja, Microchip menawarkan semua alat yang Anda butuhkan untuk memprogram tinyAVR baru dalam IDE yang dirancang khusus untuk Windows. Untuk beberapa chip yang lebih baru, ada "inti Arduino". Berkat ini, chip semacam itu dapat diprogram menggunakan Arduino IDE. Tetapi sekali lagi, jika seseorang lebih suka menulis kode mikrokontroler dalam gaya "tingkat rendah" menggunakan editor teks favorit mereka Makefiledan kompiler C, maka mereka akan menemukan sedikit sekali informasi tentang pendekatan ini untuk bekerja dengan tinyAVR.



Pada artikel ini kami akan memberi tahu Anda bagaimana, dari awal, menggunakan alat paling sederhana, untuk membuat firmware blinkyuntuk ATtiny406. Sebagian besar dari apa yang akan dibahas juga berlaku untuk MCU tinyAVR lainnya. Tutorial ini ditujukan bagi mereka yang menggunakan macOS dan Linux, tetapi saran kami, dengan sedikit modifikasi, akan berguna bagi mereka yang menggunakan lingkungan Windows juga.



Bagian perangkat keras dari proyek



▍Research ATtiny406



Kami memutuskan untuk bereksperimen dengan ATtiny406 , berharap di masa depan mikrokontroler ini akan menggantikan ATtiny45, yang saat ini digunakan di PiWatcher - dalam pengembangan kami, yang memungkinkan, ketika kebutuhan seperti itu muncul, untuk sepenuhnya mematikan atau memulai ulang Raspberry Pi. ATtiny406 memiliki memori flash 4 KB, RAM 256 byte, dan microchip dapat beroperasi pada 20 MHz tanpa sumber jam eksternal.



Salah satu perbedaan utama antara MCU tinyAVR baru dan chip yang lebih lama dan terkenal seperti ATtiny85 adalah bahwa chip yang lebih baru menggunakan protokol pemrograman UPDI. Ini hanya membutuhkan 3 pin agar berfungsi, dan 6 pin diperlukan untuk protokol ISP yang digunakan oleh chip lama.



Setelah mempelajari pertanyaan secara singkat, kami mengetahui bahwa Anda dapat memprogram tinyAVR dengan UPDI menggunakan kabel dan resistor USB-ke-Serial sederhana. Kami menemukan ini berkat alat pyupdi Python , yang menyarankan diagram pengkabelan berikut untuk mengunggah firmware ke mikrokontroler.





Diagram koneksi mikrokontroler



▍ Desain Papan untuk ATtiny406



Kami telah membuat papan breakout minimalis untuk ATtiny406. Papan ini dapat didukung oleh 5V dari USB. Sebagai alternatif, Anda dapat menerapkan tegangan yang lebih rendah sebesar 3,3V menggunakan pin VCC / GND khusus. Ada tempat di papan untuk tombol dan LED. Untuk melakukan percobaan, kami memutuskan untuk membangun resistor 4,7 kOhm ke papan, yang diperlukan untuk menggunakan protokol UPDI (ini adalah resistor R2). Hasilnya, kami mendapatkan tata letak papan berikut.





Tata letak papan



▍Papan jadi



Papan breakout yang sudah jadi ternyata cukup kompak, sangat cocok dengan papan tempat memotong roti kecil. Skema papan dapat ditemukan di sini .





Bidang Belakang Dipasang pada Papan Prototipe



Untuk memprogram ATtiny406, kabel USB-ke-Serial dihubungkan ke papan menggunakan pin di atasnya.





Diagram koneksi kabel



Bagian perangkat lunak dari proyek



▍pyupdi



Kami menginstal pyupdi dengan mengikuti instruksi dari repositori proyek .



Kabel USB-ke-Serial dihubungkan ke papan menggunakan empat pin UPDI. Konverter USB-ke-Serial kami terlihat di macOS sebagai file /dev/tty.usbserial-FTF5HUAV.



Untuk memastikan bahwa pemrogram mengenali ATtiny406, Anda dapat menjalankan perintah yang mirip dengan berikut ini dengan mengedit jalur file:



pyupdi -d tiny406 -c /dev/tty.usbserial-FTF5HUAV -i


Jika semuanya dikonfigurasi dengan benar, maka menjalankan perintah seperti ini akan menghasilkan keluaran seperti ini:



Device info: {'family': 'tinyAVR', 'nvm': 'P:0', 'ocd': 'D:0', 'osc': '3', 'device_id': '1E9225', 'device_rev': '0.1'}


▍C kompiler



Ternyata kompiler avr-gcc biasa yang dapat diinstal di macOS menggunakan Homebrew tidak mengizinkan pengaturan ATtiny406 sebagai target kompilasi. Oleh karena itu, kami memutuskan untuk menginstal avr-gcc yang disediakan oleh Microchip. Untuk mengunduh kompiler, Anda harus membuat akun di situs web Microchip, yang agak mengganggu.





Mengunduh kompiler



Setelah mengunduh bahan-bahan penting yang disajikan dalam bentuk arsip, kami membongkar arsip ini ke dalam folder terpisah. Path ke direktoribinyang akan ada di folder ini harus ditambahkanPATH. Ini akan mempermudah pekerjaan di masa depan. Dengan asumsi bahwa compiler disimpan dalam folder$HOME/Src/avr8-gnu-toolchain-darwin_x86_64, AndaPATHdapatmengeditnyadengan menambahkan perintah berikut ke file.bash_profile:



export PATH=$PATH:$HOME/Src/avr8-gnu-toolchain-darwin_x86_64/bin/


MCU ATtiny terbaru tidak didukung oleh kompiler avr-gcc Microchip tanpa konfigurasi tambahan. Untuk mendukungnya, Anda perlu mengunduh ATtiny Device Pack .





Mendownload ATtiny Device Pack



Hasilnya, kami mendownload paketAtmel.ATtiny_DFP.1.6.326.atpack(file ini mungkin memiliki nama yang berbeda, namanya mungkin menyertakan nomor versi yang berbeda). Meskipun ekstensi file adalah. atpack, ini sebenarnya.ziparsipbiasa. Kami mengubah ekstensinya menjadi.zipdan mengekstrak konten paket ke folder$HOME/Src/Atmel.ATtiny_DFP.1.6.326, yaitu, ke tempat yang sama di mana file kompilator sudah ada.



▍Menulis program C.



Kami menulis program berikut, yang, pada frekuensi 1 Hz, mengedipkan LED yang terhubung ke pin B5 pada papan ATtiny kami.



#include <avr/io.h>
#include <util/delay.h>

int main() {
    _PROTECTED_WRITE(CLKCTRL.MCLKCTRLB, 0); //   20 (,   0x02   2)

    PORTB.DIRSET = (1<<5);
    for (;;) {
        PORTB.OUTSET = (1<<5);
        _delay_ms(500);
        PORTB.OUTCLR = (1<<5);
        _delay_ms(500);
    }
}


Kode ini sangat mirip dengan program berkedip LED yang ditulis untuk mikrokontroler AVR yang sudah dikenal. Perubahan penting pertama adalah penggunaan struktur untuk mengakses register MCU. Misalnya, alih-alih mengacu pada PORTB, panggilan dilakukan ke PORTB.DIRSET.



Perubahan lain diwakili oleh kode pengaturan frekuensi (_PROTECTED_WRITE(CLKCTRL.MCLKCTRLB, 0)). ATtiny406 baru berjalan pada 3.33 MHz setelah reboot, yang sesuai dengan clock dasar 20 MHz, yang dibagi dengan 6. Agar chip dapat bekerja dengan kecepatan penuh 20 MHz, kami menghapus register CLKCTRL.MCLKCTRLB. Karena register ini harus dilindungi dari perubahan yang tidak disengaja, pada ATtiny406, konstruksi perangkat lunak khusus harus diterapkan untuk memodifikasinya. Untungnya, makro mempermudah ini _PROTECTED_WRITE. Anda dapat membaca lebih lanjut tentang ini.disini .



Jika Anda membandingkan kode ini dengan kode yang ditulis untuk STM32 atau SAMD21, maka ternyata jauh lebih sederhana.



▍ Makefile



Di sini kami menggunakan struktur direktori berikut:



  • src/Atmel.ATtiny_DFP.1.6.326/ - jalur ke Paket Perangkat Microchip.
  • src/attiny406-test/- folder main.ctempat penyimpanan kode di atas dalam file .


Kompilasi kode dari direktori attiny406-test/dapat dilakukan dengan perintah berikut:



avr-gcc -mmcu=attiny406 -B ../Atmel.ATtiny_DFP.1.6.326/gcc/dev/attiny406/ -O3 -I ../Atmel.ATtiny_DFP.1.6.326/include/ -DF_CPU=20000000L -o attiny406-test.elf main.c


Bendera -Omemungkinkan Anda melakukan pengoptimalan yang diperlukan agar pemanggilan fungsi berhasil dengan sukses _delay_ms(). Hal yang sama berlaku untuk variabel -DF_CPU, yang isinya mencerminkan frekuensi chip yang diharapkan. Parameter lainnya berisi informasi tentang lokasi file untuk ATtiny406, yang sebelumnya kami unduh dan ekstrak dari arsip Paket Perangkat.



Untuk mengunduh firmware ke MCU, Anda perlu mengonversi apa yang Anda punya ke format Intel HEX. Setelah itu, Anda perlu menggunakan pyupdi. Kami telah membuat Makefilesolusi otomatis yang sederhana untuk tugas-tugas ini:



OBJS=main.o
ELF=$(notdir $(CURDIR)).elf  
HEX=$(notdir $(CURDIR)).hex
F_CPU=20000000L

CFLAGS=-mmcu=attiny406 -B ../Atmel.ATtiny_DFP.1.6.326/gcc/dev/attiny406/ -O3
CFLAGS+=-I ../Atmel.ATtiny_DFP.1.6.326/include/ -DF_CPU=$(F_CPU)
LDFLAGS=-mmcu=attiny406 -B ../Atmel.ATtiny_DFP.1.6.326/gcc/dev/attiny406/
CC=avr-gcc
LD=avr-gcc

all:    $(HEX)  

$(ELF): $(OBJS)
                $(LD) $(LDFLAGS) -o $@ $(OBJS) $(LDLIBS)

$(HEX): $(ELF)
                avr-objcopy -O ihex -R .eeprom $< $@

flash:  $(HEX)
                pyupdi -d tiny406 -c /dev/tty.usbserial-FTF5HUAV -f attiny406-test.hex

read-fuses:
                pyupdi -d tiny406 -c /dev/tty.usbserial-FTF5HUAV -fr

clean:
                rm -rf $(OBJS) $(ELF) $(HEX)


Untuk mengkompilasi kode, jalankan saja perintahnya make. Mengunduh kode ke mikrokontroler dilakukan dengan perintah make flash. Yang disajikan oleh kami Makefiledapat, jika perlu, direvisi.



Hasil



TinyAVR baru mudah diprogram seperti generasi MCU sebelumnya. Kuncinya adalah menemukan alat yang tepat. Jika Anda memiliki tip untuk memprogram AVRTiny, silakan bagikan dengan kami di Twitter atau di komentar di bawah.



Apakah Anda berencana menggunakan TinyAVR baru dalam proyek Anda?










All Articles