Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Mega8 + ASM + Bootloader = не изменяется память
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > MCS51, AVR, PIC, STM8, 8bit
QuickWitted
Здравствуйте.

Сам вопрос:
(пред история ниже)

У меня не работает ни стирание, ни запись.
Они проходят, но не дают результата.

бутлоадер у меня весит с
Код
.cseg
.org    THIRDBOOTSTART ;($0E00) third boot block size is 1K

фусе биты в лошади я выставил так
Код
WRITE-FUSE 0x3500
WRITE-LOCK 0x00

Эта часть работает. Т.е. управление приходит в бут блок
далее проверяется флаг необходимости обновления и при его наличии
стираем память программ, после дергаем прошивку из AT24C128 и пишем
в память программ, по завершению снимаем флаг.

Функции стирания и записи проходят но не изменяют память программ.
Привожу код BootEraseAllPages = Стирание кристалла = всех страниц
кроме бутлоадера.

Код из ком-портового бутлоадера, я его не оптимизировал - оставил практически как был

Код
BootEraseAllPages:
    clr    ZL                ; Set low byte of address
    clr    ZH                ; Set high byte of address
    ldi    temp2, 0x70            ; всего страниц
BootEraseAllPags1:
    rcall    BootErasePage            ; Стирание страницы
    dec    temp2                ; Счётчик страниц
    brne    BootEraseAllPags1
    ret

BootErasePage:
; Выбор режима работы SPM команды
    ldi    temp1, (1<<PGERS)|(1<<SPMEN)    ; стереть страницу = установить PGERS и SPMEN в SPMCR
    out    SPMCR, temp1            ; и выполнить команду SPM.
    spm; При SPM функции бит SPMEN должен быть установлен не ранее, чем за четыре цикла до SPM.
    rcall    BootOpCompl            ; Завершили ли операцию (использует temp1)
    rcall    BootAdrNext            ; След адрес (использует temp1)
    ret

BootOpCompl:
    in    temp1,SPMCR            ; Set SPMCR for erasing
    sbrc    temp1,SPMEN            ; SPMEN - Store Program Memory Enable
    rjmp    BootOpCompl            ; Erasing complete ?
    ret

BootAdrNext:
    ldi    temp1, 0b01000000        ; Установим следующий адресс
    add    ZL, temp1
    clr    temp1
    adc    ZH, temp1    
    ret

Пред история:

Так исторически сложилось, что мои не коммерческие USB IR проекты настраиваются
изменением патчером прошивки. Для меня это был самый простой способ настройки
так как если пользователь повторил один раз проект, то он вполне может его сам
и перепрошить. К тому же для совместимости с разными ОС пришлось урезать HID
дескриптор до минимума (на винде все окей, на линуксах были проблемы, клаво-мышку
он понимает, но ещё и интерфейс программатора - уже нет), то есть не все мои
прошивки имеют обратную связь.

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

В одной из HID веток = Джойстике с обратной связью (Feed Back), со временем
возникла необходимость во внешней I2C памяти и у прошивки был штатный интерфейс
обратной связи (который не глючил ни в одной из ОС). Поэтому появилось решение
поставить более ёмкую I2C память = AT24C128 (вместо 24с04) и обновлять прошивки
через неё.

Разнотипные готовые ХИД бутлоадеры подходят мало, так как проект с трудом вмещается
в Мега8, а всё свободное место отведено под кнопки, поэтому изыскать лишних 2кб не
представляется возможным.

Поэтому было решено загнать в бутлоадер часть I2C кода и несколько функций заливки
кристалла, что существенно экономит место на кристалле (нет необходимости городить
интерфейс получения прошивки из вне)...
QuickWitted
Всем спасибо smile3046.gif
Этот вопрос снят – проблема была в используемом экземпляре процессора.
Поменял кристалл – заработало.

Но теперь появился второй вопрос
А возможен ли бутлоадер для бутлоадера?

Т.е. возможна ли через бутлоадер загрузить код, который обновит сам бутлоадер?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.