ATmega - сигнатура 00 01 02

Обсуждаем контроллеры компании Atmel.
Ответить
Родился
Аватара пользователя
Сообщения: 18
Зарегистрирован: Пн янв 28, 2013 16:14:09

Сообщение P-CAT »

Никто не сталкивался? Или может знает что такое?

Прошил без ошибок контроллер ATmega328p - до этого раза он прошивался нормально. Всё отлично работало. Считывалось. В этот раз прошил - программа на контроллере работает, но не считывается. Во время проверки сигнатуры считывается 00 01 02. Если отключить проверку сигнатуры - значения считанных байт представляют собой счётчик.

Программатор AVR ISP. Прорамма - avrdude. Компилятор AVR Studio.
Фьюзы не трогал. Проверил плату под лупой - никаких лишних предметов не обнаружил.

Купил вторую ATmega328p. Прошил той же прошивкой. И та же песня. Попробовал сделать следующее - отпаял RESET от разъёма программатора и припаял к земле. Теперь проявился такой эффект - когда включаю программатор - микросхема даёт один раз себя прочитать. Читает правильно. На второй попытке выдаёт 00 01 02. Схема запитывается от программатора. Если его выключить и включить (т. е. временно обесточить всё это дело), то контроллер снова даёт сделать одну операцию чтения.

Кто знает - что за хрень?

вот код прошивки:

Код: Выделить всё

#include <avr/interrupt.h>

int main()
{
  // выключаю предделитель таймера
  CLKPR = 0x80; // 1 << 7;
  CLKPR = 0;

  // настройка портов
  DDRC = 0b11111111;
  //       -
  //        ^ Reset
  //         ^ CS (SPI)
  //          ^ PC4
  //           ^ PC3
  //            ^ PC2
  //             ^ PC1
  //              ^ ADC0
  //          
  PORTC = 0;

  DDRD = 0xFF;
  PORTD = 0;

  // настройка SPI
  DDRB = 0b11101111;
  //              ^ PB0
  //             ^ PB1
  //            ^ PB2
  //           ^ MOSI
  //          ^ MISO
  //         ^ SCK
  //        ^ PB6
  //       ^ PB7
  PORTB= 0;

  SPCR = 0b01010000; // регистр настройки
  //       ^ включить прерывания SPI
  //        ^ включить SPI
  //         ^ порядок бит: 1 - старший бит идёт первым, 0 - младший бит идёт первым
  //          ^ master/slave (ведущий/ведомый)
  //           ^ CPOL - полярность SCK (режим SPI, версия) - надо 0
  //            ^ CPHA - фаза SCK, надо 0
  //             ^^ младшая часть делителя скорости - надо 00
  SPSR = 0b00000001; // регистр состояния	
  //              ^ - старшая часть делителя скорости - надо 1 - это 0,5 часть основной частоты
  //       ^ флаг прерывания SPIF
  //        ^ флаг возникновения коллизии

  // ШИМ0
  TCCR0A = 0;
  TCCR0B = 0b00000001; // без делителя
  //             ^ толи 1 толи 0 - непонятно

  TCCR0A = 0b01010000;

  OCR0A = 64; // скважность А
  OCR0B = 192; // скважность Б
 
  // главный таймер (10 раз в секунду)
  TCCR1A = 0b00000000;
  TCCR1B = 0b00001100; 
  
  TCCR1C = 0;
  
  OCR1A = 3125; // 10Hz
  OCR1B = 5*3125; // 2Hz

  TIMSK1 = 0b00000110;

  // разрешаю прерывания
  SREG  |= (1 << 7); 
    
  while(1)
  {
  }

}

ISR(TIMER1_COMPA_vect)
{
	PORTD ^= 1;
}

ISR(TIMER1_COMPB_vect)
{
	PORTD ^= 2;
}
Реклама
Мудрый кот
Аватара пользователя
Сообщения: 1810
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

