Проблема с перепрошивкой Atmega8

Обсуждаем контроллеры компании Atmel.
Ответить
Встал на лапы
Сообщения: 141
Зарегистрирован: Вс дек 18, 2011 10:26:43
Откуда: Пинск

Сообщение infinity19891 »

Доброго времени суток всем! Простите меня если не туда пишу, и не там создаю тему.
Проблема в следующем:
Написал программу под 8-ю мегу, прошил, проверил, работает. Но вот, решил я его стереть и прошить другой прошивкой, и не стерается и не шьётся и не читается. Пробовал разными методами, программаторами и программами - результат=0. Сразу скажу что фьюзы не трогал, и прошивал его программой PonyProg. До этого, с теми же настройками прошивал другой atmega8, с успешной его перепрошивкой.
Залез в исходник своей программы, и обнаружил что у меня весь порт C как вход. Теперь не знаю как с ним быть. Подскажите, как его можно стереть и перепрошить, кто сталкивался с таким, как быть?
p.s. мне завтра нужно устройство отдать рабочее, деньги получил уже.
Реклама
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1663
Зарегистрирован: Вт апр 03, 2012 20:36:41
Откуда: Сочи

Сообщение Enigm »

А устройство хоть работает ?
Попробуйте убрать все элементы которые есть на выводах для программирования.
Вы точно уверенны что прогер живой ?
Реклама
Встал на лапы
Сообщения: 141
Зарегистрирован: Вс дек 18, 2011 10:26:43
Откуда: Пинск

Сообщение infinity19891 »

Enigm писал(а):А устройство хоть работает ?
Попробуйте убрать все элементы которые есть на выводах для программирования.
Вы точно уверенны что прогер живой ?
Прогер живой 100%, у меня их 3. Элементов нет никаких уже. Да, устройство исправно работает. Но не то что надо. Если дотрагиваюсь до вывода RESET пальцем, на дисплее появляются кракозябры, сброс не происходит.
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1663
Зарегистрирован: Вт апр 03, 2012 20:36:41
Откуда: Сочи

Сообщение Enigm »

Ну чудес не бывает, если пиания в норме, и прогер живой.
Тут 2 варианта, либо мега глючная, или все же с фьюзами напортачили, а именно отключили вход RESET(что очень похоже)
Если с фьюзами напортачили, то фьюзе доктор вам в помощь.
Посадите ногу reset на массу(через резистор килоом так на 4к7), и включите поделку, если стартанет, то точно с фьюзами напортачили.
На будущее вот вам калькулятор фьюзов, для пони прога. http://fusecalc.mirmk.net/
Реклама
Эиком - электронные компоненты и радиодетали
Встал на лапы
Сообщения: 141
Зарегистрирован: Вс дек 18, 2011 10:26:43
Откуда: Пинск

Сообщение infinity19891 »

Спасибо, буду пробовать, потом отпишусь.
Реклама
Встал на лапы
Сообщения: 141
Зарегистрирован: Вс дек 18, 2011 10:26:43
Откуда: Пинск

Сообщение 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();//Запуск обработки пунктов меню
    }
    }
Если да, то как её стереть? Реаниматор поможет, или прийдётся выкинуть всё-таки контроллер?
Реклама
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1663
Зарегистрирован: Вт апр 03, 2012 20:36:41
Откуда: Сочи

Сообщение Enigm »

Как я знаю фьюз RSTDISBL програмно включить не вариант, только ручками.
Если у вас проблема именно в этом фьюзе, то фьюздоктор вам поможет.
У вас вывод reset в устройстве используется ?
Встал на лапы
Сообщения: 141
Зарегистрирован: Вс дек 18, 2011 10:26:43
Откуда: Пинск

Сообщение infinity19891 »

Судя по испытаниям в протусе, именно он используется для перекоючения пунктов меню. Но он корректно работает только если запрограммировать RSTDISBL. В ином случае (в моём), он просто пытается в момент получения команды (в данном случае это замыкание этого вывода на общий) сбросить мк. Исходя из этого, сброс происходит не корректно, поскольку в момент сброса мк принимает комманды, и перейти в режим программирования не получается. Вот в этом и есть главная проблема: Как заставить его войти в этот режим, чтобы стереть и прошить нужной прошивкой.
Друг Кота
Аватара пользователя
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Сообщение Engineer_Keen »

infinity19891 писал(а):Судя по испытаниям в протусе, именно он используется для перекоючения пунктов меню.
Это как? Вы сами не знаете что за код написали???
infinity19891 писал(а):Но он корректно работает только если запрограммировать RSTDISBL. В ином случае (в моём), он просто пытается в момент получения команды (в данном случае это замыкание этого вывода на общий) сбросить мк.
Ну естественно, эта нога либо как ресет, либо как нога ввода/вывода, одновременно никак.
infinity19891 писал(а):Вот в этом и есть главная проблема: Как заставить его войти в этот режим, чтобы стереть и прошить нужной прошивкой.
Или найти/собрать Fusebit доктора и каждый раз запускать его перед прошивкой или использовать высоковольтный программатор (который на ресет 12в дает).
Встал на лапы
Сообщения: 141
Зарегистрирован: Вс дек 18, 2011 10:26:43
Откуда: Пинск

Сообщение infinity19891 »

Engineer_Keen писал(а):или использовать высоковольтный программатор (который на ресет 12в дает).
А можно с этого места по подробнее?
Друг Кота
Аватара пользователя
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Сообщение Engineer_Keen »

А чего подробнее? Просто программатор такой. Можно купить (гугл знает), можно собрать.
Встал на лапы
Сообщения: 141
Зарегистрирован: Вс дек 18, 2011 10:26:43
Откуда: Пинск

Сообщение infinity19891 »

Собрать больше интересует.
Ну для начала попробую реаниматор собрать, а потом (если не поможет) буду HV программатор собирать. В любом случае завтра новый мк поеду покупать.
Ответить

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