atmega 8 vacio... como cargar BOOT Loader  co

Hola!! quiero pedirles un pokito de ayuda....

Tengo una placa de desarrollo para un atmega 8, le hice un complemento con el chip FT232RL para poder conectarlo USB al estilo Arduino tengo una ISP AVRISP mkII q es USB y no he podido cargarle el boot loader si alguien me dice los paso simples para lograrlo.. por favor muchas gracias...

Hola,

tu pregunta esta resuelta en la siguiente web:

http://www.arduino.cc/en/Hacking/Bootloader

Ahi se explica que es el bootloader, como quemarlo y demas. Por otra parte ayudaria saber que sistema operativo tienes, por ejemplo, la instalacion del AVRISP MKII no es inmediata. En cualquier caso, la hemos descrito en la siguiente web:

http://www.arduino.cc/playground/Learning/Tutorials#Bootloader

Echa un vistazo y no dudes en preguntar cualquier cosa.

Un abrazo,

/d

mmmmm....gracias por la respuesta...

pero sigo con el problema .. yo tengo hace tiempo funcionando el averisp y cargo programas sin problemas... seguí lo indicado por esa pagina y no me funciono.... el problema es con librerias la parecer por q me dice q no ATmegaBOOT.o: In function main': C:\bootloader/ATmegaBOOT.c:411: undefined reference toeeprom_rb' ATmegaBOOT.o: In function getch': C:\bootloader/ATmegaBOOT.c:500: undefined reference toinb' C:\bootloader/ATmegaBOOT.c:500: undefined reference to inb' C:\bootloader/ATmegaBOOT.c:500: undefined reference toinb' C:\bootloader/ATmegaBOOT.c:500: undefined reference to inb' C:\bootloader/ATmegaBOOT.c:500: undefined reference toinb' ATmegaBOOT.o:C:\bootloader/ATmegaBOOT.c:511: more undefined references to `inb' follow avr-objdump: 'ATmegaBOOT.elf': No such file avr-objcopy: 'ATmegaBOOT.elf': No such file avr-objcopy: 'ATmegaBOOT.elf': No such file avr-objcopy: 'ATmegaBOOT.elf': No such file Presione una tecla para continuar . . .

como no me funciono asi intente utilizar el codigo q descargue de la misma pagina... intente cargarlo como cualkier otro programa y me tirava los mismo errores , logre corregir el de la librerias con referencias a "inb" pero las de eeprom, no he podido ....

Disculpen si el problema es muy tonto pero soy nuevo en esto...

Aha!

lo que sucede es que quieres compilar el codigo y no solo subirlo a la placa, no? Te fallan las referencias porque para compilar el bootloader hace falta tener bien las referencias de las carpetas en el Makefile.

Vayamos paso por paso:

1) tienes instalado cygwin, o AVRStudio o solo tienes montado el IDE de Arduino?

2) tienes el Makefile que estas utilizando? Lo podrias pegar en el foro?

3) en que carpeta tienes metido Arduino?

/d

gracias por responder tan rápidamente…
l make file es el mismo q viene para descargar…

Makefile for ATmegaBOOT

E.Lins, 2004-10-14

program name should not be changed…

PROGRAM = ATmegaBOOT

enter the product name for which you want to build the bootloader/monitor

currently CRUMB8, CRUMB128 and PROBOMEGA128 are supported

PRODUCT = CRUMB128

enter the parameters for the UISP isp tool

#ISPPARAMS = -dprog=stk200 -dlpt=0x378
ISPPARAMS = -dprog=stk500 -dserial=/dev/com1 -dspeed=115200

############################################################

You should not have to change anything below here.

############################################################

ifeq ($(PRODUCT),CRUMB8)
MCU_TARGET = atmega8
LDSECTION = --section-start=.text=0x1800
FUSE_L = 0xdf
FUSE_H = 0xc8
ISPFUSES = ./uisp -dpart=ATmega8 $(ISPPARAMS) --wr_fuse_l=$(FUSE_L) --wr_fuse_h=$(FUSE_H)
ISPFLASH = ./uisp -dpart=ATmega8 $(ISPPARAMS) --erase --upload if=$(PROGRAM).hex -v
endif

ifeq ($(PRODUCT),CRUMB128)
MCU_TARGET = atmega128
LDSECTION = --section-start=.text=0x1E000
FUSE_L = 0xdf
FUSE_H = 0xc8
FUSE_E = 0xff
ISPFUSES = ./uisp -dpart=ATmega128 $(ISPPARAMS) --wr_fuse_l=$(FUSE_L) --wr_fuse_h=$(FUSE_H) --wr_fuse_e=$(FUSE_E)
ISPFLASH = ./uisp -dpart=ATmega128 $(ISPPARAMS) --erase --upload if=$(PROGRAM).hex -v
endif

ifeq ($(PRODUCT),PROBOMEGA128)
MCU_TARGET = atmega128
LDSECTION = --section-start=.text=0x1E000
FUSE_L = 0xdf
FUSE_H = 0xc8
FUSE_E = 0xff
ISPFUSES = ./uisp -dpart=ATmega128 $(ISPPARAMS) --wr_fuse_l=$(FUSE_L) --wr_fuse_h=$(FUSE_H) --wr_fuse_e=$(FUSE_E)
ISPFLASH = ./uisp -dpart=ATmega128 $(ISPPARAMS) --erase --upload if=$(PROGRAM).hex -v
endif

OBJ = $(PROGRAM).o
OPTIMIZE = -O3

DEFS =
LIBS =

CC = avr-gcc

Override is only needed by avr-lib build system.

override CFLAGS = -g -Wall $(OPTIMIZE) -mmcu=$(MCU_TARGET) -D$(PRODUCT) $(DEFS)
override LDFLAGS = -Wl,-Map,$(PROGRAM).map,$(LDSECTION)

OBJCOPY = avr-objcopy
OBJDUMP = avr-objdump

all: $(PROGRAM).elf lst text

isp: $(PROGRAM).hex
$(ISPFUSES)
$(ISPFLASH)

$(PROGRAM).elf: $(OBJ)
$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $^ $(LIBS)

clean:
rm -rf *.o *.elf
rm -rf *.lst *.map

lst: $(PROGRAM).lst

%.lst: %.elf
$(OBJDUMP) -h -S $< > $@

Rules for building the .text rom images

text: hex bin srec

hex: $(PROGRAM).hex
bin: $(PROGRAM).bin
srec: $(PROGRAM).srec

%.hex: %.elf
$(OBJCOPY) -j .text -j .data -O ihex $< $@

%.srec: %.elf
$(OBJCOPY) -j .text -j .data -O srec $< $@

%.bin: %.elf
$(OBJCOPY) -j .text -j .data -O binary $< $@

q es lo q tendria q modificar para q detecte correctamente las librerias q son invocadas…
hay problemas con las librerias avrlibdef.h y la eeprom.h

gracias…de :)nuevo…

Hej,

ya veo que tienes un makefile que no corresponde. Este no compila el fichero para el atmega168, solo para el atmega8 (y aparte para el atmega128). Como ves esta basado en otro fichero que ya te adelanto que esta sacado de la web www.chip45.com que es de donde nos inspiramos para hacer el bootloader.

Claramente no te esta funcionando por esto.

Tenemos que ajustar unas cuantas cosas. En primer lugar, no se en que puerto tienes conectado tu AVRISP. Estas seguro de que es el /dev/com1? porque eso es lo que has declarado en el fichero make:

ISPPARAMS  = -dprog=stk500 -dserial=/dev/com1 -dspeed=115200

Por otra parte, la configuracion que has seleccionado por defecto es la del CRUMB128 que es una que compilara algo para el ATMEGA128 que no es el que lleva Arduino.

Yo te recomendaria mas un Makefile como el que sigue:

# Makefile for ATmegaBOOT
# E.Lins, 2004-10-14

# program name should not be changed...
PROGRAM    = ATmegaBOOT

PRODUCT=atmega8

# enter the parameters for the UISP isp tool
## EL PUERTO SERIE SE LO TIENES QUE PASAR COMO PARAMETRO AL MAKE FILE
ISPPARAMS  = -dprog=stk500 -dserial=$(SERIAL) -dspeed=115200


## TIENES QUE INTRODUCIR LA CARPETA DE TOOLS DENTRO DE ARDUINO COMO DIRAVR
#DIRAVR = /usr/local/avr
DIRAVRBIN = $(DIRAVR)/bin
DIRAVRUTILS = $(DIRAVR)/utils/bin
DIRINC = $(DIRAVR)/include
DIRLIB = $(DIRAVR)/avr/lib


MCU_TARGET = atmega8
LDSECTION  = --section-start=.text=0x1c00
FUSE_L     = 0xdf
FUSE_H     = 0xca
ISPFUSES   = $(DIRAVRBIN)/uisp -dpart=ATmega8 $(ISPPARAMS) --wr_fuse_l=$(FUSE_L) --wr_fuse_h=$(FUSE_H)
ISPFLASH   = $(DIRAVRBIN)/uisp -dpart=ATmega8 $(ISPPARAMS) --erase --upload if=$(PROGRAM).hex -v


OBJ        = $(PROGRAM).o
OPTIMIZE   = -Os

DEFS       = -DF_CPU=16000000 -DBAUD_RATE=19200
LIBS       =

CC         = $(DIRAVRBIN)/avr-gcc


# Override is only needed by avr-lib build system.

override CFLAGS        = -g -Wall $(OPTIMIZE) -mmcu=$(MCU_TARGET) -D$(PRODUCT) $(DEFS) -I$(DIRINC)
override LDFLAGS       = -Wl,-Map,$(PROGRAM).map,$(LDSECTION)

OBJCOPY        = $(DIRAVRBIN)/avr-objcopy
OBJDUMP        = $(DIRAVRBIN)/avr-objdump
SIZE           = $(DIRAVRBIN)/avr-size

all: $(PROGRAM).elf lst text asm size

isp: $(PROGRAM).hex
      $(ISPFUSES)
      $(ISPFLASH)

$(PROGRAM).elf: $(OBJ)
      $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $^ $(LIBS)

clean:
      rm -rf *.s
      rm -rf *.o *.elf
      rm -rf *.lst *.map

asm: $(PROGRAM).s

%.s: %.c
      $(CC) -S $(CFLAGS) -g1 $^

lst:  $(PROGRAM).lst

%.lst: %.elf
      $(OBJDUMP) -h -S $< > $@

size: $(PROGRAM).hex
      $(SIZE) $^

# Rules for building the .text rom images

text: hex bin srec

hex:  $(PROGRAM).hex
bin:  $(PROGRAM).bin
srec: $(PROGRAM).srec

%.hex: %.elf
      $(OBJCOPY) -j .text -j .data -O ihex $< $@

%.srec: %.elf
      $(OBJCOPY) -j .text -j .data -O srec $< $@

%.bin: %.elf
      $(OBJCOPY) -j .text -j .data -O binary $< $@

Este makefile que acabo de pasarte es el que hace la compilacion para el ATMEGA8. Para el ATMEGA168 es analogo:

# Makefile for ATmegaBOOT
# E.Lins, 18.7.2005
# $Id$

# Instructions
#
# To build the bootloader for the Diecimila:
# make diecimila
#
# To build the bootloader for the NG/Mini:
# make ng
#
# To burn the bootloader:
# make TARGET=diecimila isp
# make TARGET=ng isp

# program name should not be changed...
PROGRAM    = ATmegaBOOT_168

# enter the target CPU frequency
AVR_FREQ   = 16000000L

# enter the parameters for the avrdude isp tool
ISPTOOL         = stk500v2
ISPPORT         = usb
ISPSPEED   = -b 115200

MCU_TARGET = atmega168
LDSECTION  = --section-start=.text=0x3800

# the efuse should really be 0xf8; since, however, only the lower
# three bits of that byte are used on the atmega168, avrdude gets
# confused if you specify 1's for the higher bits, see:
# http://tinker.it/now/2007/02/24/the-tale-of-avrdude-atmega168-and-extended-bits-fuses/
#
# similarly, the lock bits should be 0xff instead of 0x3f (to
# unlock the bootloader section) and 0xcf instead of 0x0f (to
# lock it), but since the high two bits of the lock byte are
# unused, avrdude would get confused.
ISPFUSES    = avrdude -c $(ISPTOOL) -p m168 -P $(ISPPORT) $(ISPSPEED) -e -u -U lock:w:0x3f:m -U efuse:w:0x00:m -U hfuse:w:0xdf:m -U lfuse:w:0xff:m
ISPFLASH    = avrdude -c $(ISPTOOL) -p m168 -P $(ISPPORT) $(ISPSPEED) -U flash:w:$(PROGRAM)_$(TARGET).hex -U lock:w:0x0f:m


OBJ        = $(PROGRAM).o
OPTIMIZE   = -O2

DEFS       = 
LIBS       =

CC         = avr-gcc


# Override is only needed by avr-lib build system.

override CFLAGS        = -g -Wall $(OPTIMIZE) -mmcu=$(MCU_TARGET) -DF_CPU=$(AVR_FREQ) $(DEFS)
override LDFLAGS       = -Wl,$(LDSECTION)
#override LDFLAGS       = -Wl,-Map,$(PROGRAM).map,$(LDSECTION)

OBJCOPY        = avr-objcopy
OBJDUMP        = avr-objdump

all:

diecimila: TARGET = diecimila
diecimila: CFLAGS += '-DMAX_TIME_COUNT=F_CPU>>4' '-DNUM_LED_FLASHES=1'
diecimila: $(PROGRAM)_diecimila.hex

ng: TARGET = ng
ng: CFLAGS += '-DMAX_TIME_COUNT=F_CPU>>1' '-DNUM_LED_FLASHES=3'
ng: $(PROGRAM)_ng.hex

isp: $(PROGRAM)_$(TARGET).hex
      $(ISPFUSES)
      $(ISPFLASH)

%.elf: $(OBJ)
      $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $^ $(LIBS)

clean:
      rm -rf *.o *.elf *.lst *.map *.sym *.lss *.eep *.srec *.bin *.hex

%.lst: %.elf
      $(OBJDUMP) -h -S $< > $@

%.hex: %.elf
      $(OBJCOPY) -j .text -j .data -O ihex $< $@

%.srec: %.elf
      $(OBJCOPY) -j .text -j .data -O srec $< $@

%.bin: %.elf
      $(OBJCOPY) -j .text -j .data -O binary $< $@

/d

Hola... quiero hacer otra consulta, el atmega 8 soporta como máximo un cristal de 16MHz yo tengo una placa de desarrollo par atmega8 con un cristal de 4MHz, podría cambiarle el cristal a uno mayo pero no he encontrado de 16MHz, la pregunta es si arduino esta diseñado para 16MHZ q cambios habría q realizar le al boot loader para lograr q funcione sin problemas y en las mismas condiciones, y si es q tuviera una mínima frecuencia de oscilación para funcionar cual seria.......

Hola,

dentro del codigo del bootloader hay una linea que contiene la informacion del reloj. No recuerdo si es la variable CPU_CLOCK o similar, y esta programada como 16000000, solo tienes que substituirlo por 4000000.

Despues recompilas el bootloader y listos.

/d