Сообщение Kavka »

P-CAT писал(а):Во время проверки сигнатуры считывается 00 01 02. Если отключить проверку сигнатуры - значения считанных байт представляют собой счётчик.
Заблокировали МК. Сотри всё в МК (ключик -e для avrdude).
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Реклама
Родился
Аватара пользователя
Сообщения: 18
Зарегистрирован: Пн янв 28, 2013 16:14:09

Сообщение P-CAT »

В общем вернул я ресет с земли обратно на разъём программатора.
Далее запускаю:

Код: Выделить всё

avrdude.exe -p m328p -c usbasp -e
пишет что сигнатура не совпадает (прочитал в этот 00 01 01).

Я тогда запускаю:

Код: Выделить всё

avrdude.exe -p m328p -c usbasp -e -F
пишет:

Код: Выделить всё

safemode: lfuse changed! Was 0, and is now 62
Would you like this fuse to be changed back? [y / n]
Я так понял, чтот вопрос в том, чтобы восстановить нормальные значения для фьюза - это же команда очистки? Согласился.

Тот же вопрос про hfuse и efuse.

Код: Выделить всё

and is now rescued.
Fuses OK.
Попробовал что-нибудь прочитать:

Код: Выделить всё

target doesn't answer. 1
initialization failed, rc=-1
... и так далее
Кажись всё.. пора в магазин.
Родился
Аватара пользователя
Сообщения: 18
Зарегистрирован: Пн янв 28, 2013 16:14:09

Сообщение P-CAT »

Установил, что вышеописанные проблемы происходят от выключения предделителя:

Код: Выделить всё

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]
В итоге второй контроллер перестал отвечать.
Похоже снова пора в магазин.
Реклама
Эиком - электронные компоненты и радиодетали
Родился
Аватара пользователя
Сообщения: 18
Зарегистрирован: Пн янв 28, 2013 16:14:09

Сообщение P-CAT »

Удалось "вернуть" одну Атмегу.
Что я сделал:
1) Подключил внешний генератор 6МГц к ноге XTAL1. XTAL2 - к земле. Т. е. по обычной схеме тактирования от внешнего источника.
2) Выставил на программаторе скорость SCK = 32кГц.
3) Прочитал прошивку - удачно. Записал прошивку без упомянутых двух строчек - удачно.
4) Убрал внешнее тактирование.

Микросхема работает - точно выполняет программу. Тактируется от внутреннего источника как и раньше. В общем получил обратно рабочую микросхему. Проверил значение фьюзов - значения по умолчанию.

Почему от программной установки предделителя 1 к 1 через регистр CLKPR происходит потеря возможности использовать внутренний генератор?
Реклама
Это не хвост, это антенна
Аватара пользователя
Сообщения: 1368
Зарегистрирован: Вс мар 28, 2010 12:52:22
Откуда: Беларусь

Сообщение dr.doc »

А у меня есть одна тинька 2313 с испорченной сигнатурой, правда стер ее отключив МК во время программирования. Так вот шьется она из AVRStudio 6 при помощи STK-500, а остальные проги ругаются!
«Еще я хотел бы, чтобы наши ученые изобрели какой-то новый источник энергии, чтобы мы на коленях не ползали даже перед нашими братьями, умоляя их и выпрашивая тонну нефти или кубометр газа», — рассказал белорусский президент.
Реклама
Друг Кота
Аватара пользователя
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Сообщение oleg110592 »

P-CAT писал(а): Почему от программной установки предделителя 1 к 1 через регистр CLKPR происходит потеря возможности использовать внутренний генератор?
Пользую мега48, мега168 и точно так же программно переключаю пределитель - никаких проблем не было. Попробуйте шить программой из аврстудии.
Родился
Аватара пользователя
Сообщения: 18
Зарегистрирован: Пн янв 28, 2013 16:14:09

Сообщение P-CAT »

