Не шьётся левый boot, вопрос знатокам AVR

icms
Offline
Зарегистрирован: 22.03.2011

История такая. потребовалось мне залить в мегу чужую програмку , компилировал в hex сам в PN winawr(сразу скажу програмка не маленькая и переделке в среду ардуино не подлежит из за некоторых ограничений ardino ide - железо) .

Шью с по мошью arduino isp (контроллер arduino nano v3 atmega328) испробывал разные варианты из arduino ide , из PN(programers notepad) входит в состав winavr. После небольших танцев с бубном всё залилось без ошибок.

Но вот незадача прога явно не работает, порт молчит(програмка при старте должна плевать по usart отчётом о начале работы), ещё на что обратил внимание наш led pin (portb 7) в high состоянии т.е. светик горит и не мигает даже при нажатии reset. Ну думаю забугорные ребята подкололи с прогой.

Придумываю проверку - самый просстой blink на С (для надёжности долблю сразу весь порт Б), компилирую опять таки заливаю разными способами. Результат тот же. Лед горит, порт пустой.Прогу проверил на arduino pro mini atmega168 всё мигает, работает.

Мега живая родной бутлоадер зашивает и работает.

Как так, понимаю что вопрос сложный , но может кто сталкивался.

 

Клапауций
Offline
Зарегистрирован: 10.02.2013

Вопрос не сложный, если вы ставите перед собой задачу проверить шьётся МК или нет - дуде вам в консоли говорит, что произошло: прошилось/не прошилось, верифицировалось или нед...

icms
Offline
Зарегистрирован: 22.03.2011

 Понимаю много текста , но я написал, указал что камень(mega 2560) зашивается успешно, со стороны дюды нет ошибок, но не работает заведомо рабочий код который работает на других процессорах(mega168)

leshak
Offline
Зарегистрирован: 29.09.2011

Погодте. А вы 168 и 2560 шьете одной и той же прошивкой? Один и тот же .hex заливаете в разные камни?

icms
Offline
Зарегистрирован: 22.03.2011

Да нет я на этих прошивка уже табун лошадей съел(произвожу для работы контроллеры на базе ардуино, сам платы делаю сам паяю , сам шью)

конечно прошивки разные вернее makefile разные и так по мелочам.

Если есть у ког проверенный hex с makefile для mega2560 так чтобы в порт чё слал имигал. Может я действительно чего то не учитываю, хотя получается в 2 прогах ошибаюсь, странно.

может что makefile& вот он (немного укороченный, мусор немного выкинул)




MCU = atmega2560


F_OSC = 16000000


FORMAT = ihex


TARGET = main



SRC = test.c 

ASRC = 

OPT = s

DEBUG = dwarf-2

EXTRAINCDIRS = 

CSTANDARD = -std=gnu99

CDEFS =

CINCS =


CFLAGS = -g$(DEBUG)
CFLAGS += $(CDEFS) $(CINCS)
CFLAGS += -O$(OPT)
CFLAGS += -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums
CFLAGS += -Wall -Wstrict-prototypes
CFLAGS += -Wa,-adhlns=$(<:.c=.lst)
CFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS))
CFLAGS += $(CSTANDARD)
CFLAGS += -DF_OSC=$(F_OSC)


ASFLAGS = -Wa,-adhlns=$(<:.S=.lst),-gstabs 
ASFLAGS += -DF_OSC=$(F_OSC)

PRINTF_LIB_MIN = -Wl,-u,vfprintf -lprintf_min


PRINTF_LIB_FLOAT = -Wl,-u,vfprintf -lprintf_flt

PRINTF_LIB = 


SCANF_LIB_MIN = -Wl,-u,vfscanf -lscanf_min

SCANF_LIB_FLOAT = -Wl,-u,vfscanf -lscanf_flt

SCANF_LIB = 

MATH_LIB = -lm


EXTMEMOPTS =


LDFLAGS = -Wl,-Map=$(TARGET).map,--cref
LDFLAGS += $(EXTMEMOPTS)
LDFLAGS += $(PRINTF_LIB) $(SCANF_LIB) $(MATH_LIB)


AVRDUDE_PROGRAMMER = stk500v1

