Страница 1 из 1
Проблема с перепрошивкой Atmega8
Добавлено: Пн мар 04, 2013 00:47:58
infinity19891
Доброго времени суток всем! Простите меня если не туда пишу, и не там создаю тему.
Проблема в следующем:
Написал программу под 8-ю мегу, прошил, проверил, работает. Но вот, решил я его стереть и прошить другой прошивкой, и не стерается и не шьётся и не читается. Пробовал разными методами, программаторами и программами - результат=0. Сразу скажу что фьюзы не трогал, и прошивал его программой PonyProg. До этого, с теми же настройками прошивал другой atmega8, с успешной его перепрошивкой.
Залез в исходник своей программы, и обнаружил что у меня весь порт C как вход. Теперь не знаю как с ним быть. Подскажите, как его можно стереть и перепрошить, кто сталкивался с таким, как быть?
p.s. мне завтра нужно устройство отдать рабочее, деньги получил уже.
Re: Проблема с перепрошивкой Atmega8
Добавлено: Пн мар 04, 2013 01:10:40
Enigm
А устройство хоть работает ?
Попробуйте убрать все элементы которые есть на выводах для программирования.
Вы точно уверенны что прогер живой ?
Re: Проблема с перепрошивкой Atmega8
Добавлено: Пн мар 04, 2013 02:28:15
infinity19891
Enigm писал(а):А устройство хоть работает ?
Попробуйте убрать все элементы которые есть на выводах для программирования.
Вы точно уверенны что прогер живой ?
Прогер живой 100%, у меня их 3. Элементов нет никаких уже. Да, устройство исправно работает. Но не то что надо. Если дотрагиваюсь до вывода RESET пальцем, на дисплее появляются кракозябры, сброс не происходит.
Re: Проблема с перепрошивкой Atmega8
Добавлено: Пн мар 04, 2013 03:01:05
Enigm
Ну чудес не бывает, если пиания в норме, и прогер живой.
Тут 2 варианта, либо мега глючная, или все же с фьюзами напортачили, а именно отключили вход RESET(что очень похоже)
Если с фьюзами напортачили, то фьюзе доктор вам в помощь.
Посадите ногу reset на массу(через резистор килоом так на 4к7), и включите поделку, если стартанет, то точно с фьюзами напортачили.
На будущее вот вам калькулятор фьюзов, для пони прога.
http://fusecalc.mirmk.net/
Re: Проблема с перепрошивкой Atmega8
Добавлено: Пн мар 04, 2013 04:20:25
infinity19891
Спасибо, буду пробовать, потом отпишусь.
Re: Проблема с перепрошивкой Atmega8
Добавлено: Пн мар 04, 2013 07:00:35
infinity19891
Вот вопрос: Может ли такая программа работать как бит защиты RSTDISBL?
Спойлер
Код: Выделить всё
#include <avr/io.h>//Стандартная библиотека ввода/вывода
#include <avr/interrupt.h>//Библиотека прерываний
unsigned char mode=0;//Переменная пункта меню
int flag=0;//Флаг вывода на экран пункта меню
#define RS 1 //Вывод RS ЖКИ на вывод PD1 МК
#define E 3 //Вывод E ЖКИ на вывод PD3 МК
#define TIME 10
//Прототипы функций
void lcd_init (void);//Инициализация ЖКИ
void lcd_dat (unsigned char lcd);//Программа записи данных в ЖКИ
void lcd_com (unsigned char lcd);//Программа записи комманд в ЖКИ
void pause (unsigned int a);//Переменная для программы задержки(паузы)
//Обработчик прерываний по таймеру 0
ISR(TIMER0_OVF_vect)
{
if ((PIND&0x00)==0x01)//Если низкий уровень на PD0 есть
{
pause(1000); //Ждем 0.01с
if ((PIND&0x00)==0x01)//Если низкий уровень на PD0 есть
{
while ((PIND&0x01)==0x00);//Ждем отжатия клавиши
mode=(mode+1)%3;//Меняем переменнюу пункта меню в +1
flag=0;//Меняем флаг на 0
}
TCNT0=0x00;//Очищаем счетчик таймера0
TIFR=0x00; //и флаг переполнения
}
else //Если на PD0 нет низкого уровня
if ((PIND&0x01)==0x00)//проверяем низкий уровень на PD1
{
pause(1000); //Если есть Ждем 0.01с
if ((PIND&0x01)==0x00) //проверяем низкий уровень на PD1 еще раз
{
while ((PIND&0x01)==0x00); //Ждем отжатия клавиши
mode=(mode-1)%3;////Меняем переменнюу пункта меню в -1
flag=0;//Меняем флаг на 0
}
TCNT0=0x00;//Очищаем счетчик таймера0
TIFR=0x00; //И флаг переполнения
}
return;
}
//Программа вывода строки на ЖКИ
void lcd_string( char *s )
{
while( *s ) //цикл пока указатель существует
lcd_dat( *s++ ); //выводить строку
}
//Функция задержки(паузы)
void pause (unsigned int a)
{
unsigned int i; //переменная для задержки
for (i=a;i>0;i--); //цикл задержки
}
//Программа передачи комманды в ЖКИ
void lcd_com (unsigned char lcd)
{
unsigned char temp;
temp=(lcd&~(1<<RS))|(1<<E); //RS=0 – это команда
PORTB=temp; //Выводим на portB старшую тетраду команды, сигналы RS, E
asm("nop"); //Небольшая задержка в 1 такт МК, для стабилизации
PORTB=temp&~(1<<E); //Сигнал записи команды
temp=((lcd*16)&~(1<<RS))|(1<<E); //RS=0 – это команда
PORTB=temp; //Выводим на portB старшую тетраду команды, сигналы RS, E
asm("nop"); //Небольшая задержка в 1 такт МК, для стабилизации
PORTB=temp&~(1<<E); //Сигнал записи команды
pause (20*TIME); //Пауза для выполнения команды
}
//Программа передачм данных в ЖКИ
void lcd_dat (unsigned char lcd)
{
unsigned char temp;
temp=(lcd|(1<<RS))|(1<<E); //RS=1 – это данные
PORTB=temp; //Выводим на portB старшую тетраду данных, сигналы RS, E
asm("nop"); //Небольшая задержка в 1 такт МК, для стабилизации
PORTB=temp&~(1<<E); //Сигнал записи данных
temp=((lcd*16)|(1<<RS))|(1<<E); //RS=1 – это данные
PORTB=temp; //Выводим на portB старшую тетраду данных, сигналы RS, E
asm("nop"); //Небольшая задержка в 1 такт МК, для стабилизации
PORTB=temp&~(1<<E); //Сигнал записи данных
pause(10*TIME); //Пауза для вывода данных
}
////Программа инициализации ЖКИ
void lcd_init (void)
{
lcd_com(0x2C); //4-проводный интерфейс, 5x8 размер символа
pause(200*TIME);//пауза на выполненеи комманды
lcd_com(0x0C); //Показать изображение, курсор не показывать
pause(200*TIME);//пауза на выполненеи комманды
lcd_com(0x01); //Очистить DDRAM и установить курсор на 0x00
pause (200*TIME);//пауза на выполненеи комманды
}
//Программа инициализации таймера 0
void init_timer (void)
{
TIMSK=(1<<TOIE0); //Разрешить прерывания по переполнению таймера 0
TCCR0=(1<<CS00)|(1<<CS01)|(0<<CS02); //Делитель =/64
}
//Программа обработки переменной меню
void menu(void)
{
if (mode==0)//Если переменная меню=0
{
if (flag==0)//Если флаг=0
{
lcd_com(0x80);//Чистим экран ЖКИ
lcd_string("<Menu1>");//Выводим название первого пункта меню 1
flag=1;//Переключаем флаг=1
}
}
else //иначе
if (mode==1)//Если переменная меню=1
{
if (flag==0)//Если флаг=0
{
lcd_com(0x80);//Чистим экран
lcd_string("<Menu2>");//Выводим название первого пункта меню 2
flag=1;//Переключаем флаг=1
}
}
else //В любом другом случаи
{
if (flag==0)//Если флаг=0
{
lcd_com(0x80);//Чистим экран ЖКИ
lcd_string("<Menu3>");//Выводим название первого пункта меню 3
flag=1;//Переключаем флаг=1
}
}
}
//Основная программа
int main(void)
{
/////////////Конфигурируем порты МК////////////////
DDRB=0xFA; //PB0,PB2 как входа, остальные - выхода
PORTB=0x05;//Выводим на порт D = 000000101
DDRD=0x00;//Весь порт D как вход
PORTD=0xFF;//Включаем подтягивающие резисторы
///////////////////////////////////////////////////
pause(3000); //Задержка для включения ЖКИ
lcd_init(); //Инициализация ЖКИ
pause(3000); //Задержка для включения ЖКИ
init_timer();//Инициализация таймера 0
sei();//Глобально разрешаем прерывания
while(1)//Вечный цикл
{
menu();//Запуск обработки пунктов меню
}
}
Если да, то как её стереть? Реаниматор поможет, или прийдётся выкинуть всё-таки контроллер?
Re: Проблема с перепрошивкой Atmega8
Добавлено: Пн мар 04, 2013 11:46:18
Enigm
Как я знаю фьюз RSTDISBL програмно включить не вариант, только ручками.
Если у вас проблема именно в этом фьюзе, то фьюздоктор вам поможет.
У вас вывод reset в устройстве используется ?
Re: Проблема с перепрошивкой Atmega8
Добавлено: Пн мар 04, 2013 13:14:22
infinity19891
Судя по испытаниям в протусе, именно он используется для перекоючения пунктов меню. Но он корректно работает только если запрограммировать RSTDISBL. В ином случае (в моём), он просто пытается в момент получения команды (в данном случае это замыкание этого вывода на общий) сбросить мк. Исходя из этого, сброс происходит не корректно, поскольку в момент сброса мк принимает комманды, и перейти в режим программирования не получается. Вот в этом и есть главная проблема: Как заставить его войти в этот режим, чтобы стереть и прошить нужной прошивкой.
Re: Проблема с перепрошивкой Atmega8
Добавлено: Пн мар 04, 2013 13:30:49
Engineer_Keen
infinity19891 писал(а):Судя по испытаниям в протусе, именно он используется для перекоючения пунктов меню.
Это как? Вы сами не знаете что за код написали???
infinity19891 писал(а):Но он корректно работает только если запрограммировать RSTDISBL. В ином случае (в моём), он просто пытается в момент получения команды (в данном случае это замыкание этого вывода на общий) сбросить мк.
Ну естественно, эта нога либо как ресет, либо как нога ввода/вывода, одновременно никак.
infinity19891 писал(а):Вот в этом и есть главная проблема: Как заставить его войти в этот режим, чтобы стереть и прошить нужной прошивкой.
Или найти/собрать
Fusebit доктора и каждый раз запускать его перед прошивкой или использовать высоковольтный программатор (который на ресет 12в дает).
Re: Проблема с перепрошивкой Atmega8
Добавлено: Пн мар 04, 2013 14:05:19
infinity19891
Engineer_Keen писал(а):или использовать высоковольтный программатор (который на ресет 12в дает).
А можно с этого места по подробнее?
Re: Проблема с перепрошивкой Atmega8
Добавлено: Пн мар 04, 2013 14:43:35
Engineer_Keen
А чего подробнее? Просто программатор такой. Можно купить (гугл знает), можно
собрать.
Re: Проблема с перепрошивкой Atmega8
Добавлено: Пн мар 04, 2013 17:19:35
infinity19891
Собрать больше интересует.
Ну для начала попробую реаниматор собрать, а потом (если не поможет) буду HV программатор собирать. В любом случае завтра новый мк поеду покупать.