4.8.2008

Спасение Atmega32 с плохими фьюзами

Мне тут досталась для опытов одна atmega32, у которой фьюзы были установлены так, что она по SPI не программировалась и не отвечала вообще.

Собственно, так как с ней работали только через SPI, то очевидно, что проблема в источнике тактирования. Варианты все описаны в даташите.

Первым делом, я решим перепробовать все возможные варианты тактирования. Попробовал внешний кристалл, внешнюю RC цепь, попытался подать тактовый сигнал с другой атмеги – ничего не заработало. Остался только один вариант – это Low-frequency Crystal Oscillator. У меня его дома нет (хотя и зря).

Однако, коли я все равно питаю все свои схемы от компа, то я же могу завести с него и +12 и помощью atmega8 сделать параллельное программирование.

У atmega8 с учетом подключения LCD по 4-х битному интерфейсу, только только хватило ног.

PB с atmega8 полностью идет на PB atmega32 один в один
PD2-PD6 – на PD2-PD6
PD1 на XTAL1
PD7 на PA0
Получается вот такой расклад битов на PD у atmega8

#define X_XTAL1 1
#define X_OE 2
#define X_WR 3
#define X_BS1 4
#define X_XA0 5
#define X_XA1 6
#define X_BS2 7

RSY/BSY – подключен на GND через светодиод. Когда делается CHIP RESET, то он дергается.

PAGEL – кинуть на GND.

Провод +12 от компа идет на макетку. Суть такая, что по даташиту, надо дать на RESET atmega32 сначала GND, сделать некие манипуляции, после чего подать туда +12В. Поэтому на экране программа сначала говорит, что надо присоединить к GND, а потом, когда надо, пишет, что надо к +12В подсоединить. На практике, на GND не потребовалось сажать, можно сразу ткнуть на +12В и все работали и так.

Программный код работы с экраном приводить не буду – надо, найдете и замените вывод на LCD на свою любимую библиотеку.

Странное дело с таймингами. Atmega8 работает на 1МГц. Т.е. любая операция выполняется не менее 1мкс. Тайминги по параллельному программированию в основном – сотни наносекунд, но все меньше чем 1 мкс. Однако, если не делать задержек – НЕ РАБОТАЕТ. Странно, но факт.

При чтении фьюзов все совпало. Там как раз стоят исчточник тактирования - Low-frequency Crystal Oscillator.

Основной код, достаточный, чтобы сделать chip reset и сделать default fuses.

Исходник

Полный исходник с чтением signature и fuses (без либы для lcd): recover.c

Видео

Комментарии
Andreas () 2008-08-11 13:20:32 #1 link
А к какому порту подключен дисплей ?
Не помешало бы схему выложить.
Andreas () 2008-08-11 18:17:13 #2 link
Вопрос снимаю, уже разобрался...

Спасибо за девайс, восстановил 2 штуки убитых Atmega32.
Raul () 2009-01-05 08:24:27 #3 link
Ty a lot!

Unlock somes atmega8.

Gracias!

From Mexico!
dinozawr (Москква, Россия) 2009-09-30 15:59:32 #4 link
Подскажите пожалуйста, как реанимировать Atmega8
Артем Кучин (Москва, Россия) 2009-09-30 20:43:46 #5 link
Да так же. Просто проводки к другим ногам подводить надо. Читайте Даташит - не ленитесь.
Nikita (Riga, Latvia) 2009-11-30 18:27:34 #6 link
http://img4.imageshack.us/img4/1949/dsc09505l.jpg посмотрите пожалуйста, я правильно слепил? 1-й и 2-й Атмеги реанимируемые, соответственно 8 и 32, 3-й Атмега8 - Реаниматор. Порты соеденены по строкам.
Nikita (Riga, Latvia) 2009-12-19 11:06:40 #7 link
Хочу сказать, что всё получилось. Поднял 3-4 "убитых" МК. Спасибо!
укроп (Рязань, Россия) 2011-01-10 11:45:56 #8 link
Помогите пожалуйста скомпилировать в .hex


#define X_XTAL1 1
#define X_OE 2
#define X_WR 3
#define X_BS1 4
#define X_XA0 5
#define X_XA1 6
#define X_BS2 7

