AVR - Linux'ta bir AVR yongası nasıl programlanır


22

Geçenlerde bir AVRISmkII AVR programcısı aldım ve bir ATtiny85 ve ATmega328'im var. Bu çipleri (programlayıcıyla birlikte) nasıl programlayabileceğimi merak ediyordum ama Atmel Studio 6'yı almaya çalıştığımda sadece Windows için geçerli. Linux'ta kullanabileceğim bir yöntem var mı (özellikle Ubuntu)? Karınca önerileri? Teşekkürler!

Yanıtlar:


36

Tam bir açıklama yapmak için zamanım yok, ancak Linux kutumda AVR'leri programlamak için kullandığım komutları size yemek kitabı tarzı verebilirim:

hazırlıklar

  • Ubuntu'da, birkaç gerekli paketin kurulu olduğundan emin olun: sudo apt-get install avr-libc avrdude binutils-avr gcc-avr srecordisteğe bağlı gdb-avr simulavrolarak hata ayıklama ve simülasyon için devreye alın .
  • Tüm ATtiny projelerimin bir ev bulduğu bir dizin oluşturmaya başladım: mkdir ~/attiny: cd ~/attiny
  • Her proje için ayrı bir alt klasör oluşturuyorum (ve uzun isimleri umursamıyorum): mkdir waveShare4digit8segmentDisplay; cd waveShare4digit8segmentDisplay

Kaynak oluştur

  • Kaynak dosyayı favori metin düzenleyicinizle düzenleyin: vi project.cpp

Ayarlar

Aşağıdaki komutlar, bakımı kolaylaştırmak için çevre değişkenlerine büyük ölçüde dayanır.

  • Kullanılan / oluşturulan dosyaların temel adı: src=project
  • Ortak derleyici bayrakları: cflags="-g -DF_CPU=${avrFreq} -Wall -Os - Werror -Wextra"

Aşağıdaki değişkenlerin, kullandığınız programlayıcıya bağlı olarak değiştirilmesi gerekebilir. manDetaylar için sayfalara bakınız.

  • baud=19200 Programlayıcınızın bilgisayarla iletişim kurduğu baudrate:
  • programmerDev=/dev/ttyUSB003Programlayıcınızın bulunduğu cihaz adı. dmesgDetaylar için çıktıyı kontrol edin .
  • programmerType=avrisp Bu, tam programlayıcınız için farklı olabilir.

Aşağıdaki değişkenler programlamak istediğiniz tam denetleyiciye bağlıdır:

  • avrType=attiny2313avrdude -c $programmerTypeDesteklenen cihazları kontrol edin .
  • avrFreq=1000000 Varsayılan saat için denetleyicinin veri sayfasını kontrol edin.

derleme

  • İlk adım, bir nesne dosyası oluşturmaktır: avr-gcc ${cflags) -mmcu=${avrType) -Wa,-ahlmns=${src).lst -c -o ${src).o ${src).cpp
  • İkinci adım bir ELF dosyası oluşturmaktır: avr-gcc ${cflags) -mmcu=${avrType) -o ${src).elf ${src).o
  • Üçüncü adım bir Intel Hex dosyası oluşturmaktır, bu aslında programlayıcıya gönderilen dosyadır: avr-objcopy -j .text -j .data -O ihex ${src).elf ${src).flash.hex

Programlama

  • Son adım, cihazı programlamaktır: avrdude -p${avrType} -c${programmerType} -P${programmerDev} -b${baud} -v -U flash:w:${src}.flash.hex

Makefile

Komutları hatırlamaya bir alternatif olarak, kişisel beğenime bir telafi oluşturdum, bunu ad altında saklayabilirsiniz Makefile(başkenti dikkate alın M). Aşağıdaki gibi çalışır:

  • make makefile Makefile dosyasını düzenleyin;
  • make edit Kaynak dosyayı düzenleyin;
  • make flash Cihazın flash belleğini programlayın;
  • make help Diğer komutları listele.

İşte 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

Çalıştırmak için gerekli görünmektedir edilebilir avrdudeolarak rooto olur, kendi başına bir soruyu haklı . İle çözülebilir, udevancak programcının işletim sistemi tarafından nasıl tanındığı hakkında biraz spesifik bilgi gerektirir.

Selam Dünya

Kontrolör pimi 2 (PB3) (örn. ATtiny13, ATtiny45, ATtiny85) 'in 1Hz'de değişmesini sağlayan' Merhaba Dünya 'atmama izin verin. Pime bir LED ve seri direnç takın ve LED yanıp sönmeye başlamalıdır.

  • düzenleme yap

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

  • flaş yapmak

Bitti.


2
Kesin Merhaba Dünya eğitimi!
Vorac

11

AVR GNU araçlarını linux'ta bağımsız paketler olarak kullanabilirsiniz. Bunlar arasında avr-gcc, avr-binutils ve avr-libc bulunur. Buna takım zinciri denir.

Onaltılık bir dosya oluşturduktan ve çipinize aktarmak istediğinizde avrdude kullanabilirsiniz.

Bunların hepsi Linux üzerinde özgürce ve kolayca erişilebilir durumda ve birlikte çalışmak için yapılandırılmaları çok zor değil.

LadyAda, tüm süreç boyunca adım adım öğretici olarak sağlam bir adım attı .


0

Ubuntu'da AVR geliştirmek için sadece birkaç adım var:

Takım zincirini kurun :

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

Bir Merhaba dünya kodu oluşturun ve kaydedin:

#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); 
    }
}

Make file ılıman indirin ve dosyayı kaydettiğiniz aynı dizine kaydedin hello_world.c.

Makefile Düzenle :

# 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

Hedef oluştur

Sadece makekonsolu yazın ve enter tuşuna basın.

Avrdude kullanarak talimatları AVR'ye yükleyin

Konsoldaki komutu şu şekilde kullanın: (kullandığınız programcının usbasp, google veya diğer seçenekler için kılavuza bakın)

$avrdude -c m16 -p usbasp -U flash:w:hello_world.hex
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.