Прошил без ошибок контроллер ATmega328p - до этого раза он прошивался нормально. Всё отлично работало. Считывалось. В этот раз прошил - программа на контроллере работает, но не считывается. Во время проверки сигнатуры считывается 00 01 02. Если отключить проверку сигнатуры - значения считанных байт представляют собой счётчик.
Программатор AVR ISP. Прорамма - avrdude. Компилятор AVR Studio. Фьюзы не трогал. Проверил плату под лупой - никаких лишних предметов не обнаружил.
Купил вторую ATmega328p. Прошил той же прошивкой. И та же песня. Попробовал сделать следующее - отпаял RESET от разъёма программатора и припаял к земле. Теперь проявился такой эффект - когда включаю программатор - микросхема даёт один раз себя прочитать. Читает правильно. На второй попытке выдаёт 00 01 02. Схема запитывается от программатора. Если его выключить и включить (т. е. временно обесточить всё это дело), то контроллер снова даёт сделать одну операцию чтения.
SPCR = 0b01010000; // регистр настройки // ^ включить прерывания SPI // ^ включить SPI // ^ порядок бит: 1 - старший бит идёт первым, 0 - младший бит идёт первым // ^ master/slave (ведущий/ведомый) // ^ CPOL - полярность SCK (режим SPI, версия) - надо 0 // ^ CPHA - фаза SCK, надо 0 // ^^ младшая часть делителя скорости - надо 00 SPSR = 0b00000001; // регистр состояния // ^ - старшая часть делителя скорости - надо 1 - это 0,5 часть основной частоты // ^ флаг прерывания SPIF // ^ флаг возникновения коллизии
Во время проверки сигнатуры считывается 00 01 02. Если отключить проверку сигнатуры - значения считанных байт представляют собой счётчик.
Заблокировали МК. Сотри всё в МК (ключик -e для avrdude).
_________________ Когда уже ничего не помогает - прочтите, наконец, инструкцию. Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII) Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Установил, что вышеописанные проблемы происходят от выключения предделителя:
Код:
CLKPR = 0x80; // 1 << 7; CLKPR = 0;
Что я сделал: сократил код до мигания светодиодом. Потом построчно стал добавлять. Весь код добавил без проблем - контроллер прошивался и читался как и должен. Добавив эти две строки - я получил контроллер с рабочей прошивкой, но при попытке что-то прочитать или записать - ошибку.
Далее попытался очистить, но уже отказавшись от этого:
Код:
safemode: lfuse changed! Was 0, and is now 62 Would you like this fuse to be changed back? [y / n]
В итоге второй контроллер перестал отвечать. Похоже снова пора в магазин.
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
Удалось "вернуть" одну Атмегу. Что я сделал: 1) Подключил внешний генератор 6МГц к ноге XTAL1. XTAL2 - к земле. Т. е. по обычной схеме тактирования от внешнего источника. 2) Выставил на программаторе скорость SCK = 32кГц. 3) Прочитал прошивку - удачно. Записал прошивку без упомянутых двух строчек - удачно. 4) Убрал внешнее тактирование.
Микросхема работает - точно выполняет программу. Тактируется от внутреннего источника как и раньше. В общем получил обратно рабочую микросхему. Проверил значение фьюзов - значения по умолчанию.
Почему от программной установки предделителя 1 к 1 через регистр CLKPR происходит потеря возможности использовать внутренний генератор?
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
Карма: 20
Рейтинг сообщений: 188
Зарегистрирован: Вс мар 28, 2010 12:52:22 Сообщений: 1368 Откуда: Беларусь
Рейтинг сообщения:0
А у меня есть одна тинька 2313 с испорченной сигнатурой, правда стер ее отключив МК во время программирования. Так вот шьется она из AVRStudio 6 при помощи STK-500, а остальные проги ругаются!
_________________ «Еще я хотел бы, чтобы наши ученые изобрели какой-то новый источник энергии, чтобы мы на коленях не ползали даже перед нашими братьями, умоляя их и выпрашивая тонну нефти или кубометр газа», — рассказал белорусский президент.
Карма: 20
Рейтинг сообщений: 188
Зарегистрирован: Вс мар 28, 2010 12:52:22 Сообщений: 1368 Откуда: Беларусь
Рейтинг сообщения:0
Да Вы же сами сказали - не правильно читается сигнатура, отсюда и "болезнь" - невозможность прошивки, а про лекарство (AVRStudio) Вам уже писали - попробуйте.
_________________ «Еще я хотел бы, чтобы наши ученые изобрели какой-то новый источник энергии, чтобы мы на коленях не ползали даже перед нашими братьями, умоляя их и выпрашивая тонну нефти или кубометр газа», — рассказал белорусский президент.
т. е. avrdude умеет прошивать всё, кроме кода, где встречается команда отключения предделителя? мега48/168 в плане программатора ничем не отличается от 328. А вот софт для программатора бывает разный - стараюсь использовать от фирмы производителя - скорее поэтому не имею вышеуказанных проблем. Например понипрог не может шить меги с буквами PA.
в плане программатора атмеги вообще не отличаются. А вот загрузки, тактирования, фьюзов и пр. - в спецификации видим отдельные таблицы: на 88-ю, на 168-ю, на 328-ю...
dr.doc писал(а):
лекарство (AVRStudio)
какие программаторы поддерживает AVR Studio (вероятно речь о 6-й версии)?
oleg110592 писал(а):
Попробуйте шить программой из аврстудии.
Можно и попробовать - как называется? Как запускать?
Нашёл вот интересную вещь в инструкции на программатор AVRISP mkII:
Цитата:
Обратите внимание, что для микроконтроллеров с конфигурационным битом CKDIV (Clock Divide – деление частоты) и/или с CLKPR (Clock Prescaler Register – регистр предделителя тактовой частоты) частоту ISP необходимо вычислять из частоты, получаемой после делителя. Примечание: При использовании внутреннего RC-генератора убедитесь, что он откалиброван для использования с максимальной частотой ISP. Совет: Если у вас возникли проблемы с подключением к программируемому микроконтроллеру, попробуйте понизить частоту ISP. Пожалуйста, обратитесь к техническому описанию на устройство AVR. Примечание: AVRISP mkII не поддерживает программирование Flash или EEPROM на частоте ниже 2 кГц. Однако полное стирание устройства будет работать вплоть до частоты 51 Гц. Если из-за значения в регистре CLKPR частота микроконтроллера настолько низка (-??!!), что он не программируется, то перед его программированием выполните полное стирание устройства.
Т. е. CLKPR влияет на процесс прошивки. Ад и ахинея - но как??!! Ведь CLKPR взводится в программе, а во время прошивки опущенный ресет не даёт программе выполняться! Или значение в данном регистре сохраняется после выполнения программы? Если речь идёт о значении по умолчанию - то как она может быть "настолько низка"?
Обычно как раз наоборот, питание со схемы идет на программатор для нормальной его работы.
P-CAT писал(а):
Т. е. CLKPR влияет на процесс прошивки. Ад и ахинея - но как??!! Ведь CLKPR взводится в программе, а во время прошивки опущенный ресет не даёт программе выполняться! Или значение в данном регистре сохраняется после выполнения программы?
По идее CLKPR, как и все регистры I/O после ресета сбрасываются на значение по умолчанию, в отличии от содержимого R0-R31 и RAM. Может CLKPR не сбрасывается, это маловероятно, но так можно объяснить возможность прочитать контроллер после полного обесточивания. Сам тоже во всех программах пользуюсь этим регистром, ни разу такого не встречал...
А вот загрузки, тактирования, фьюзов и пр. - в спецификации видим отдельные таблицы Где такие таблицы? В даташите не наблюдаю. Тактирование и фузы одинаковые. Только начиная с 88 есть наличие поддержки бутлоадера. Как запускать? Спойлер
ATmega48/88/168/328 Datasheet Таблицы на: стр. 289 - 291 - про загрузчик стр. 295 - 297 - про фьюзы. стр. 298 - просто про сигнатуры.. это не считаем.
По хорошему не должно быть никакой разницы - это очевидно. Но с другой стороны, судите сами - может подверсия контроллера влиять?
Про как запускать - то что на картинке - такое то я и сам знаю: в AVR Studio 4 - в списке нет моего программатора (USBASP). в AVR Studio 6 - список программаторов вообще пуст - видимо их как-то нужно доустанавливать. Там только один AVR Simulator.
Да и если программатор - то странно это проявляется всё-таки. Ваш код содержит работу с CLKPR в начале или где-то в середине программы? Вы используете "clock_prescale_set" или "напрямую" CLKPR = 0x80; CLKPR = 0; ?
Engineer_Keen писал(а):
питание со схемы идет на программатор
Строго говоря, в моём случае никакой схемы нет - только контроллер подсоединённый к разъёму, к которому в свою очередь припаяны экранированные проводки, другим концом которые подпаяны к подписанным контактам программатора. Результат я проверяю на осцилографе - дрыганьем ног.
Engineer_Keen писал(а):
ни разу такого не встречал...
спасибо за сочувствие. Тот же вопрос: Ваш код содержит работу с CLKPR в начале (в первых строках как у меня или дальше) или где-то в середине программы, например после условия? Вы используете "clock_prescale_set" или "напрямую" CLKPR = 0x80; CLKPR = 0; или свой код на asm-е ?
Тот же вопрос: Ваш код содержит работу с CLKPR в начале (в первых строках как у меня или дальше) или где-то в середине программы, например после условия?
Как правило в начале, одной из первых команд, наряду с загрузкой стека:
Код:
RESET: CLR ZERO OUTI CLKPR,(1<<CLKPCE) OUT CLKPR,ZERO OUTI SPL,low(RAMEND)
P-CAT писал(а):
только контроллер подсоединённый к разъёму, к которому в свою очередь припаяны экранированные проводки, другим концом которые подпаяны к подписанным контактам программатора.
В программаторе стоит перемычка, соединяющая +5Вразъема ISP с источником +5В программатора?
в списке нет моего программатора (USBASP) понятно нет - ранее говорилось: Программатор AVR ISP - он есть. Насчет фузов - не трогаю почти их, только бодлевел ставлю 1.8В иногда (лучше внешний - внутренний жрущий много, да и хреноватый он) . Может ошибаюсь но программа для 48 нормально функционировала на 168 (фузы по умолчанию) - будет возможность еще раз проверю. Давно помню было - в меге48 баловался переключением CLKPR до /256, после чего мега переставала "видеться" программатором самопальным типа AVRISP. Спасал программатор на LPT, чей софт (не помню как обзывался) начинал видно с нижних частот на CLK, эту мегу позволил вернуть к жизни. Еще спасал сим программатором массу авров с неправильно выставленным тактированием - достаточно было прикоснуться пинцетом к ноге XTAL1 (частота наводки 50 гЦ), чего хватало софту.
На тот момент считал, что это тоже что и USBASP - забыл упомянуть об этом, извиняюсь. Фьюзы тоже никогда не трогаю.
Да!! Вот оно:
oleg110592 писал(а):
Давно помню было - в меге48 баловался переключением CLKPR до /256, после чего мега переставала "видеться" программатором самопальным типа AVRISP. Спасал программатор на LPT, чей софт (не помню как обзывался) начинал видно с нижних частот на CLK, эту мегу позволил вернуть к жизни. Еще спасал сим программатором массу авров с неправильно выставленным тактированием - достаточно было прикоснуться пинцетом к ноге XTAL1 (частота наводки 50 гЦ), чего хватало софту.
Совпадает. Одну мегу (первую) я стирая - неосторожно согласившись с вопросом avrdude - стер значения фьюзов, поэтому с ней покончено надолго. А вот фьюзы второй меги остались нетронуты. И поэтому её удалось "вернуть к жизни".
В сухом остатке получается: если после заливки прошивки с изменением значения CLKPR, мега перестаёт видеться, то достаточно или стереть её или залить прошивку без изменения значения регистра CLKPR, используя внешнее тактирование микросхемы (в Вашем случае 50Гц, я тактировал 6МГц) и использования пониженной частоты SCK (в моём случае это было 32кГц, при использовании более высокой частоты - она не виделась, я проверял).
Отлично! Уже нашли решение - как приводить мегу в это состояние и возвращать обратно.
я так понимаю - после сброса мы сразу переключаем CLKPR и программатор не успевает достучаться до микроконтроллера, если поставить задержку перед переключением CLKPR (например 100 мС), то должен успеть.
Сейчас этот форум просматривают: Varlakotam и гости: 44
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения