Прошивка ATmega8A-PU через самодельный SKT200

Обсуждаем контроллеры компании Atmel.
Ответить
Родился
Сообщения: 7
Зарегистрирован: Пн янв 23, 2017 14:09:59

Сообщение Andreey »

Доброго времени суток! Нужно было зашить прошивку в МК, выбрал ATmega8A-PU (видел что народ шьёт и весьма удачно, да и по характеристикам устроил). Но, как известно, чтобы прошить МК нужен программатор. Готовые стоят бешеных цен, так что взял ещё M74HC244, и начал паять.
Вот такая платка под атмегу (20 МГц для другого нужно, никак с атмегой не связано. 4МГц - распаял место под кварц просто на всякий случай, даже кварц ещё не покупал):
Изображение
и по схеме
Изображение
сделал платку для программатора:
Изображение
(не кусайте за кривость, пожалуйста, недавно начал всем этим заниматься :) )
Написал сначала нужную программку, но потом решил сделать нечто попроще, ну так для себя, чисто порж... проверить работоспособность.
ПоставилCodeVisionAVR, через визард задал выходную ножку, написал кодик:
Спойлер#include <mega8.h>

// Declare your global variables here

void main(void)
{
// Declare your local variables here

// Input/Output Ports initialization
// Port B initialization
// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In
DDRB=(0<<DDB7) | (0<<DDB6) | (0<<DDB5) | (0<<DDB4) | (0<<DDB3) | (0<<DDB2) | (1<<DDB1) | (0<<DDB0);
// State: Bit7=T Bit6=T Bit5=T Bit4=P Bit3=P Bit2=P Bit1=T Bit0=T
PORTB=(0<<PORTB7) | (0<<PORTB6) | (0<<PORTB5) | (1<<PORTB4) | (1<<PORTB3) | (1<<PORTB2) | (0<<PORTB1) | (0<<PORTB0);

// Port C initialization
// Function: Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In
DDRC=(0<<DDC6) | (0<<DDC5) | (0<<DDC4) | (0<<DDC3) | (0<<DDC2) | (0<<DDC1) | (0<<DDC0);
// State: Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T
PORTC=(0<<PORTC6) | (0<<PORTC5) | (0<<PORTC4) | (0<<PORTC3) | (0<<PORTC2) | (0<<PORTC1) | (0<<PORTC0);

// Port D initialization
// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In
DDRD=(0<<DDD7) | (0<<DDD6) | (0<<DDD5) | (0<<DDD4) | (0<<DDD3) | (0<<DDD2) | (0<<DDD1) | (0<<DDD0);
// State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T
PORTD=(0<<PORTD7) | (0<<PORTD6) | (0<<PORTD5) | (0<<PORTD4) | (0<<PORTD3) | (0<<PORTD2) | (0<<PORTD1) | (0<<PORTD0);

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
TCCR0=(0<<CS02) | (0<<CS01) | (0<<CS00);
TCNT0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer1 Stopped
// Mode: Normal top=0xFFFF
// OC1A output: Disconnected
// OC1B output: Disconnected
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=(0<<COM1A1) | (0<<COM1A0) | (0<<COM1B1) | (0<<COM1B0) | (0<<WGM11) | (0<<WGM10);
TCCR1B=(0<<ICNC1) | (0<<ICES1) | (0<<WGM13) | (0<<WGM12) | (0<<CS12) | (0<<CS11) | (0<<CS10);
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer2 Stopped
// Mode: Normal top=0xFF
// OC2 output: Disconnected
ASSR=0<<AS2;
TCCR2=(0<<PWM2) | (0<<COM21) | (0<<COM20) | (0<<CTC2) | (0<<CS22) | (0<<CS21) | (0<<CS20);
TCNT2=0x00;
OCR2=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=(0<<OCIE2) | (0<<TOIE2) | (0<<TICIE1) | (0<<OCIE1A) | (0<<OCIE1B) | (0<<TOIE1) | (0<<TOIE0);

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
MCUCR=(0<<ISC11) | (0<<ISC10) | (0<<ISC01) | (0<<ISC00);

// USART initialization
// USART disabled
UCSRB=(0<<RXCIE) | (0<<TXCIE) | (0<<UDRIE) | (0<<RXEN) | (0<<TXEN) | (0<<UCSZ2) | (0<<RXB8) | (0<<TXB8);

// Analog Comparator initialization
// Analog Comparator: Off
// The Analog Comparator's positive input is
// connected to the AIN0 pin
// The Analog Comparator's negative input is
// connected to the AIN1 pin
ACSR=(1<<ACD) | (0<<ACBG) | (0<<ACO) | (0<<ACI) | (0<<ACIE) | (0<<ACIC) | (0<<ACIS1) | (0<<ACIS0);
SFIOR=(0<<ACME);

// ADC initialization
// ADC disabled
ADCSRA=(0<<ADEN) | (0<<ADSC) | (0<<ADFR) | (0<<ADIF) | (0<<ADIE) | (0<<ADPS2) | (0<<ADPS1) | (0<<ADPS0);

// SPI initialization
// SPI disabled
SPCR=(0<<SPIE) | (1<<SPE) | (0<<DORD) | (0<<MSTR) | (0<<CPOL) | (0<<CPHA) | (0<<SPR1) | (0<<SPR0);

// TWI initialization
// TWI disabled
TWCR=(0<<TWEA) | (0<<TWSTA) | (0<<TWSTO) | (0<<TWEN) | (0<<TWIE);

while (1)
{
// Place your code here
//if(PORTB.1)
PORTC.0 = 1;
//else
//PORTC.0 = 0;
}
}
Однако ошибка Communication error от меня не отставала. Но в один прекрасный момент всё заработало: флеш память чистилась, прошивка заливалась.... пока я случайно не задел клавиатуру и не нажал лок битс... и всё, появился у меня камень, который всегда подаёт на ножку 1 :)
Высказав себе всё что я о себе думаю, отпаял МК и вставил новый (знал что обязательно что-нибудь пойдёт не так - купил 2). Однако как я не пытался, ошибка никак не пропадала.
Delay Multiplier менял, в биосе поставил режим lpt на Bidirectional, 100 раз перепроверил правильность схемы и платы.
Может кто подсказать как мне избавиться от этого проклятого Communication error?
Реклама
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2406
Зарегистрирован: Ср фев 23, 2011 12:12:31

