Не шьётся левый boot, вопрос знатокам AVR
- Войдите на сайт для отправки комментариев
История такая. потребовалось мне залить в мегу чужую програмку , компилировал в 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 всё мигает, работает.
Мега живая родной бутлоадер зашивает и работает.
Как так, понимаю что вопрос сложный , но может кто сталкивался.
Вопрос не сложный, если вы ставите перед собой задачу проверить шьётся МК или нет - дуде вам в консоли говорит, что произошло: прошилось/не прошилось, верифицировалось или нед...
Понимаю много текста , но я написал, указал что камень(mega 2560) зашивается успешно, со стороны дюды нет ошибок, но не работает заведомо рабочий код который работает на других процессорах(mega168)
Погодте. А вы 168 и 2560 шьете одной и той же прошивкой? Один и тот же .hex заливаете в разные камни?
Да нет я на этих прошивка уже табун лошадей съел(произвожу для работы контроллеры на базе ардуино, сам платы делаю сам паяю , сам шью)
конечно прошивки разные вернее makefile разные и так по мелочам.
Если есть у ког проверенный hex с makefile для mega2560 так чтобы в порт чё слал имигал. Может я действительно чего то не учитываю, хотя получается в 2 прогах ошибаюсь, странно.
может что makefile& вот он (немного укороченный, мусор немного выкинул)
001
MCU = atmega2560
002
003
004
F_OSC = 16000000
005
006
007
FORMAT = ihex
008
009
010
TARGET = main
011
012
013
014
SRC = test.c
015
016
ASRC =
017
018
OPT = s
019
020
DEBUG = dwarf-2
021
022
EXTRAINCDIRS =
023
024
CSTANDARD = -std=gnu99
025
026
CDEFS =
027
028
CINCS =
029
030
031
CFLAGS = -g$(DEBUG)
032
CFLAGS += $(CDEFS) $(CINCS)
033
CFLAGS += -O$(OPT)
034
CFLAGS += -funsigned-
char
-funsigned-bitfields -fpack-
struct
-fshort-enums
035
CFLAGS += -Wall -Wstrict-prototypes
036
CFLAGS += -Wa,-adhlns=$(<:.c=.lst)
037
CFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS))
038
CFLAGS += $(CSTANDARD)
039
CFLAGS += -DF_OSC=$(F_OSC)
040
041
042
ASFLAGS = -Wa,-adhlns=$(<:.S=.lst),-gstabs
043
ASFLAGS += -DF_OSC=$(F_OSC)
044
045
PRINTF_LIB_MIN = -Wl,-u,
vfprintf
-lprintf_min
046
047
048
PRINTF_LIB_FLOAT = -Wl,-u,
vfprintf
-lprintf_flt
049
050
PRINTF_LIB =
051
052
053
SCANF_LIB_MIN = -Wl,-u,vfscanf -lscanf_min
054
055
SCANF_LIB_FLOAT = -Wl,-u,vfscanf -lscanf_flt
056
057
SCANF_LIB =
058
059
MATH_LIB = -lm
060
061
062
EXTMEMOPTS =
063
064
065
LDFLAGS = -Wl,-Map=$(TARGET).map,--cref
066
LDFLAGS += $(EXTMEMOPTS)
067
LDFLAGS += $(PRINTF_LIB) $(SCANF_LIB) $(MATH_LIB)
068
069
070
AVRDUDE_PROGRAMMER = stk500v1
071
072
AVRDUDE_PORT = com6 # programmer connected to serial device
073
074
AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex
075
#
076
AVRDUDE_FLAGS = -p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER)
077
AVRDUDE_FLAGS += $(AVRDUDE_NO_VERIFY)
078
AVRDUDE_FLAGS += $(AVRDUDE_VERBOSE)
079
AVRDUDE_FLAGS += $(AVRDUDE_ERASE_COUNTER)
080
081
082
083
# ---------------------------------------------------------------------------
084
085
# Define directories, if needed.
086
DIRAVR = c:/winavr
087
DIRAVRBIN = $(DIRAVR)/bin
088
DIRAVRUTILS = $(DIRAVR)/utils/bin
089
DIRINC = .
090
DIRLIB = $(DIRAVR)/avr/lib
091
092
093
# Define programs and commands.
094
SHELL = sh
095
CC = avr-gcc
096
OBJCOPY = avr-objcopy
097
OBJDUMP = avr-objdump
098
SIZE = avr-size
099
NM = avr-nm
100
AVRDUDE = avrdude
101
REMOVE = rm -f
102
COPY = cp
103
104
105
106
107
# Define Messages
108
# English
109
MSG_ERRORS_NONE = Errors: none
110
MSG_BEGIN = -------- begin --------
111
MSG_END = -------- end --------
112
MSG_SIZE_BEFORE = Size before:
113
MSG_SIZE_AFTER = Size after:
114
MSG_COFF = Converting to AVR COFF:
115
MSG_EXTENDED_COFF = Converting to AVR Extended COFF:
116
MSG_FLASH = Creating load file
for
Flash:
117
MSG_EEPROM = Creating load file
for
EEPROM:
118
MSG_EXTENDED_LISTING = Creating Extended Listing:
119
MSG_SYMBOL_TABLE = Creating Symbol Table:
120
MSG_LINKING = Linking:
121
MSG_COMPILING = Compiling:
122
MSG_ASSEMBLING = Assembling:
123
MSG_CLEANING = Cleaning project:
124
125
126
127
128
# Define all object files.
129
OBJ = $(SRC:.c=.o) $(ASRC:.S=.o)
130
131
# Define all listing files.
132
LST = $(ASRC:.S=.lst) $(SRC:.c=.lst)
133
134
135
# Compiler flags to generate dependency files.
136
### GENDEPFLAGS = -Wp,-M,-MP,-MT,$(*F).o,-MF,.dep/$(@F).d
137
GENDEPFLAGS = -MD -MP -MF .dep/$(@F).d
138
139
# Combine all necessary flags and optional flags.
140
# Add target processor to flags.
141
ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS) $(GENDEPFLAGS)
142
ALL_ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS)
143
144
145
146
147
148
# Default target.
149
all: begin gccversion sizebefore build sizeafter finished end
150
151
build: elf hex eep lss sym
152
153
elf: $(TARGET).elf
154
hex: $(TARGET).hex
155
eep: $(TARGET).eep
156
lss: $(TARGET).lss
157
sym: $(TARGET).sym
158
159
160
161
# Eye candy.
162
# AVR Studio 3.x does not check make's exit code but relies on
163
# the following magic strings to be generated by the compile job.
164
165
begin:
166
@echo
167
@echo $(MSG_BEGIN)
168
169
finished:
170
@echo $(MSG_ERRORS_NONE)
171
172
end:
173
@echo $(MSG_END)
174
@echo
175
176
177
# Display size of file.
178
HEXSIZE = $(SIZE) --target=$(FORMAT) $(TARGET).hex
179
ELFSIZE = $(SIZE) -A $(TARGET).elf
180
HUMANSIZE = $(SIZE) --mcu=$(MCU) -C $(TARGET).elf
181
182
sizebefore:
183
@
if
[ -f $(TARGET).elf ]; then echo; echo $(MSG_SIZE_BEFORE); $(ELFSIZE); echo; fi
184
185
sizeafter:
186
@
if
[ -f $(TARGET).elf ]; then echo; echo $(MSG_SIZE_AFTER); $(HUMANSIZE); echo; fi
187
188
# Display compiler version information.
189
gccversion :
190
@$(CC) --version
191
192
193
194
# Program the device.
195
program: $(TARGET).hex $(TARGET).eep
196
$(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) $(AVRDUDE_WRITE_EEPROM)
197
198
199
200
201
# Convert ELF to COFF for use in debugging / simulating in AVR Studio or VMLAB.
202
COFFCONVERT=$(OBJCOPY) --debugging \
203
--change-section-address .data-0x800000 \
204
--change-section-address .bss-0x800000 \
205
--change-section-address .noinit-0x800000 \
206
--change-section-address .eeprom-0x810000
207
208
209
coff: $(TARGET).elf
210
@echo
211
@echo $(MSG_COFF) $(TARGET).cof
212
$(COFFCONVERT) -O coff-avr $< $(TARGET).cof
213
214
215
extcoff: $(TARGET).elf
216
@echo
217
@echo $(MSG_EXTENDED_COFF) $(TARGET).cof
218
$(COFFCONVERT) -O coff-ext-avr $< $(TARGET).cof
219
220
221
222
# Create final output files (.hex, .eep) from ELF output file.
223
%.hex: %.elf
224
@echo
225
@echo $(MSG_FLASH) $@
226
$(OBJCOPY) -O $(FORMAT) -R .eeprom $< $@
227
228
%.eep: %.elf
229
@echo
230
@echo $(MSG_EEPROM) $@
231
-$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom=
"alloc,load"
\
232
--change-section-lma .eeprom=0 -O $(FORMAT) $< $@
233
234
# Create extended listing file from ELF output file.
235
%.lss: %.elf
236
@echo
237
@echo $(MSG_EXTENDED_LISTING) $@
238
$(OBJDUMP) -h -S $< > $@
239
240
# Create a symbol table from ELF output file.
241
%.sym: %.elf
242
@echo
243
@echo $(MSG_SYMBOL_TABLE) $@
244
$(NM) -n $< > $@
245
246
247
248
# Link: create ELF output file from object files.
249
.SECONDARY : $(TARGET).elf
250
.PRECIOUS : $(OBJ)
251
%.elf: $(OBJ)
252
@echo
253
@echo $(MSG_LINKING) $@
254
$(CC) $(ALL_CFLAGS) $(OBJ) --output $@ $(LDFLAGS)
255
256
257
# Compile: create object files from C source files.
258
%.o : %.c
259
@echo
260
@echo $(MSG_COMPILING) $<
261
$(CC) -c $(ALL_CFLAGS) $< -o $@
262
263
264
# Compile: create assembler files from C source files.
265
%.s : %.c
266
$(CC) -S $(ALL_CFLAGS) $< -o $@
267
268
269
# Assemble: create object files from assembler source files.
270
%.o : %.S
271
@echo
272
@echo $(MSG_ASSEMBLING) $<
273
$(CC) -c $(ALL_ASFLAGS) $< -o $@
274
275
276
277
# Target: clean project.
278
clean: begin clean_list finished end
279
280
clean_list :
281
@echo
282
@echo $(MSG_CLEANING)
283
$(REMOVE) $(TARGET).hex
284
$(REMOVE) $(TARGET).eep
285
$(REMOVE) $(TARGET).obj
286
$(REMOVE) $(TARGET).cof
287
$(REMOVE) $(TARGET).elf
288
$(REMOVE) $(TARGET).map
289
$(REMOVE) $(TARGET).obj
290
$(REMOVE) $(TARGET).a90
291
$(REMOVE) $(TARGET).sym
292
$(REMOVE) $(TARGET).lnk
293
$(REMOVE) $(TARGET).lss
294
$(REMOVE) $(OBJ)
295
$(REMOVE) $(LST)
296
$(REMOVE) $(SRC:.c=.s)
297
$(REMOVE) $(SRC:.c=.d)
298
$(REMOVE) .dep/*
299
300
301
302
# Include the dependency files.
303
-include $(shell mkdir .dep 2>/dev/null) $(wildcard .dep/*)
304
305
306
# Listing of phony targets.
307
.PHONY : all begin finish end sizebefore sizeafter gccversion \
308
build elf hex eep lss sym coff extcoff \
309
clean clean_list program
Решил проверить фьюзы, вот что выдаёт.
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.
Складывается такое впечатление что не туда по адресу шьёт, не в начало, потом идёт наложение и сбой.
1
avrdude.exe: verifying ...
2
avrdude.exe: verification error, first mismatch at
byte
0x0000
3
0xff != 0xfd
4
avrdude.exe: verification error; content mismatch
Было у меня подобное при попытке верификации залоченного МК.
Что нужно сделать:
На данный момент наверное 90% уверенность что всё дело в родном бутлоадере и втом что для прошивки я использую арду как isp программатор с stk500v1. Идея таже, родной бутлодер в связке с програмтором -мешает прошивке, шьёт не туда.
Считал всё содержимое памяти 2560, как и прдпологал аруевский бут на месте в конце памяти, моя прога в начале. В общем там полная каша. Пытался почистить дудкой -е результат удивил всё осталось на своих местах.
Есть какой вариант почистить всё под ноль? заодно чтобы и фьюзы на заводские стали.
меня там беспокоят фьюзы , добраться к ним из дудки почемуто не получилось
BOOTSZ1 2
BOOTSZ0 1
BOOTRST
Единственный: avrdude -p ATtiny2313 -c stk500v2 -e
локи снимутся, фьюзы настроек платы дуино останутся - зачем их сбрасывать?
ФУУУУУУх
начнём сначала.
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 стандартный.
Вот как то так.
ФУУУУУУх
начнём сначала.
Можно было бы промолчать, если бы не услышал много странного от топиктартера.
1. avrdude -e не вытирает память а только убирает указатели, как на компе стёрли название файла значит его нет а он на месте, а мегах таже фигня, вероятно экономят циклы записи.
Хитрецы какие - циклы они экономят, стирать не стирает и стёртые программы работают.
2. Далеко не каждую програмулину можно записать как бут, есть элементарное ораничение размер у меня мега2560 так там 8к я лил 11к. Ко всему прочему арда использует адрес старта лоадера.
Размер секции загрузки настраивается фьюзами BOOTSZ0 и BOOTSZ1 микроконтроллера, старт программы с адреса $0000(без лоадера) или c $F000(с лоадером) настраивается фьюзом BOOTRST.
*программу бесконечного размера невозможно записать нивкуда.(КО)
3. Для того чтобы в арду HEX файл(не как бутлоадер, а просто как программу) использовать arduino as isp програматор не не нужно. Т.е. вторая арда не нужна. Льётся всё через обычный порт чаще всего это usb.
[картинко маслом - я и мой друг КО гордо смотрим в резко обрывающийся вниз горизонт светлого будущего...]
Стесняюсь спросить, что за лоадер то в дуину заливался - цель танцев сбубном, если блинк программатором придётся заливать?
Но тут тоже не всё просто , конечно понятно что загрузка будет с помощью averdude, но с параметрами всё очень как не просто!
На просторах наших ардииноманов вариантов хватает, да и сам лил дудкой неоднократно, аднако факт остаётся фактом советы не помогли , дудка файл не лила. В основном ошибка связи с программатором.
Ну, и хрен с ним, если не помогли... [и не помогут, потому как нед никакого дуино и не было никогда - есть МК, запаянный в отладочную плату!]
Вопрос по Xloader.
Он же использует родной загрузчик дуины - как у вас получается использовать его с загрузчиками отличными от оригинального?
Клапауций ну вы прям уж извините тролите.
Программы затёртые -е не работают, я такого не писал, я писал что они остаются в памяти, можете это легко проверить.
Какой бы bootsz для mega2560 вы не настроили бутлоадер не будет дольше 8к.
а по вашему лоадер это обязательно програ для общения с другими устройствами для прошивки программирования? можно придумать задачу и по забавней.
А вот xloader работает так изначально автор кода предусмотрел совместимость с загрузчиком ардуино.
вы конечно помогли мне своими комментариями , направили мысли в нужное русло(немного), но всё таки этот форум технический и трололо здесь устраивать не нужно
Неправда.
Как проверить?
Конечно - написано такое в даташите и по всему инету в виде страданий авторов загрузчиков, что как бы классный загрузчик(мог бы быть), но не влезет...
Не обязательно для прошивки но, если вы не предусмотрели в программе загрузчика событие выхода из загрузчика(обычно это кнопка или таймер), то так и будете сидеть в нём(программе, ограниченной размером загрузочной секции) вечно, остальной кусок флеша вам будет доступен для записи и чтения, но не для загрузки исполняемого кода МК.
Если вместо загрузчика дуино записана "забавная" программа, то откуда xloader берёт загрузчик дуино?
Можно просто шить МК без загрузчика?
Ну, не знаю - загрузчик вы не прошили, почему дуде ошибки верификации выдаёт - не выяснили, как Arduino IDE умудряется дудкой правильно писать флеш и верифицировать - остаётся загадкой.