Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Слетает flash
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Step_ARM
Доброго дня всем...
Камень mega32. Загрузка ПО через бутлоадер. Все нормально работает. Но... если создавать помехи быстрым включением и выключением изделия может слетать флэш. Это выглядет примерно так-- изделие либо полностью не рабочее , либо не работает подсветка или индикатор или любая другая часть функций. При этом если прочитать флэш через програматор, то часть оказывается не такой как исходный файл. Причем в разных случаях разная степень подпорченности.
Питание -- стабилизатор 5 В с обвязкой.
Сектор бутлоадера 512 слов. Бут закрыт от записи чтения. Программный сектор не закрыт.
Никто не сталкивался с подобным явлением?
Rst7
Включите BOD. Это раз. Во вторых - было бы правильно проверить в бутлоадере CRC основной программы, а не запускать наобум.
GDI
Портится если в процессе программирования питание дергать или просто при работе?
Step_ARM
Цитата(GDI @ Aug 7 2008, 16:11) *
Портится если в процессе программирования питание дергать или просто при работе?

В работе.

Цитата(Rst7 @ Aug 7 2008, 15:35) *
Включите BOD. Это раз. Во вторых - было бы правильно проверить в бутлоадере CRC основной программы, а не запускать наобум.

BOD ставил 2.7В и 4В -- никак не повлияло.
CRC загрузчик проверяет. Еще - если после загрузки через Bootloader прочитать программный сектор, то совпадает с исходником полностью.
Rst7
Попробуйте залить основной код программатором. При этом вместо бутлоадера пусть будут 0xFF. Затем попробуйте пощелкать питание. По результатам будем думать дальше.
GDI
Цитата
В работе.

Тогда ищите источник помехи, который может вам флешь сбивать. Тут была ветка автором которой был некий Дон Амброзио, вот он поднимал подобный вопрос. И там даже следи множества буков, вроде , были какие то рецепты.
Step_ARM
Цитата(Rst7 @ Aug 7 2008, 16:34) *
Попробуйте залить основной код программатором. При этом вместо бутлоадера пусть будут 0xFF. Затем попробуйте пощелкать питание. По результатам будем думать дальше.

Дело в том , что я это уже делал. Действительно я не добился выхода из строя при прошивке через SPI. Но системы никакой не отслеживается. Флэш слетает не всегда. Может слететь , а может и нет. Изначально все изделия прошивались на параллельном программаторе. Примрно 20 % из них вышли из строя. После перешивки через bootloader они опять работали... Но могли через некоторое время слететь.
Aleksandr Baranov
И что, если обычным программатором запрограммировть, при аналогичных экспериментах флэш не портится?
Вы на одном процессоре ставили опыты или перебрали несколько?
EmbedElektrik
у меня такое тоже было, но питание нарастало медленно, убрал электролиты вроде работает, тьфу-тьфу
Rst7
Цитата
Дело в том , что я это уже делал


Понятно. Схему с номиналами в студию. И разводку.

Цитата
у меня такое тоже было, но питание нарастало медленно


Если BOD включен, то должно быть пофиг. Автору топика: проверьте еще раз, точно ли включен BOD у Вас.
Flasher
Схема питается от импульсного источника питания?
defunct
Цитата(GDI @ Aug 7 2008, 15:37) *
Тут была ветка автором которой был некий Дон Амброзио, вот он поднимал подобный вопрос.

там все же больше насчет магического кода который сам способен отдетектить свою правильность smile.gif

Причина слетов здесь - отсутствие или неправильная работа супервизора.
Не верится, что BOD у автора включен.

Цитата
Но системы никакой не отслеживается. Флэш слетает не всегда. Может слететь , а может и нет.

Причина - кривая разводка, отстутствие блокировочных емкостей по питанию, кривой DC/DC, кривой супервизор питания. Других причин здесь нет.

Workaround - поставить delay несколько десятков/сотен ms перед выполнением команды SPM (это по крайней мере вдвое снизит вероятность появления проблемы. При сбое на отключении питания SPM просто не успеет выполниться).
SasaVitebsk
1) Какая у вас частота процессора.
2) Какое напряжение.
3) Что подводится на ножки SPI (Програмирования)

Сделай задержку в 0.5 секунды при старте программы и лоадера.
Step_ARM
Цитата(Aleksandr Baranov @ Aug 7 2008, 16:46) *
И что, если обычным программатором запрограммировть, при аналогичных экспериментах флэш не портится?
Вы на одном процессоре ставили опыты или перебрали несколько?

На 4-х с камнями из разных серий...

Цитата(EmbedElektrik @ Aug 7 2008, 16:49) *
у меня такое тоже было, но питание нарастало медленно, убрал электролиты вроде работает, тьфу-тьфу

Я не могу электролиты убрать помехи слишком большие будут...

Цитата(Flasher @ Aug 7 2008, 17:23) *
Схема питается от импульсного источника питания?

Нет. Обычный 7805

Цитата(SasaVitebsk @ Aug 7 2008, 21:13) *
1) Какая у вас частота процессора.
2) Какое напряжение.
3) Что подводится на ножки SPI (Програмирования)