Сообщение AndTer »

Микроконтроллеры стоит ставить в панельки, лучше цанговые, чтобы не пришлось отпаивать по случаю.
Избавиться от ошибки очень просто: купить нормальный программатор)
СтОят программаторы вполне себе копейки, если заказывать у китайцев на АЛИ.

ЗЫ Кто вас учит так разводить платы? :facepalm: :facepalm: :facepalm:
Глупый не задает вопросы. Глупый и так все знает.
Реклама
Мудрый кот
Аватара пользователя
Сообщения: 1810
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

Сообщение Kavka »

Andreey, шлейф (провода) длинные от программатора до МК?
Можно попробовать резисторы на 33 ома заменить на 250-470 ом.
И что-то не пойму по плате, есть или нет блокировочные конденсаторы по питанию. Желательно как можно ближе к выводам питания. На плате с МК и на программаторе. Есть?
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Опытный кот
Сообщения: 884
Зарегистрирован: Вс мар 17, 2013 18:54:07

Сообщение nikin_n »

Вот этот вариант STK-200 работает аки швейцарские часы. :)
http://hardlock.h15.ru/hard/stk200/index.html
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Аватара пользователя
Сообщения: 44151
Зарегистрирован: Пн ноя 30, 2009 03:00:01
Откуда: Нерезиновая

Сообщение АлександрЛ »

А я вот таким пользуюсь, уже больше пяти лет.. Никаких проблем.
Изображение
Изображение
Пару лет назад сделал в качестве "довеска" переходник для программирования Мега8 (48/88), или Тини2313/90S2313:
Изображение
Недавно сделал USB программатор :
Изображение
и столкнулся с тем, что под управлением АВР- дудки этот программатор работает, а под управлением СинаПрог-а НЕТ!! Пишет, что "программатор не обнаружен", хотя в системе он висит нормально (дудка - РАБОТАЕТ!!)

(Имхо) Самая лучшая "оболочка" для STK200 - это Унипроф или Понипрог.. :dont_know:

Ну, а так- вообще- то, удобна та программа, к которой привык..
Реклама
Родился
Сообщения: 7
Зарегистрирован: Пн янв 23, 2017 14:09:59

Сообщение Andreey »