AVRDUDE_PORT = com6    # programmer connected to serial device

AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex
#
AVRDUDE_FLAGS = -p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER)
AVRDUDE_FLAGS += $(AVRDUDE_NO_VERIFY)
AVRDUDE_FLAGS += $(AVRDUDE_VERBOSE)
AVRDUDE_FLAGS += $(AVRDUDE_ERASE_COUNTER)



# ---------------------------------------------------------------------------

# Define directories, if needed.
DIRAVR = c:/winavr
DIRAVRBIN = $(DIRAVR)/bin
DIRAVRUTILS = $(DIRAVR)/utils/bin
DIRINC = .
DIRLIB = $(DIRAVR)/avr/lib


# Define programs and commands.
SHELL = sh
CC = avr-gcc
OBJCOPY = avr-objcopy
OBJDUMP = avr-objdump
SIZE = avr-size
NM = avr-nm
AVRDUDE = avrdude
REMOVE = rm -f
COPY = cp




# Define Messages
# English
MSG_ERRORS_NONE = Errors: none
MSG_BEGIN = -------- begin --------
MSG_END = --------  end  --------
MSG_SIZE_BEFORE = Size before: 
MSG_SIZE_AFTER = Size after:
MSG_COFF = Converting to AVR COFF:
MSG_EXTENDED_COFF = Converting to AVR Extended COFF:
MSG_FLASH = Creating load file for Flash:
MSG_EEPROM = Creating load file for EEPROM:
MSG_EXTENDED_LISTING = Creating Extended Listing:
MSG_SYMBOL_TABLE = Creating Symbol Table:
MSG_LINKING = Linking:
MSG_COMPILING = Compiling:
MSG_ASSEMBLING = Assembling:
MSG_CLEANING = Cleaning project:




# Define all object files.
OBJ = $(SRC:.c=.o) $(ASRC:.S=.o) 

# Define all listing files.
LST = $(ASRC:.S=.lst) $(SRC:.c=.lst)


# Compiler flags to generate dependency files.
### GENDEPFLAGS = -Wp,-M,-MP,-MT,$(*F).o,-MF,.dep/$(@F).d
GENDEPFLAGS = -MD -MP -MF .dep/$(@F).d

# Combine all necessary flags and optional flags.
# Add target processor to flags.
ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS) $(GENDEPFLAGS)
ALL_ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS)





# Default target.
all: begin gccversion sizebefore build sizeafter finished end

build: elf hex eep lss sym

elf: $(TARGET).elf
hex: $(TARGET).hex
eep: $(TARGET).eep
lss: $(TARGET).lss 
sym: $(TARGET).sym



# Eye candy.
# AVR Studio 3.x does not check make's exit code but relies on
# the following magic strings to be generated by the compile job.

begin:
	@echo
	@echo $(MSG_BEGIN)

finished:
	@echo $(MSG_ERRORS_NONE)

end:
	@echo $(MSG_END)
	@echo


# Display size of file.
HEXSIZE = $(SIZE) --target=$(FORMAT) $(TARGET).hex
ELFSIZE = $(SIZE) -A $(TARGET).elf
HUMANSIZE = $(SIZE) --mcu=$(MCU) -C $(TARGET).elf

sizebefore:
	@if [ -f $(TARGET).elf ]; then echo; echo $(MSG_SIZE_BEFORE); $(ELFSIZE); echo; fi

sizeafter:
	@if [ -f $(TARGET).elf ]; then echo; echo $(MSG_SIZE_AFTER); $(HUMANSIZE); echo; fi

# Display compiler version information.
gccversion : 
	@$(CC) --version



# Program the device.  
program: $(TARGET).hex $(TARGET).eep
	$(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) $(AVRDUDE_WRITE_EEPROM)




# Convert ELF to COFF for use in debugging / simulating in AVR Studio or VMLAB.
COFFCONVERT=$(OBJCOPY) --debugging \
--change-section-address .data-0x800000 \
--change-section-address .bss-0x800000 \
--change-section-address .noinit-0x800000 \
--change-section-address .eeprom-0x810000 


coff: $(TARGET).elf
	@echo
	@echo $(MSG_COFF) $(TARGET).cof
	$(COFFCONVERT) -O coff-avr $< $(TARGET).cof