Сделай задержку в 0.5 секунды при старте программы и лоадера.

4МГц

PB5,6,7 -- транзисторы подсветки.
Загрузчик начинает работать на запись только когда связался с компом и получил верные данные для записи страницы... То есть , загрузчик посылает байт запроса, получает три байта в ответ. Если они совпали , то загрузчик посылает подтверждение компу. Дальше команда адрес и сразу 128 байт в буфер с проверкой CRC.
Angelo
Вместо 7805 предлагаю для эксперимента нашу 1156ЕН1 или похожую буржуйку LM2925
Step_ARM
Цитата(defunct @ Aug 7 2008, 19:16) *
Причина слетов здесь - отсутствие или неправильная работа супервизора.
Не верится, что BOD у автора включен.
Причина - кривая разводка, отстутствие блокировочных емкостей по питанию, кривой DC/DC, кривой супервизор питания. Других причин здесь нет.

Возможно и так(я еще раз проверю). Но непонятно как влияет уровень напряжения на записанную флэш? У меня в самой программе SPM не выполняется нигде, а в загрузчике очень много условий для входа в саму загрузку.
Записывается-то нормально, без сбоев.
Разводка действительно очень плотная. И опять вопрос-- каким образом это влияет на целостность флэш? Предположим что где-то жуткие помехи -- изделие просто не будет работать или будет сбоить сама программа. Но тут получается , что прога работает прекрасно пока флэш не побита. Глюки все давно исправлены, да и программа несложная без изысков особых...
rtfcnf
конденсатор КМ-5 0,01 - 0,1 мкФ на ножки питания меги biggrin.gif
VDG
Сотрите всю флеш - и бут и программу или чистый контроллер возьмите. Подергайте питание и считайте флеш. Если и в этом случае будут ошибки в флеше, значит бут не причем, просто кристаллы левые.
defunct
Цитата(Step_ARM @ Aug 7 2008, 22:09) *
Разводка действительно очень плотная. И опять вопрос-- каким образом это влияет на целостность флэш?

Когда уровень напряжения питания падает ниже критической отметки указанной в ДШ, не секрет что МК начинает глючить, первым искажается содержимое RAM. МК надо бы сбросить и держать сброшенным до того как это произойдет. В противном случае, процессор может выполнять блоки вашей программы в совершенно случайном порядке. С достаточно низкой вероятностью (но ее хватает чтобы испортить флеш) процессор выполняет опасную команду SPM с параметром Page Erase. После чего питание падает настолько что процессор отключается, либо наоборот возрастает до нормального уровня и процессор начинает выполнять все правильно с той точки где находится, но одной страницы уже нет.

Кстати, можете убедиться в том, что слетает всегда только одна случайная страница флеш. Для этого прочитайте содержимое флеш после того как программа начнет работать неправильно и сравните с бинарником программы.

Цитата
Загрузчик начинает работать на запись только когда связался с компом и получил верные данные для записи страницы...

Стоит еще добавить "железную" защиту от записи - перемычку, проверяемую непосредственно перед SPM. Я использую перемычку между MISO/MOSI, т.к. всегда есть разъем программирования. Правда без супервизора питания она все одно не поможет, но вероятность слета хоть как-то снизит.
SasaVitebsk
Цитата(Step_ARM @ Aug 7 2008, 21:43) *
Загрузчик начинает работать на запись только когда связался с компом и получил верные данные для записи страницы... То есть , загрузчик посылает байт запроса, получает три байта в ответ. Если они совпали , то загрузчик посылает подтверждение компу. Дальше команда адрес и сразу 128 байт в буфер с проверкой CRC.

smile.gif

Вот тут вы заблуждаетесь. Это как у Дон Амброзио "процессор завис" или "сбоит". smile.gif

Память сама по себе не слетает. Не имеет такой привычки. Это значит, что при каких-то обстоятельствах процессор начинает выполнять некоректные действия и, портит ваш флэш.
Ваша задача разобраться почему и при каких обстоятельствах CPU занимается ерундой.

Причин может быть несколько.
Например - ошибка в программе.
Именно поэтому вам говорят про нарастание питания и BOD. То есть при низком питании, если выключен BOD и CPU при этом работает на высокой частоте (U=1.6 FCLK = 4) могут происходить такие финики.

Для проверки работоспособности вашего BOD подайте питание 2.5V и посмотрите порты.

Главное, вы должны понимать, что хомут где то у вас и вы можете и должны его найти.
Step_ARM
Цитата(rtfcnf @ Aug 7 2008, 23:20) *
конденсатор КМ-5 0,01 - 0,1 мкФ на ножки питания меги biggrin.gif

biggrin.gif smile.gif

BOD был отключен при параллельном программировании. Сейчас установил 4 В BODEN 0. В этом ли дело не уверен, но при испытаниях 10 изделий в рабочих условиях (быстрое включение и выключение питания) ни одно изделие не вышло из строя.
Спасибо всем. a14.gif
Rst7
Цитата
В этом ли дело не уверен


