AVR - Cara memprogram chip AVR di Linux

22

Saya baru-baru ini mendapat AVRISmkII AVR programmer, dan saya punya ATtiny85 dan ATmega328. Saya bertanya-tanya bagaimana saya bisa memprogram chip ini (dengan programmer) tetapi ketika saya mencoba mendapatkan Atmel Studio 6 itu hanya untuk Windows. Apakah ada cara yang bisa saya gunakan di Linux (khusus Ubuntu)? Saran semut? Terima kasih!

pengguna151324
sumber

Jawaban:

36

Saya tidak punya waktu untuk penjelasan lengkap, tapi saya bisa memberi Anda buku resep gaya perintah 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 srecordopsional gdb-avr simulavruntuk 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 mudah.

  • Nama dasar dari file yang digunakan / dibuat: src=project
  • Bendera kompiler umum: cflags="-g -DF_CPU=${avrFreq} -Wall -Os - Werror -Wextra"

Variabel di bawah ini mungkin perlu diubah tergantung pada programmer yang Anda gunakan. Lihat manhalaman untuk detailnya.

  • baud=19200 Baudrate yang berkomunikasi dengan programmer Anda dengan PC:
  • programmerDev=/dev/ttyUSB003Nama perangkat tempat programmer Anda berada. Periksa dmesgoutput untuk detailnya.
  • programmerType=avrisp Ini mungkin berbeda untuk programmer Anda yang sebenarnya.

Variabel di bawah ini bergantung pada pengontrol yang tepat yang ingin Anda program:

  • avrType=attiny2313Periksa avrdude -c $programmerTypeperangkat yang didukung.
  • avrFreq=1000000 Periksa lembar data pengontrol untuk jam default.

Menyusun

  • 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 dengan keinginan pribadi saya, Anda dapat menyimpannya dengan nama Makefile(mind the capital M). Ia bekerja sebagai berikut:

  • make makefile Edit file makefile;
  • make edit Edit file sumber;
  • make flash Programkan memori flash perangkat;
  • make help Daftar perintah lain.

Inilah makefile:

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 dijalankan avrdudesebagai root, jika itu terjadi, ia membenarkan pertanyaan sendiri . Ini dapat dipecahkan dengan udevtetapi membutuhkan sedikit informasi spesifik dari bagaimana programmer diakui oleh sistem operasi.

Halo Dunia

Biarkan saya melempar 'Hello World' yang membuat pin pengontrol 2 (PB3) (mis. ATtiny13, ATtiny45, ATtiny85) beralih di 1Hz. Pasang LED dan resistor seri ke pin dan LED akan mulai berkedip.

  • edit

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

jippie
sumber
2
Tutorial Hello World yang pasti!
Vorac
11

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 bisa menggunakan avrdude.

Semua ini tersedia secara bebas dan siap pakai di Linux dan tidak terlalu sulit untuk dikonfigurasikan untuk bekerja bersama.

LadyAda memiliki tutorial langkah demi langkah yang solid pada seluruh proses.

NickHalden
sumber
0

Untuk mengembangkan AVR di Ubuntu hanya ada beberapa langkah:

Instal rantai-Alat :

sudo apt-get install gcc-avr binutils-avr gdb-avr avr-libc avrdude

Buat Hello world Code dan simpan:

#include<avr/io.h>
#define F_CPU 8000000UL
#include<util/delay.h>
int main() {
    DDRB = 0xff; // make PORTB as O/P   
    PORTB = 0xFF;
    while(1) {
        PORTB |= (1 << 0);               
        _delay_ms(100); 
        PORTB &= ~(1 << 0);     
        _delay_ms(100); 
    }
}

Unduh Makefile tempelate dan simpan di direktori yang sama tempat Anda menyimpan hello_world.cfile.

Edit Makefile :

# MCU name (Specify the MCU you are using)
MCU = atmega16
# Processor frequency.
F_CPU = 8000000
# Target file name (without extension).
#in this case file name is hello_world
TARGET = main

Bangun target

Cukup ketik makekonsol dan tekan enter.

Unggah instruksi ke AVR menggunakan avrdude

Gunakan perintah di konsol sebagai: (diasumsikan bahwa programmer yang Anda gunakan adalah usbasp, google atau lihat manual untuk opsi lain)

$avrdude -c m16 -p usbasp -U flash:w:hello_world.hex
tidak terpakai
sumber