AndTer писал(а): ЗЫ Кто вас учит так разводить платы? :facepalm: :facepalm: :facepalm:
Никто, сам научился. Если подскажете что и где не правильно и как правильно - буду благодарен.
Kavka писал(а):Andreey, шлейф (провода) длинные от программатора до МК?
Можно попробовать резисторы на 33 ома заменить на 250-470 ом.
И что-то не пойму по плате, есть или нет блокировочные конденсаторы по питанию. Желательно как можно ближе к выводам питания. На плате с МК и на программаторе. Есть?
1. Не очень, 15-20 см.
2. Попробую.
3. На программаторе есть, а вот на плате с атмегой нету...
4. Так ведь шилось! Правда недолго из-за моей ошибки с локом. Не понятно почему он не шился много раз, потом начал прошивать, а потом перестал.

nikin_n писал(а):Вот этот вариант STK-200 работает аки швейцарские часы. :)
http://hardlock.h15.ru/hard/stk200/index.html
Так это она и есть, за исключением резисторов. За это её кто-то ругал, что запарывает камни. Так что где-то у меня с этими часами не так, то ли на ногу одеваю, то ли ремешок забыл застегнуть.

Добавлено after 6 minutes 2 seconds:
АлександрЛ писал(а):А я вот таким пользуюсь, уже больше пяти лет.. Никаких проблем.
всё гениальное - просто :) Я тоже думал плюнуть на всё и сделать так.
АлександрЛ писал(а): Недавно сделал USB программатор :
Чтобы сделать USB программатор - надо его прошить через LPT :)
АлександрЛ писал(а): и столкнулся с тем, что под управлением АВР- дудки этот программатор работает, а под управлением СинаПрог-а НЕТ!! Пишет, что "программатор не обнаружен", хотя в системе он висит нормально (дудка - РАБОТАЕТ!!)

(Имхо) Самая лучшая "оболочка" для STK200 - это Унипроф или Понипрог.. :dont_know:

Ну, а так- вообще- то, удобна та программа, к которой привык..
Я пока не привык, так что мысль попробовать другое ПО - хорошая мысль.
Реклама
Друг Кота
Аватара пользователя
Сообщения: 44151
Зарегистрирован: Пн ноя 30, 2009 03:00:01
Откуда: Нерезиновая

Сообщение АлександрЛ »

Andreey писал(а): Я пока не привык, так что мысль попробовать другое ПО - хорошая мысль.
Попробуйте Uniprof.. Как- то он мне больше нравится, вот только надо внимательно фьюзы программировать- сначала разобраться, какие именно автор написал- "прямые" или "инверсные"..

зы.. Хотя у меня и сним была "странность" - перешивал Мегу128- Унипроф её вроде как перешил, но почему- то "не заработало", а ПониПрог- ом она перешилась и заработала нормально.. :dont_know:
Шил как раз через "пять проводков"..
Родился
Сообщения: 7
Зарегистрирован: Пн янв 23, 2017 14:09:59

Сообщение Andreey »

АлександрЛ писал(а): Хотя у меня и сним была "странность"
Да сколько ни читал - у одного одним прошивается, у другого - другим. Вывод я сделал такой - качай и используй всё. Что-нибудь да заработает, если ошибок в коде/фьюзах/железе нету :)
Друг Кота
Аватара пользователя
Сообщения: 44151
Зарегистрирован: Пн ноя 30, 2009 03:00:01
Откуда: Нерезиновая

Сообщение АлександрЛ »

Andreey писал(а):Вывод я сделал такой - качай и используй всё. Что-нибудь да заработает, если ошибок в коде/фьюзах/железе нету :)
Это точно..
Кстати, вопреки всем советам у меня кабель "пять проводков" имеет длину - сантиметров 80, наверное..
Родился
Сообщения: 7
Зарегистрирован: Пн янв 23, 2017 14:09:59

Сообщение Andreey »

5 проводков не запахал. Зато есть успехи с моей стк200. Ну как успехи... Теперь он мне пишет Can't read Chip Signature because LB1=0 & LB2=0. Если считать Lock Bits, то он выдаёт такую красоту:
Изображение
И если согласиться, то выставляет настройки так:
Изображение

Вопрос: какой собаки? Как он смог что-то залочить, когда чип был девственницей и при попытках прошиться выдавал раньше только ошибки?