dr.doc писал(а):при помощи STK-500
Речь о программаторе? В STK-500 есть Serial High-Voltage Programming of AVR devices.
oleg110592 писал(а):Попробуйте шить программой из аврстудии.

- т. е. avrdude умеет прошивать всё, кроме кода, где встречается команда отключения предделителя?
dr.doc писал(а):Пользую мега48, мега168
как попробуете то же в 328-й, дайте знать.
Это не хвост, это антенна
Аватара пользователя
Сообщения: 1368
Зарегистрирован: Вс мар 28, 2010 12:52:22
Откуда: Беларусь

Сообщение dr.doc »

Да Вы же сами сказали - не правильно читается сигнатура, отсюда и "болезнь" - невозможность прошивки, а про лекарство (AVRStudio) Вам уже писали - попробуйте.
«Еще я хотел бы, чтобы наши ученые изобрели какой-то новый источник энергии, чтобы мы на коленях не ползали даже перед нашими братьями, умоляя их и выпрашивая тонну нефти или кубометр газа», — рассказал белорусский президент.
Друг Кота
Аватара пользователя
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Сообщение oleg110592 »

т. е. avrdude умеет прошивать всё, кроме кода, где встречается команда отключения предделителя?
мега48/168 в плане программатора ничем не отличается от 328. А вот софт для программатора бывает разный - стараюсь использовать от фирмы производителя - скорее поэтому не имею вышеуказанных проблем. Например понипрог не может шить меги с буквами PA.
Родился
Аватара пользователя
Сообщения: 18
Зарегистрирован: Пн янв 28, 2013 16:14:09

Сообщение P-CAT »

oleg110592 писал(а):в плане программатора
в плане программатора атмеги вообще не отличаются. А вот загрузки, тактирования, фьюзов и пр. - в спецификации видим отдельные таблицы: на 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 взводится в программе, а во время прошивки опущенный ресет не даёт программе выполняться! Или значение в данном регистре сохраняется после выполнения программы? Если речь идёт о значении по умолчанию - то как она может быть "настолько низка"?
Друг Кота
Аватара пользователя
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Сообщение Engineer_Keen »

P-CAT писал(а):Схема запитывается от программатора.
Обычно как раз наоборот, питание со схемы идет на программатор для нормальной его работы.
P-CAT писал(а):Т. е. CLKPR влияет на процесс прошивки. Ад и ахинея - но как??!! Ведь CLKPR взводится в программе, а во время прошивки опущенный ресет не даёт программе выполняться! Или значение в данном регистре сохраняется после выполнения программы?
По идее CLKPR, как и все регистры I/O после ресета сбрасываются на значение по умолчанию, в отличии от содержимого R0-R31 и RAM. Может CLKPR не сбрасывается, это маловероятно, но так можно объяснить возможность прочитать контроллер после полного обесточивания.
Сам тоже во всех программах пользуюсь этим регистром, ни разу такого не встречал...
Друг Кота
Аватара пользователя
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Сообщение oleg110592 »

А вот загрузки, тактирования, фьюзов и пр. - в спецификации видим отдельные таблицы
Где такие таблицы? В даташите не наблюдаю. Тактирование и фузы одинаковые. Только начиная с 88 есть наличие поддержки бутлоадера.
Как запускать?
СпойлерИзображение
Родился
Аватара пользователя
Сообщения: 18
Зарегистрирован: Пн янв 28, 2013 16:14:09

Сообщение P-CAT »

oleg110592 писал(а):Где такие таблицы?
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-е ?
Друг Кота
Аватара пользователя
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Сообщение Engineer_Keen »

P-CAT писал(а):Тот же вопрос: Ваш код содержит работу с CLKPR в начале (в первых строках как у меня или дальше) или где-то в середине программы, например после условия?
Как правило в начале, одной из первых команд, наряду с загрузкой стека:

Код: Выделить всё