extcoff: $(TARGET).elf
	@echo
	@echo $(MSG_EXTENDED_COFF) $(TARGET).cof
	$(COFFCONVERT) -O coff-ext-avr $< $(TARGET).cof



# Create final output files (.hex, .eep) from ELF output file.
%.hex: %.elf
	@echo
	@echo $(MSG_FLASH) $@
	$(OBJCOPY) -O $(FORMAT) -R .eeprom $< $@

%.eep: %.elf
	@echo
	@echo $(MSG_EEPROM) $@
	-$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \
	--change-section-lma .eeprom=0 -O $(FORMAT) $< $@

# Create extended listing file from ELF output file.
%.lss: %.elf
	@echo
	@echo $(MSG_EXTENDED_LISTING) $@
	$(OBJDUMP) -h -S $< > $@

# Create a symbol table from ELF output file.
%.sym: %.elf
	@echo
	@echo $(MSG_SYMBOL_TABLE) $@
	$(NM) -n $< > $@



# Link: create ELF output file from object files.
.SECONDARY : $(TARGET).elf
.PRECIOUS : $(OBJ)
%.elf: $(OBJ)
	@echo
	@echo $(MSG_LINKING) $@
	$(CC) $(ALL_CFLAGS) $(OBJ) --output $@ $(LDFLAGS)


# Compile: create object files from C source files.
%.o : %.c
	@echo
	@echo $(MSG_COMPILING) $<
	$(CC) -c $(ALL_CFLAGS) $< -o $@ 


# Compile: create assembler files from C source files.
%.s : %.c
	$(CC) -S $(ALL_CFLAGS) $< -o $@


# Assemble: create object files from assembler source files.
%.o : %.S
	@echo
	@echo $(MSG_ASSEMBLING) $<
	$(CC) -c $(ALL_ASFLAGS) $< -o $@



# Target: clean project.
clean: begin clean_list finished end

