Saya tidak punya waktu untuk penjelasan lengkap, tapi saya bisa memberi Anda perintah bergaya buku resep yang saya gunakan di kotak Linux saya untuk memprogram AVR:
Persiapan
- Di Ubuntu, pastikan beberapa paket yang diperlukan telah diinstal:
sudo apt-get install avr-libc avrdude binutils-avr gcc-avr srecord
secara opsional memasukkangdb-avr simulavr
untuk debug dan simulasi. - Saya mulai membuat direktori tempat semua proyek ATtiny saya menemukan rumah:
mkdir ~/attiny: cd ~/attiny
- Untuk setiap proyek, saya membuat subfolder khusus (dan saya tidak keberatan dengan nama panjang):
mkdir waveShare4digit8segmentDisplay; cd waveShare4digit8segmentDisplay
Buat sumber
- Edit file sumber dengan editor teks favorit Anda:
vi project.cpp
Pengaturan
Perintah di bawah ini sangat bergantung pada variabel lingkungan, agar pemeliharaan tetap mudah.
- Nama dasar file yang digunakan/dibuat:
src=project
- Flag compiler umum:
cflags="-g -DF_CPU=${avrFreq} -Wall -Os - Werror -Wextra"
Variabel di bawah ini mungkin perlu diubah tergantung pada programmer yang Anda gunakan. Lihat man
halaman untuk detail.
baud=19200
Baudrate yang digunakan pemrogram Anda untuk berkomunikasi dengan PC:programmerDev=/dev/ttyUSB003
Nama perangkat tempat programmer Anda berada. Periksadmesg
keluaran untuk detail.programmerType=avrisp
Ini mungkin berbeda untuk programmer Anda yang sebenarnya.
Variabel di bawah bergantung pada pengontrol persis yang ingin Anda program:
avrType=attiny2313
Periksaavrdude -c $programmerType
untuk perangkat yang didukung.avrFreq=1000000
Periksa lembar data pengontrol untuk mengetahui jam default.
Kompilasi
- Langkah pertama adalah membuat file objek:
avr-gcc ${cflags) -mmcu=${avrType) -Wa,-ahlmns=${src).lst -c -o ${src).o ${src).cpp
- Langkah kedua adalah membuat file ELF:
avr-gcc ${cflags) -mmcu=${avrType) -o ${src).elf ${src).o
- Langkah ketiga adalah membuat file Intel Hex, ini adalah file yang sebenarnya dikirim ke programmer:
avr-objcopy -j .text -j .data -O ihex ${src).elf ${src).flash.hex
Pemrograman
- Langkah terakhir adalah memprogram perangkat:
avrdude -p${avrType} -c${programmerType} -P${programmerDev} -b${baud} -v -U flash:w:${src}.flash.hex
Makefile
Sebagai alternatif untuk mengingat perintah, saya membuat makefile sesuai keinginan pribadi saya, Anda dapat menyimpannya dengan nama Makefile
(perhatikan huruf kapital M
). Cara kerjanya sebagai berikut:
make makefile
Edit makefile;make edit
Edit file sumber;make flash
Program memori flash perangkat;make help
Cantumkan perintah lain.
Ini makefilenya:
baud=19200
src=project
avrType=attiny2313
avrFreq=4000000 # 4MHz for accurate baudrate timing
programmerDev=/dev/ttyUSB003
programmerType=arduino
cflags=-g -DF_CPU=$(avrFreq) -Wall -Os -Werror -Wextra
memoryTypes=calibration eeprom efuse flash fuse hfuse lfuse lock signature application apptable boot prodsig usersig
.PHONY: backup clean disassemble dumpelf edit eeprom elf flash fuses help hex makefile object program
help:
@echo 'backup Read all known memory types from controller and write it into a file. Available memory types: $(memoryTypes)'
@echo 'clean Delete automatically created files.'
@echo 'disassemble Compile source code, then disassemble object file to mnemonics.'
@echo 'dumpelf Dump the contents of the .elf file. Useful for information purposes only.'
@echo 'edit Edit the .cpp source file.'
@echo 'eeprom Extract EEPROM data from .elf file and program the device with it.'
@echo 'elf Create $(src).elf'
@echo 'flash Program $(src).hex to controller flash memory.'
@echo 'fuses Extract FUSES data from .elf file and program the device with it.'
@echo 'help Show this text.'
@echo 'hex Create all hex files for flash, eeprom and fuses.'
@echo 'object Create $(src).o'
@echo 'program Do all programming to controller.'
edit:
vi $(src).cpp
makefile:
vi Makefile
#all: object elf hex
clean:
rm $(src).elf $(src).eeprom.hex $(src).fuses.hex $(src).lfuse.hex $(src).hfuse.hex $(src).efuse.hex $(src).flash.hex $(src).o
date
object:
avr-gcc $(cflags) -mmcu=$(avrType) -Wa,-ahlmns=$(src).lst -c -o $(src).o $(src).cpp
elf: object
avr-gcc $(cflags) -mmcu=$(avrType) -o $(src).elf $(src).o
chmod a-x $(src).elf 2>&1
hex: elf
avr-objcopy -j .text -j .data -O ihex $(src).elf $(src).flash.hex
avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 -O ihex $(src).elf $(src).eeprom.hex
avr-objcopy -j .fuse -O ihex $(src).elf $(src).fuses.hex --change-section-lma .fuse=0
srec_cat $(src).fuses.hex -Intel -crop 0x00 0x01 -offset 0x00 -O $(src).lfuse.hex -Intel
srec_cat $(src).fuses.hex -Intel -crop 0x01 0x02 -offset -0x01 -O $(src).hfuse.hex -Intel
srec_cat $(src).fuses.hex -Intel -crop 0x02 0x03 -offset -0x02 -O $(src).efuse.hex -Intel
disassemble: elf
avr-objdump -s -j .fuse $(src).elf
avr-objdump -C -d $(src).elf 2>&1
eeprom: hex
#avrdude -p$(avrType) -c$(programmerType) -P$(programmerDev) -b$(baud) -v -U eeprom:w:$(src).eeprom.hex
date
fuses: hex
avrdude -p$(avrType) -c$(programmerType) -P$(programmerDev) -b$(baud) -v -U lfuse:w:$(src).lfuse.hex
#avrdude -p$(avrType) -c$(programmerType) -P$(programmerDev) -b$(baud) -v -U hfuse:w:$(src).hfuse.hex
#avrdude -p$(avrType) -c$(programmerType) -P$(programmerDev) -b$(baud) -v -U efuse:w:$(src).efuse.hex
date
dumpelf: elf
avr-objdump -s -h $(src).elf
program: flash eeprom fuses
flash: hex
avrdude -p$(avrType) -c$(programmerType) -P$(programmerDev) -b$(baud) -v -U flash:w:$(src).flash.hex
date
backup:
@for memory in $(memoryTypes); do \
avrdude -p $(avrType) -c$(programmerType) -P$(programmerDev) -b$(baud) -v -U $$memory:r:./$(avrType).$$memory.hex:i; \
done
Tampaknya perlu untuk menjalankan avrdude
sebagai root
, jika itu terjadi, itu membenarkan pertanyaan tersendiri . Itu bisa diselesaikan dengan udev
tetapi membutuhkan sedikit informasi spesifik tentang bagaimana pemrogram dikenali oleh sistem operasi.
Halo Dunia
Biarkan saya memasukkan 'Hello World' yang membuat pin pengontrol 2 (PB3) (mis. ATtiny13, ATtiny45, ATtiny85) beralih pada 1Hz. Pasang LED dan resistor seri ke pin dan LED akan mulai berkedip.
- lakukan pengeditan
i
#include <avr/io.h>
#include <util/delay.h>
int main(void)
{
DDRB = 0x08;
while (1) {
PORTB = 0x00; _delay_ms(500);
PORTB = 0x08; _delay_ms(500);
}
}
<ESC>:wq
- buat flash
Selesai.
Anda dapat menggunakan alat AVR GNU sebagai paket mandiri di linux. Ini termasuk avr-gcc, avr-binutils, dan avr-libc. Inilah yang disebut sebagai toolchain.
Setelah Anda membuat file hex dan Anda ingin mem-flash-nya ke chip Anda, Anda dapat menggunakan avrdude.
Semua ini tersedia secara bebas dan tersedia di Linux dan tidak terlalu sulit dikonfigurasi untuk bekerja sama.
LadyAda memiliki tutorial langkah demi langkah yang solid tentang keseluruhan proses.