RESET:
	CLR	ZERO			
	OUTI	CLKPR,(1<<CLKPCE)
	OUT	CLKPR,ZERO
	OUTI	SPL,low(RAMEND)		
P-CAT писал(а): только контроллер подсоединённый к разъёму, к которому в свою очередь припаяны экранированные проводки, другим концом которые подпаяны к подписанным контактам программатора.
В программаторе стоит перемычка, соединяющая +5Вразъема ISP с источником +5В программатора?
ISP_PWR.PNG
(4.48 КБ) 504 скачивания
Последний раз редактировалось Engineer_Keen Пн июл 01, 2013 14:50:36, всего редактировалось 1 раз.
Друг Кота
Аватара пользователя
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Сообщение oleg110592 »

в списке нет моего программатора (USBASP)
понятно нет - ранее говорилось: Программатор AVR ISP - он есть.
Насчет фузов - не трогаю почти их, только бодлевел ставлю 1.8В иногда (лучше внешний - внутренний жрущий много, да и хреноватый он) . Может ошибаюсь но программа для 48 нормально функционировала на 168 (фузы по умолчанию) - будет возможность еще раз проверю. Давно помню было - в меге48 баловался переключением CLKPR до /256, после чего мега переставала "видеться" программатором самопальным типа AVRISP. Спасал программатор на LPT, чей софт (не помню как обзывался) начинал видно с нижних частот на CLK, эту мегу позволил вернуть к жизни. Еще спасал сим программатором массу авров с неправильно выставленным тактированием - достаточно было прикоснуться пинцетом к ноге XTAL1 (частота наводки 50 гЦ), чего хватало софту.
Родился
Аватара пользователя
Сообщения: 18
Зарегистрирован: Пн янв 28, 2013 16:14:09

Сообщение P-CAT »

oleg110592 писал(а):AVR ISP
На тот момент считал, что это тоже что и USBASP - забыл упомянуть об этом, извиняюсь.
Фьюзы тоже никогда не трогаю.

Да!! Вот оно:
oleg110592 писал(а):Давно помню было - в меге48 баловался переключением CLKPR до /256, после чего мега переставала "видеться" программатором самопальным типа AVRISP. Спасал программатор на LPT, чей софт (не помню как обзывался) начинал видно с нижних частот на CLK, эту мегу позволил вернуть к жизни. Еще спасал сим программатором массу авров с неправильно выставленным тактированием - достаточно было прикоснуться пинцетом к ноге XTAL1 (частота наводки 50 гЦ), чего хватало софту.
Совпадает. Одну мегу (первую) я стирая - неосторожно согласившись с вопросом avrdude - стер значения фьюзов, поэтому с ней покончено надолго. А вот фьюзы второй меги остались нетронуты. И поэтому её удалось "вернуть к жизни".

В сухом остатке получается: если после заливки прошивки с изменением значения CLKPR, мега перестаёт видеться, то достаточно или стереть её или залить прошивку без изменения значения регистра CLKPR, используя внешнее тактирование микросхемы (в Вашем случае 50Гц, я тактировал 6МГц) и использования пониженной частоты SCK (в моём случае это было 32кГц, при использовании более высокой частоты - она не виделась, я проверял).

:)

Отлично! Уже нашли решение - как приводить мегу в это состояние и возвращать обратно.
Друг Кота
Аватара пользователя
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Сообщение oleg110592 »

я так понимаю - после сброса мы сразу переключаем CLKPR и программатор не успевает достучаться до микроконтроллера, если поставить задержку перед переключением CLKPR (например 100 мС), то должен успеть.
Первый раз сказал Мяу!
Сообщения: 31
Зарегистрирован: Сб авг 06, 2016 18:40:44

Сообщение moto261 »

тини 2313а-SU не лечится доктором
сигнатура 00 01 02
не видит аш 5 программаторов
Ответить

Вернуться в «AVR»