clean_list :
	@echo
	@echo $(MSG_CLEANING)
	$(REMOVE) $(TARGET).hex
	$(REMOVE) $(TARGET).eep
	$(REMOVE) $(TARGET).obj
	$(REMOVE) $(TARGET).cof
	$(REMOVE) $(TARGET).elf
	$(REMOVE) $(TARGET).map
	$(REMOVE) $(TARGET).obj
	$(REMOVE) $(TARGET).a90
	$(REMOVE) $(TARGET).sym
	$(REMOVE) $(TARGET).lnk
	$(REMOVE) $(TARGET).lss
	$(REMOVE) $(OBJ)
	$(REMOVE) $(LST)
	$(REMOVE) $(SRC:.c=.s)
	$(REMOVE) $(SRC:.c=.d)
	$(REMOVE) .dep/*



# Include the dependency files.
-include $(shell mkdir .dep 2>/dev/null) $(wildcard .dep/*)


# Listing of phony targets.
.PHONY : all begin finish end sizebefore sizeafter gccversion \
build elf hex eep lss sym coff extcoff \
clean clean_list program

 

icms
Offline
Зарегистрирован: 22.03.2011

Решил проверить фьюзы, вот что выдаёт.







C:\WinAVR-20100110\bin\avrdude.exe -C C:\WinAVR-20100110\bin\avrdude.conf -p m2560 -P com6 -c stk500v1 -b19200 -U efuse:v:0xFF:m -U hfuse:v:0x99:m -U lfuse:v:0x65:m 

avrdude.exe: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.06s

avrdude.exe: Device signature = 0x1e9801
avrdude.exe: verifying efuse memory against 0xFF:
avrdude.exe: load data efuse data from input file 0xFF:
avrdude.exe: input file 0xFF contains 1 bytes
avrdude.exe: reading on-chip efuse data:

Reading | ################################################## | 100% 0.02s

avrdude.exe: verifying ...
avrdude.exe: verification error, first mismatch at byte 0x0000
             0xff != 0xfd
avrdude.exe: verification error; content mismatch

avrdude.exe done.  Thank you.

 

Складывается такое впечатление что не туда по адресу шьёт, не в начало, потом идёт наложение и сбой.

 

 

Клапауций
Offline
Зарегистрирован: 10.02.2013
avrdude.exe: verifying ...
avrdude.exe: verification error, first mismatch at byte 0x0000
             0xff != 0xfd
avrdude.exe: verification error; content mismatch

Было у меня подобное при попытке верификации залоченного МК.

Что нужно сделать:

- фьюзы считать реально, а не глючно и сравнить записанное с записываемым:
пример:
avrdude -p ATtiny2313 -c stk500v2 -U lfuse:r:lfuse.txt:h -U hfuse:r:hfuse.txt:h
- стереть МК полностью.
- прошить фьюзы, соответвующие размеру лоадера.*
- залить лоадер.
- залочить лоадер(иногда бывает не нужно).
 
*подозреваю, что где-то здесь кроется проблема - лоадер не помещается полностью в защищённую загрузочную область и, впоследствии, перезаписывается при заливке скетча.
icms
Offline
Зарегистрирован: 22.03.2011

На данный момент наверное 90% уверенность что всё дело в родном бутлоадере и втом что для прошивки я использую арду как isp программатор с stk500v1. Идея таже, родной бутлодер в связке с програмтором -мешает прошивке, шьёт не туда.

icms
Offline
Зарегистрирован: 22.03.2011

Считал  всё содержимое памяти 2560, как и прдпологал аруевский бут на месте в конце памяти, моя прога в начале. В общем там полная каша. Пытался почистить дудкой -е результат удивил всё осталось на своих местах.

 

Есть какой вариант почистить всё под ноль? заодно чтобы и фьюзы на заводские стали.

меня там беспокоят фьюзы , добраться к ним из дудки почемуто не получилось

BOOTSZ1 2

BOOTSZ0 1

BOOTRST

Клапауций
Offline
Зарегистрирован: 10.02.2013

icms пишет:
Есть какой вариант почистить всё под ноль? заодно чтобы и фьюзы на заводские стали.

Единственный: avrdude -p ATtiny2313 -c stk500v2 -e

локи снимутся, фьюзы настроек платы дуино останутся - зачем их сбрасывать?

icms
Offline
Зарегистрирован: 22.03.2011

ФУУУУУУх

начнём сначала.

1. avrdude  -e не вытирает память а только убирает указатели, как на компе стёрли название файла значит его нет а он на месте, а мегах таже фигня, вероятно экономят циклы записи.

2. Далеко не каждую програмулину можно записать как бут, есть элементарное ораничение размер у меня мега2560 так там 8к я лил 11к. Ко всему прочему арда использует адрес старта лоадера.

3. Для того чтобы в арду HEX файл(не как бутлоадер, а просто как программу)  использовать arduino as isp програматор не не нужно. Т.е. вторая арда не нужна. Льётся всё через обычный порт чаще всего это usb.

Но тут тоже не всё просто , конечно понятно что загрузка будет с помощью averdude, но с параметрами всё очень как не просто!

На просторах наших ардииноманов вариантов хватает, да и сам лил дудкой неоднократно, аднако факт остаётся фактом советы не помогли , дудка файл не лила. В основном ошибка связи с программатором.

Связался даже с разрабом того злосчастного кода который пытался залить, он написал что из под линукса всё льётся отлично.

 

Нарыл наконец таки 2 програмули которые всётаки осилили данную задачу.

Xloader и ArduinoUploader

http://xloader.russemotto.com/   сайт программки и ссылка на скачивание http://xloader.russemotto.com/XLoader.zip

http://www.ngcoders.com/downloads/arduino-hex-uploader-and-programmer/ ссылка на скачивание http://www.ngcoders.com/?dl_id=13

Xloader сработал сразу без лишних танцев.

ArduinoUploder пришлось в параметрах дудки ручками дописывать скорость и прписывать свой камень так как список там совсем небольшой, а avr.conf стандартный.

Вот как то так.

 

Клапауций
Offline
Зарегистрирован: 10.02.2013

icms пишет:

ФУУУУУУх

начнём сначала.

Можно было бы промолчать, если бы не услышал много странного от топиктартера.

icms пишет:

1. avrdude  -e не вытирает память а только убирает указатели, как на компе стёрли название файла значит его нет а он на месте, а мегах таже фигня, вероятно экономят циклы записи.

Хитрецы какие - циклы они экономят, стирать не стирает и стёртые программы работают.

icms пишет:

2. Далеко не каждую програмулину можно записать как бут, есть элементарное ораничение размер у меня мега2560 так там 8к я лил 11к. Ко всему прочему арда использует адрес старта лоадера.

Размер секции загрузки настраивается фьюзами BOOTSZ0 и BOOTSZ1 микроконтроллера, старт программы с адреса $0000(без лоадера) или c $F000(с лоадером) настраивается фьюзом BOOTRST.

*программу бесконечного размера невозможно записать нивкуда.(КО)

icms пишет:

3. Для того чтобы в арду HEX файл(не как бутлоадер, а просто как программу)  использовать arduino as isp програматор не не нужно. Т.е. вторая арда не нужна. Льётся всё через обычный порт чаще всего это usb.

[картинко маслом - я и мой друг КО гордо смотрим в резко обрывающийся вниз горизонт светлого будущего...]

Стесняюсь спросить, что за лоадер то в дуину заливался - цель танцев сбубном, если блинк программатором придётся заливать?

icms пишет:

Но тут тоже не всё просто , конечно понятно что загрузка будет с помощью averdude, но с параметрами всё очень как не просто!

На просторах наших ардииноманов вариантов хватает, да и сам лил дудкой неоднократно, аднако факт остаётся фактом советы не помогли , дудка файл не лила. В основном ошибка связи с программатором.

Ну, и хрен с ним, если не помогли... [и не помогут, потому как нед никакого дуино и не было никогда - есть МК, запаянный в отладочную плату!]

Клапауций
Offline
Зарегистрирован: 10.02.2013

Вопрос по Xloader.

Он же использует родной загрузчик дуины - как у вас получается использовать его с загрузчиками отличными от оригинального?

icms
Offline
Зарегистрирован: 22.03.2011

Клапауций ну вы прям уж извините тролите.

Программы затёртые -е не работают, я такого не писал, я писал что они остаются в памяти, можете это легко проверить.

Какой бы bootsz для mega2560 вы не настроили бутлоадер не будет дольше 8к.

а по вашему лоадер это обязательно програ для общения с другими устройствами для прошивки программирования? можно придумать задачу и по забавней.

А вот xloader работает так изначально автор кода предусмотрел совместимость с загрузчиком ардуино.

вы конечно помогли мне своими комментариями , направили мысли в нужное русло(немного), но всё таки этот форум технический и трололо здесь устраивать не нужно

Клапауций
Offline
Зарегистрирован: 10.02.2013

icms пишет:
Клапауций ну вы прям уж извините тролите.

Неправда.

icms пишет:
Программы затёртые -е не работают, я такого не писал, я писал что они остаются в памяти, можете это легко проверить.

Как проверить?

icms пишет:
Какой бы bootsz для mega2560 вы не настроили бутлоадер не будет дольше 8к.

Конечно - написано такое в даташите и по всему инету в виде страданий авторов загрузчиков, что как бы классный загрузчик(мог бы быть), но не влезет...

icms пишет:
а по вашему лоадер это обязательно програ для общения с другими устройствами для прошивки программирования? можно придумать задачу и по забавней.

Не обязательно для прошивки но, если вы не предусмотрели в программе загрузчика событие выхода из загрузчика(обычно это кнопка или таймер), то так и будете сидеть в нём(программе, ограниченной размером загрузочной секции) вечно, остальной кусок флеша вам будет доступен для записи и чтения, но не для загрузки исполняемого кода МК.

icms пишет:
А вот xloader работает так изначально автор кода предусмотрел совместимость с загрузчиком ардуино.

Если вместо загрузчика дуино записана "забавная" программа, то откуда xloader берёт загрузчик дуино?

Можно просто шить МК без загрузчика?

icms пишет:
вы конечно помогли мне своими комментариями , направили мысли в нужное русло(немного), но всё таки этот форум технический и трололо здесь устраивать не нужно

Ну, не знаю - загрузчик вы не прошили, почему дуде ошибки верификации выдаёт - не выяснили, как Arduino IDE умудряется дудкой правильно писать флеш и верифицировать - остаётся загадкой.