Страница 1 из 1

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

Добавлено: Чт июн 27, 2013 10:17:20
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;
}

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

Добавлено: Чт июн 27, 2013 10:39:52
Kavka
P-CAT писал(а):Во время проверки сигнатуры считывается 00 01 02. Если отключить проверку сигнатуры - значения считанных байт представляют собой счётчик.
Заблокировали МК. Сотри всё в МК (ключик -e для avrdude).

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

Добавлено: Сб июн 29, 2013 09:04:42
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
... и так далее
Кажись всё.. пора в магазин.

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

Добавлено: Вс июн 30, 2013 15:43:50
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]
В итоге второй контроллер перестал отвечать.
Похоже снова пора в магазин.

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

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

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

Почему от программной установки предделителя 1 к 1 через регистр CLKPR происходит потеря возможности использовать внутренний генератор?

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

Добавлено: Вс июн 30, 2013 19:48:31
dr.doc
А у меня есть одна тинька 2313 с испорченной сигнатурой, правда стер ее отключив МК во время программирования. Так вот шьется она из AVRStudio 6 при помощи STK-500, а остальные проги ругаются!

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

Добавлено: Вс июн 30, 2013 20:25:30
oleg110592
P-CAT писал(а): Почему от программной установки предделителя 1 к 1 через регистр CLKPR происходит потеря возможности использовать внутренний генератор?
Пользую мега48, мега168 и точно так же программно переключаю пределитель - никаких проблем не было. Попробуйте шить программой из аврстудии.

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

Добавлено: Вс июн 30, 2013 21:16:03
P-CAT
dr.doc писал(а):при помощи STK-500
Речь о программаторе? В STK-500 есть Serial High-Voltage Programming of AVR devices.
oleg110592 писал(а):Попробуйте шить программой из аврстудии.

- т. е. avrdude умеет прошивать всё, кроме кода, где встречается команда отключения предделителя?
dr.doc писал(а):Пользую мега48, мега168
как попробуете то же в 328-й, дайте знать.

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

Добавлено: Вс июн 30, 2013 21:18:51
dr.doc
Да Вы же сами сказали - не правильно читается сигнатура, отсюда и "болезнь" - невозможность прошивки, а про лекарство (AVRStudio) Вам уже писали - попробуйте.

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

Добавлено: Вс июн 30, 2013 23:39:47
oleg110592
т. е. avrdude умеет прошивать всё, кроме кода, где встречается команда отключения предделителя?
мега48/168 в плане программатора ничем не отличается от 328. А вот софт для программатора бывает разный - стараюсь использовать от фирмы производителя - скорее поэтому не имею вышеуказанных проблем. Например понипрог не может шить меги с буквами PA.

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

Добавлено: Пн июл 01, 2013 11:34:39
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 взводится в программе, а во время прошивки опущенный ресет не даёт программе выполняться! Или значение в данном регистре сохраняется после выполнения программы? Если речь идёт о значении по умолчанию - то как она может быть "настолько низка"?

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

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

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

Добавлено: Пн июл 01, 2013 12:41:27
oleg110592
А вот загрузки, тактирования, фьюзов и пр. - в спецификации видим отдельные таблицы
Где такие таблицы? В даташите не наблюдаю. Тактирование и фузы одинаковые. Только начиная с 88 есть наличие поддержки бутлоадера.
Как запускать?
СпойлерИзображение

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

Добавлено: Пн июл 01, 2013 14:09:05
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-е ?

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

Добавлено: Пн июл 01, 2013 14:40:19
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 КБ) 506 скачиваний

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

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

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

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

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

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

:)

Отлично! Уже нашли решение - как приводить мегу в это состояние и возвращать обратно.

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

Добавлено: Вт июл 02, 2013 12:29:36
oleg110592
я так понимаю - после сброса мы сразу переключаем CLKPR и программатор не успевает достучаться до микроконтроллера, если поставить задержку перед переключением CLKPR (например 100 мС), то должен успеть.

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

Добавлено: Вт фев 06, 2018 16:36:40
moto261
тини 2313а-SU не лечится доктором
сигнатура 00 01 02
не видит аш 5 программаторов