Дело именно в этом. И за этим надо строго следить, чтобы не напрошивали фигни на производстве.
ArtemKAD
Цитата
Я не могу электролиты убрать помехи слишком большие будут...

Цитата
Обычный 7805

После 7805 - УБЕРИ!!! Лучше добавь перед стабилизатором. После стабилизатора только керамика обеспечивающая устойчивую работу 7805 (см. ее доку).
demaven
столкнулись с такой проблеммой на меге16, перепробовали все, не помогало, перешли на внешнюю еепром - не помогло 01.gif стали смотреть код и нашли ошибку, исправили - и все стало нормально. на все эти поиски потратили недели две.
ReAl
Цитата(Rst7 @ Aug 8 2008, 13:41) *
Дело именно в этом. И за этим надо строго следить, чтобы не напрошивали фигни на производстве.
В особо параноидальных случаях - вплоть до того, что на старте программы проверять значение fuses и в случае чего стопорить работу с какой-то явной индикацией неработоспособности.
Petka
Цитата(ReAl @ Aug 9 2008, 09:39) *
В особо параноидальных случаях - вплоть до того, что на старте программы проверять значение fuses и в случае чего стопорить работу с какой-то явной индикацией неработоспособности.

Это как? Что-то не припомню что фузы программно доступны.... 07.gif
Flasher
так в схему встроить автономный программатор, чтоб верификацию делал и заливал новую прошивку, если что
Step_ARM
Цитата(demaven @ Aug 9 2008, 08:08) *
столкнулись с такой проблеммой на меге16, перепробовали все, не помогало, перешли на внешнюю еепром - не помогло 01.gif стали смотреть код и нашли ошибку, исправили - и все стало нормально. на все эти поиски потратили недели две.

А при чем здесь EEPROM?
Petka
Цитата(Flasher @ Aug 9 2008, 11:43) *
так в схему встроить автономный программатор, чтоб верификацию делал и заливал новую прошивку, если что

а кто будет контролировать "автономный программатор"? ИМХО, это ещё одна деталь снижающая надёжность.
Всё же интересно, что же имел ввиду ReAl?
sKWO
Цитата(Petka @ Aug 9 2008, 10:38) *
Это как? Что-то не припомню что фузы программно доступны.... 07.gif

Поиск по форуму
Цитата
It is possible to read both the Fuse and Lock bits from software. To read the Lock bits,
load the Z-pointer with 0x0001 and set the RFLB and SELFPRGEN bits in SPMCSR.
When an LPM instruction is executed within three CPU cycles after the RFLB and
SELFPRGEN bits are set in SPMCSR, the value of the Lock bits will be loaded in the
destination register.

В иаре для меги так
Код
#include <inavr.h>

#define _GET_LOCK_BITS() __AddrToZByteToSPMCR_LPM( (void __flash *) 0x0001, 0x09 )
#define _GET_LOW_FUSES() __AddrToZByteToSPMCR_LPM( (void __flash *) 0x0000, 0x09 )
#define _GET_HIGH_FUSES() __AddrToZByteToSPMCR_LPM( (void __flash *) 0x0003, 0x09 )
#define _GET_EXTENDED_FUSES() __AddrToZByteToSPMCR_LPM( (void __flash *) 0x0002, 0x09 )
#define _SET_LOCK_BITS(data) __DataToR0ByteToSPMCR_SPM( data, 0x09 )
#define _ENABLE_RWW_SECTION() __DataToR0ByteToSPMCR_SPM( 0x00, 0x11 )

#define _WAIT_FOR_SPM() while( SPMCR_REG & (1<<SPMEN) );

// Read lock bits.
_WAIT_FOR_SPM();
sendchar( _GET_LOCK_BITS() );

// Read fuse bits.
_WAIT_FOR_SPM();
sendchar( _GET_LOW_FUSES() );

// Read high fuse bits.
_WAIT_FOR_SPM();
sendchar( _GET_HIGH_FUSES() );

// Read extended fuse bits.
_WAIT_FOR_SPM();
sendchar( _GET_EXTENDED_FUSES() );
Petka
Цитата(sKWO @ Aug 9 2008, 13:53) *
Поиск по форуму
....

Спасибо. Не знал. laughing.gif
ReAl
Цитата(sKWO @ Aug 9 2008, 12:53) *
Поиск по форуму
Именно так. Только не по форуму, а по родной документации от атмел :-)
Кажется, у всех, у кого есть SPM - при помощи LPM можно прочесть fuses.
У тини13 точно можно :-)
sKWO
Цитата(ReAl @ Aug 9 2008, 13:28) *
У тини13 точно можно :-)

Всё правильно. Я привёл вырезку из стандартной документации от Атмел на ATtiny13 стр.100 ДШ doc2535.pdf. Автор Xorval для даной тиньки читал содержимое фусов таким образом:
Код
char fuses_low_byte, fuses_high_byte;
SPMCSR=9;
fuses_low_byte=*((char __flash *)0); // Read fuses low byte
SPMCSR=9;
fuses_high_byte=*((char __flash *)3); // Read fuses high byte
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.