int main() {
DDRD|=0b11111110;

_delay_ms(5000);
// connect reset of bad chip to gnd now

// toggle xtal1 at lease 6 times
for(i=0;i<8;i++){
PORTD|=_BV(X_XTAL1);
_delay_ms(10);
PORTD&=~_BV(X_XTAL1);
_delay_ms(10);
}
// set prog enable pins (pagel is gnd, xa0, xa1, bs1 - zero)
// PD4,PD5,PD6
PORTD&=~(_BV(X_XA0)|_BV(X_XA1)|_BV(X_BS1));
PORTD|=_BV(X_WR); // write disables

_delay_ms(5000);
// connect reset of bad chip to +12 NOW

// SET OE HIGH
PORTD|=_BV(X_OE);

DDRB=0xff;

// chip erase
//Set XA1 to 1, XA0 to 0. This enables command loading.
PORTD|=_BV(X_XA1);
PORTD&=~_BV(X_XA0);
// Set BS1 to “0”, BS1 - PD4
PORTD&=~_BV(X_BS1);
// Set DATA to command
PORTB=0b10000000;
//Give XTAL1 a positive pulse. This loads the command., XTAL1 - PD1
PORTD|=_BV(X_XTAL1);_delay_ms(10);PORTD&=~_BV(X_XTAL1);_delay_ms(10);
// Give WR a negative pulse. This starts the Chip Erase. RDY/BSY goes low.
PORTD&=~_BV(X_WR);_delay_ms(10);PORTD|=_BV(X_WR);_delay_ms(10);


// wait a bit
_delay_ms(1000);


// load default data for FUSE low byte
//Set XA1 to 1, XA0 to 0. This enables command loading.
PORTD|=_BV(X_XA1);
PORTD&=~_BV(X_XA0);
// Set BS1 to “0”, BS1 - PD4
PORTD&=~_BV(X_BS1);
// Set DATA to command
PORTB=0b01000000;
//Give XTAL1 a positive pulse. This loads the command., XTAL1 - PD1
PORTD|=_BV(X_XTAL1);_delay_ms(10);PORTD&=~_BV(X_XTAL1);_delay_ms(10);
// load data
PORTD&=~_BV(X_XA1);
PORTD|=_BV(X_XA0);
PORTB=0b11100001; // DEFAULT VALUE FOR LOW FUSE BYTE
PORTD|=_BV(X_XTAL1);_delay_ms(10);PORTD&=~_BV(X_XTAL1);_delay_ms(10);
// Set BS1 to “0” and BS2 to “0”.
PORTD&=~_BV(X_BS1);
PORTD&=~_BV(X_BS2);
// Give WR a negative pulse. This starts the Chip Erase. RDY/BSY goes low.
PORTD&=~_BV(X_WR);_delay_ms(10);PORTD|=_BV(X_WR);_delay_ms(10);


// load default data for HIGH low byte
//Set XA1 to 1, XA0 to 0. This enables command loading.
PORTD|=_BV(X_XA1);
PORTD&=~_BV(X_XA0);
// Set BS1 to “0”, BS1 - PD4
PORTD&=~_BV(X_BS1);
// Set DATA to command
PORTB=0b01000000;
//Give XTAL1 a positive pulse. This loads the command., XTAL1 - PD1
PORTD|=_BV(X_XTAL1);_delay_ms(10);PORTD&=~_BV(X_XTAL1);_delay_ms(10);
// load data
PORTD&=~_BV(X_XA1);
PORTD|=_BV(X_XA0);
PORTB=0b10011001; // DEFAULT VALUE FOR HIGH FUSE BYTE
PORTD|=_BV(X_XTAL1);_delay_ms(10);PORTD&=~_BV(X_XTAL1);_delay_ms(10);
// Set BS1 to “0” and BS2 to “0”.
PORTD|=_BV(X_BS1);
PORTD&=~_BV(X_BS2);
// Give WR a negative pulse. This starts the Chip Erase. RDY/BSY goes low.
PORTD&=~_BV(X_WR);_delay_ms(10);PORTD|=_BV(X_WR);_delay_ms(10);

// done
while(1);


}
Артем Кучин (Москва, Россия) 2011-01-10 22:36:12 #9 link
А у вас что, не компилятора или лень обуяла за выходные до такой степени?
Странная просьба какая-то.
Игорь (Полтава, Украина) 2011-01-21 10:21:02 #10 link
Подскажите пожалуйста если вместо Mega8 использовать Мепы 32 то в программе что надо изменить.
Артем Кучин (Москва, Россия) 2011-01-21 22:22:13 #11 link
С первого взгляда нет. Если выводы использовать все те же, то ничего вроде менять не требуется.
Руслан (Лебедин, Украина) 2012-03-10 13:29:54 #12 link
Здраствуйте, схему не пробовал, но это единственное что мне поможет. Я так понял прога сама дает Рестарт до заводских состояния фюзов, но в видео оперетор переключал режимы стирание памяти и режимы фюзов. Вопрос: а как пользоваться сим девайсом? Просто врубить ресет к +12 и подождать 10-20 сек?
Артем Кучин (Москва, Россия) 2012-03-10 23:11:56 #13 link
Пользоваться просто: использовать мозг.
См а) даташит б) описание в) видео, если ничего не поможет, то ничего не поможет.
Lee (, VN) 2018-08-11 14:46:30 #14 link
This connect is not clear for me, please can you send me the schematic for that?
Thanks sir
green.bamboo.sg@gmail.com
Артем Кучин () 2018-08-15 13:08:08 #15 link
What is not clear?
Googdle transaltes very well
PB matched PB on atmega32
PD2-PD6 – to PD2-PD6
PD1 to XTAL1
PD7 to PA0

Pay attention, think, read datasheet. Don't be lazy.
Добавить комментарий
Ваше имя:
город: страна:
Комментарий:

Введите код "2667" -
Сообщения не по теме будут удалены. Вопросы не по теме следует направлять по электронную почту. Ваши данные будут запомнены в cookie для удобства. HTML запрещен.

(C)1999-2021 Артем Кучин
Email: artem@artem.ru
На письма без темы или без имени отправителя не отвечаю

При использовании материалов ссылка на сайта www.artem.ru обязательна! Автор оставляет за собой право отказать в праве использования материалов на безвозмездной основе без объяснения причин. Материалы сайта защищены законом об авторских и смежных правах.

Цена домена: 1 500 000 руб.