24 votos

AVR - Cómo programar un chip AVR en Linux

Recientemente he conseguido un programador AVRISmkII AVR, y tengo un ATtiny85 y un ATmega328. Me preguntaba cómo podría programar estos chips (con el programador) pero cuando intento conseguir Atmel Studio 6 es sólo para Windows. ¿Hay alguna manera de que yo podría utilizar en Linux (Ubuntu específicamente)? ¿Alguna sugerencia? ¡Gracias!

39voto

jason Puntos 147

No tengo tiempo para una explicación completa, pero puedo darte al estilo libro de cocina los comandos que uso en mi caja Linux para programar AVRs:

Preparativos

  • En Ubuntu, asegúrese de que están instalados varios paquetes necesarios: sudo apt-get install avr-libc avrdude binutils-avr gcc-avr srecord añadir opcionalmente gdb-avr simulavr para depuración y simulación.
  • Empecé a crear un directorio en el que todos mis proyectos ATtiny encuentran un hogar: mkdir ~/attiny: cd ~/attiny
  • Para cada proyecto creo una subcarpeta específica (y no me importan los nombres largos): mkdir waveShare4digit8segmentDisplay; cd waveShare4digit8segmentDisplay

Crear fuente

  • Edite el archivo fuente con su editor de texto favorito: vi project.cpp

Ajustes

Los siguientes comandos dependen en gran medida de las variables de entorno, para facilitar el mantenimiento.

  • El nombre base de los ficheros utilizados/creados: src=project
  • Banderas comunes del compilador: cflags="-g -DF_CPU=${avrFreq} -Wall -Os - Werror -Wextra"

Es posible que haya que modificar las variables siguientes en función del programador exacto que utilice. Consulte la man para más detalles.

  • baud=19200 La velocidad en baudios a la que su programador se comunica con el PC:
  • programmerDev=/dev/ttyUSB003 El nombre del dispositivo donde se encuentra su programador. Compruebe dmesg para más detalles.
  • programmerType=avrisp Esto puede ser diferente para su programador exacto.

Las variables que se indican a continuación dependen del controlador exacto que desee programar:

  • avrType=attiny2313 Consulte avrdude -c $programmerType para los dispositivos compatibles.
  • avrFreq=1000000 Consulta la hoja de datos del controlador para conocer el reloj por defecto.

Compile

  • El primer paso es crear un archivo de objetos: avr-gcc ${cflags) -mmcu=${avrType) -Wa,-ahlmns=${src).lst -c -o ${src).o ${src).cpp
  • El segundo paso es crear un archivo ELF: avr-gcc ${cflags) -mmcu=${avrType) -o ${src).elf ${src).o
  • El tercer paso es crear un archivo Intel Hex, este es el archivo que realmente se envía al programador: avr-objcopy -j .text -j .data -O ihex ${src).elf ${src).flash.hex

Programación

  • El último paso es programar el dispositivo: avrdude -p${avrType} -c${programmerType} -P${programmerDev} -b${baud} -v -U flash:w:${src}.flash.hex

Makefile

Como alternativa a recordar los comandos, he cocinado un makefile a mi gusto personal, puedes guardarlo bajo el nombre de Makefile (atención a la mayúscula M ). Funciona de la siguiente manera:

  • make makefile Edita el makefile;
  • make edit Edite el archivo fuente;
  • make flash Programa la memoria flash del dispositivo;
  • make help Enumera otros comandos.

Aquí está el 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

Puede parecer necesario ejecutar avrdude como root si eso ocurre justifica una pregunta en su . Puede resolverse con udev pero requiere un poco de información específica de cómo el programador es reconocido por el sistema operativo.

Hola Mundo

Permítanme lanzar un "Hola Mundo" que hace que un controlador pin 2 (PB3) (por ejemplo, ATtiny13, ATtiny45, ATtiny85) conmute a 1Hz. Conecta un LED y una resistencia en serie al pin y el LED debería empezar a parpadear.

  • hacer editar

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

  • hacer flash

Hecho.

11voto

Parvenu74 Puntos 257

Puedes utilizar las herramientas GNU de AVR como paquetes independientes en linux. Estas incluyen avr-gcc, avr-binutils, y avr-libc. Esto es lo que se conoce como la cadena de herramientas.

Una vez que hayas construido un archivo hexadecimal y desees flashearlo en tu chip, puedes utilizar avrdude.

Todos ellos están disponibles libre y fácilmente en Linux y no son demasiado difíciles de configurar para que funcionen juntos.

LadyAda tiene un sólido paso a paso tutorial en todo el proceso.

1voto

Nathan Friend Puntos 161

Para desarrollar AVR en Ubuntu sólo hay unos pocos pasos :

Instalar cadena de herramientas :

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

Crear un Código Hola mundo y guardar :

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

Descargar Makefile tempelate y guárdelo en el mismo directorio en el que guardó el archivo hello_world.c archivo.

Editar 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

Construir el objetivo

Sólo tienes que escribir make en la consola y pulsa intro.

Cargar instrucciones en el AVR utilizando avrdude

Utilice el comando en la consola como : (se supone que el programador que está utilizando es usbasp, busque en google o consulte el manual para otras opciones)

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

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X