*Спустя 15 минут.*
Перезапустил CodeVisionAVR, увидел кнопку запрогать лок биты. запрогал. единицы. Думаю отлично. Прочитал сигнатуру, видится. Однако при прошивке флеш, выдаёт что лок биты снова стали нулями.
Записать 1 в лок биты можно, правда если попытаться очистить камень, то выдаёт:
Изображение
Друг Кота
Аватара пользователя
Сообщения: 44151
Зарегистрирован: Пн ноя 30, 2009 03:00:01
Откуда: Нерезиновая

Сообщение АлександрЛ »

Andreey писал(а):5 проводков не запахал.
Странно.. Там вроде и "не пахать" нечему..
Родился
Сообщения: 7
Зарегистрирован: Пн янв 23, 2017 14:09:59

Сообщение Andreey »

АлександрЛ писал(а):Странно.. Там вроде и "не пахать" нечему..
Я тоже не понимаю. Но он просто не видит. А стк200 видит, но лок биты == 0. Почему... я не понимаю.
Изображение
Родился
Сообщения: 7
Зарегистрирован: Пн янв 23, 2017 14:09:59

Сообщение Andreey »

Ура! Заработало! Поставил кварц на 4МГц, код, написанный в CodeVisionAVR, прошивается понипрогом восхитительно. Биты замечательно выходят и выходят :))
Вот только заставить кнопку работать у меня не получается.... К примеру написал PORTC.0 /*led*/ = PORTB.1 /*button*/; , но светодиод темнее ночи. Может что не так с настройками порта для кнопки?
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2406
Зарегистрирован: Ср фев 23, 2011 12:12:31

Сообщение AndTer »

Без листинга программы никто не ответит.
Глупый не задает вопросы. Глупый и так все знает.
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Сообщение COKPOWEHEU »

PORTC.0 /*led*/ = PORTB.1 /*button*/;
1. Лучше не использовать нестандартную экзотику, характерную для какого-то конкретного диалекта. В обычном Си такая запись неправильна.
2. Чтобы считать реальное состояние порта, читать надо не PORTx, а PINx.
Таким образом, ваш код будет выглядеть так

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

DDRB &=~(1<<1); //PB1 настраиваем на вход
PORTC |= (1<<0); //PC0 настраиваем на выход
if( PINB & (1<<1) ){ //если на PB1 лог.1, то
  PORTC |= (1<<0); //выдаем на PB0 лог.1
}else{ //в противном случае
  PORTC &=~(1<<0); //выдаем на PB0 лог.0
}
Если же есть опыт работы с макросами и препроцессором, можно написать более наглядно и кроссплатформенно

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

#define BTN B,1,1
#define LED C,0,1
DDR_0( BTN );
DDR_1( LED );
if( PIN_ON( BTN) )PORT_ON(LED); else PORT_OFF(LED);
С использованием моих макросов (пока приводить их не буду - без понимания основ они бесполезны), возможно легко менять порт, куда подключены кнопка и диод, и их "включенный" уровень (лог.0 или лог.1).
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2406
Зарегистрирован: Ср фев 23, 2011 12:12:31

Сообщение AndTer »

Andreey писал(а):PORTC.0 /*led*/ = PORTB.1 /*button*/;
Наверное надо так:

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

PORTC.0 = PINB.1;
Глупый не задает вопросы. Глупый и так все знает.
Родился
Сообщения: 7
Зарегистрирован: Пн янв 23, 2017 14:09:59

Сообщение Andreey »

COKPOWEHEU писал(а): 2. Чтобы считать реальное состояние порта, читать надо не PORTx, а PINx.
Таким образом, ваш код будет выглядеть так

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

DDRB &=~(1<<1); //PB1 настраиваем на вход
PORTC |= (1<<0); //PC0 настраиваем на выход
if( PINB & (1<<1) ){ //если на PB1 лог.1, то
  PORTC |= (1<<0); //выдаем на PB0 лог.1
}else{ //в противном случае
  PORTC &=~(1<<0); //выдаем на PB0 лог.0
}
AndTer писал(а):PORTC.0 = PINB.1;
Две здоровенные рыбы этим усатым! Заработало!

Кнопку жму - светодиод загорается на пару секунд... не понятно почему не гаснет сразу.
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2406
Зарегистрирован: Ср фев 23, 2011 12:12:31

Сообщение AndTer »

Andreey писал(а):не понятно почему не гаснет сразу.
Листинг программы выложи уже! Тогда сразу станет всё понятно. И частоту с которой работает МК.
Глупый не задает вопросы. Глупый и так все знает.
Ответить

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