Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Atmega зависает при включении питания
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > MCS51, AVR, PIC, STM8, 8bit
LSerg
Имеется плата с Atmega 128. При включении питания зависает не постоянно.
Программа написана на winavr включен fuse WDTON. В main первая команда погасить светодиоды, затем wdt_enable(WDTO_2S);
После повторной подачи питания запуск происходит нормально. Состояние зависания определяю по тому, что светодиоды не гаснут.
Возможные варианты:
1. Так как при повторном запуске программа запускается нормально значит flash память не портится.
2. AVR не правильно выполняет команды в "стрессовых" ситуациях .....
3. Загадки WinAVR

Кварц внешний 14.7456

Уважаемые специалисты, помогите разобраться.
Dog Pawlowa
Цитата(LSerg @ May 22 2010, 20:30) *
В main первая команда погасить светодиоды...

1) А почему Вы решили, что не выполняется эта команда?
Что, светодиоды больше не могут зажечься?

2) Попробуйте отключить fuse WDTON и не разрешать WDT.
Leonmezon
Чтоб можно было подсказать: Привидите текст программы (можно только начало: интересуют установки портов и основных регистров).
Можно еще прогнать в симуляторе (и посмотреть что происходит с регистрами).
LSerg
Код
#define SV_1_OFF                      PORTC |=(1<<PC0)
#define SV_2_OFF                         PORTC|=(1<<PC1)
#define SV_3_OFF                      PORTC |=(1<<PC2)
#define SV_4_OFF                         PORTC|=(1<<PC3)
#define SV_5_OFF                         PORTC|=(1<<PC4)

void Init_Port(void)
{
    DDRC = 0xFF;        //Настроить выводы на выход светодиоды
    DDRF = 0xF0;        //Настроить выводы на вход "Кнопки"
    DDRB = 0xC8;
    DDRG |= 0x07;
    DDRE |= 0x02;        //Выводы прерываний настроены на вход
    
    PORTF &= 0x0F;
    

    SV_1_OFF;
    SV_2_OFF;
    SV_3_OFF;
    SV_4_OFF;
    SV_5_OFF;
}
int main(void)
{
    unsigned char LCD_Menu=0,                  
                  Cikl_Menu = 0,                  
                  Flag_1sec=0,
                  Time_Test_Ust = 0;
                  
    volatile unsigned char Seconds_OLD = 0;
    
    wdt_enable(WDTO_2S);
    _delay_ms(30);        //    Задержка на переходные процессы
    
    Init_Port();
        .....
}

Светодиоды подключены через резистор на +5В.
В программе они при наступлении аварии зажигаются индицируя номер события.
И поэтому светится все вместе одновременно не могут, кроме включения.

На счет очередности команд в вопросе я ошибся. В программе они идут на оборот.

Отключить WDT можно, но зависание проявляется не часто примерно 1 в 30 включений. Может в этом и есть смысл, но пока непонятен. И отключать не хочется требуется постоянная работа устройства и перезапуск возможен.
V_G
А фьюзы выставили для ВЧ кварца? Забыл точно наименование, но там один фьюз, отвечающий за выдачу либо полноразмерного сигнала на выход генератора, но более высокое потребление, либо за пониженное потребление и пониженную амплитуду сигнала кварцевого генератора. Во втором случае некоторые атмеги могут работать с кварцем выше 8 МГЦ, а могут и не работать. Потому для ВЧ кварцев Атмел рекомендует всегда включать этот фьюз на повышенное потребление.

А WDT зависание не провоцирует, а наоборот, убирает. Только тактирование проца должно при этом работать нормально.
LSerg
Fuse Full Amplitude установлен. На счет WDT как я понимаю тоже должен работать, но зависание происходит. Что больше всего в этом не нравится это зависание при включении и непостоянно. Вроде как AVR не правильно выполняет команды???
sigmaN
А что там насчёт электромагнитной совместимости?
На плате стоят какие-нибудь релюшки? Что-то высоко мощное коммутируется? Может быть электродвигатель?
Что-то же сбивает процессор с толку.
LSerg
Релюшки стоят, но срабатывают они уже после включения в процессе работы. И если сбивали бы, то по WDT должен идти перезапуск.
sigmaN
Ничего не бывает просто так smile.gif
Разводка питания как там у вас? Керамика стоит по питанию как положено?
Ну не известно как у вас сконфигурирован WDT. Может быть он там прерывание пытается выполнить вместо перезагрузки. А может быть наоборот: WDT непрерывно перезапускает проц...Хотя нет, диодики бы наверное мигали... В общем надо всё проверять.
А может быть кварц у вас так прилажен, что о надежном тактировании речи и быть не может. Никто ведь не знает что там и как у Вас..
Может быть начать тогда с внутреннего RC генератора?
LSerg
На счет прерывания по WDT в мега 128 по моему его нет?
По поводу генератора если с ним предположим проблема, хотя разводка в норме, то WDT тактируется от своего генератора и внешний тут не причем.
sigmaN
Да что вы так за WDT вцепились. это вообще крайний случай, когда уже всё повисло наглухо.
По хорошему - всё должно чётко работать и без него ))

Код
На счет прерывания по WDT в мега 128 по моему его нет?
Не знаю. Надо смотреть в даташит. Я не общался пока со 128ой мегой так близко. Но уже лежит на очереди )))

Всёже я бы начал с внутреннего RC генератора.
=AK=
Цитата(LSerg @ May 23 2010, 03:00) *
При включении питания зависает не постоянно.
После повторной подачи питания запуск происходит нормально.


А Brow-Out Detector используете?
V_G
1. Стоит попробовать все-таки внутреннее тактирование
2. Непонятно, почему в программе НЕ инициализируются DDRE, DDRG, PORTC, PORTF. Надеемся на исходное состояние при подаче питания и сбросе?
Операторы "|=", "&=" портов не инициализируют
А вообще, т.к. полный текст программы не приведен, скорее зависает не проц, а программа. Проц - только если не выполнены требования к монтажу и разводке (блокировки, расположение земли и толщина трасс...)
LSerg
Цитата
2. Непонятно, почему в программе НЕ инициализируются DDRE, DDRG, PORTC, PORTF. Надеемся на исходное состояние при подаче питания и сбросе?
Операторы "|=", "&=" портов не инициализируют


Не совсем понял вопрос на счет операторов, если | - наложить 1, & - 0 . DDRC к которым подключены светодиоды настроен на выход.

WDTON если включен то отключить нельзя по даташиту.
BOD включен на 4В.

В общем интересует не сталкивались ли с подобной ситуацией?
Сам понимаю что чудес не бывает. Буду более детально проверять питание, если оно меньше 4В, то может висеть по BOR.
Спасибо всем откликнувшимся.
sigmaN
Цитата
Не совсем понял вопрос на счет операторов
ну на самом деле имеется ввиду, что первая запись в регистры предпочтительно должна быть именно записью( оператор = ) а не модификацией (read-modify-write). Результат наложения маски ведь зависит от того, что было в регистре до этого. К тому же экономим две инструкции smile.gif

Но лично моё мнение: если в даташите написано, что после reset там будет ноль - он там и будет. Так что ничего особо криминального не вижу тут.
V_G
Цитата(sigmaN @ May 24 2010, 02:03) *
Но лично моё мнение: если в даташите написано, что после reset там будет ноль - он там и будет. Так что ничего особо криминального не вижу тут.

А если не ресет, а просто программный глюк (со стеком что-нибудь, например), и софт пришел к нулевому адресу без ресета?
LSerg
Программный глюк об этом по подробней?
sigmaN
В хорошо написанной программе таких программных глюков быть не должно )
V_G
А что, кто-то умеет писать программы без ошибок? Особенно когда в качестве отладочных средств используются подпаянные светодиоды!
Типовой программный глюк - нарушение стека. Софт может выбить в незапрограммированную область, забитую FFFF-ами. Для AVR это некорректный программный код, но проц (судя по симулятору) просто проходит его, как NOP. Если в программе нет бутлоадера в верхней области памяти, попадая на любой адрес, больший объема программы, программа быстренько пройдет все FFFF, перескочит за пределы памяти и вернется в 0 (без ресета). А порты не проинициализированы, в них просто что-то по ИЛИ добавляется (или по И).
LSerg
Вопрос по симуляции не по светодиодам. Если питание устройства не отключать то все нормально. А если питание прерывается, то симуляция остановится или не так?
V_G
Цитата(LSerg @ May 24 2010, 19:34) *
Вопрос по симуляции не по светодиодам. Если питание устройства не отключать то все нормально. А если питание прерывается, то симуляция остановится или не так?

Я не понял, речь идет о СИмуляции, или об Эмуляции? Симуляция - чисто программная штука, там питание выключить сложно.
Если речь об эмуляторе, то у меня с JTAG ICE mkII и atxmega при выключении питания отлаживаемой платы ничего страшного не происходит (вернее, происходит то, что и должно происходить при выключении питания, у меня, к примеру, сохранение в EEPROM критической области из ОЗУ). После подачи питания все нормально рестартует.
В старом JTAG ICE и просто с атмегой - бывало, подвисало при снятии питания.
sigmaN
LSerg, пора бы вам раскрыть больше данных о своём проекте. Схема,разводка...результат проверки с внутренним генератором?
А то мне кажется Вы на месте шагаете ))
DpInRock
Убрать конденсатор с резета.
LSerg
Спасибо кто откликнулся по данному вопросу. Прошу Прощения за потраченное время, но зависание было по причине плохого контакта в результате чего питание на процессоре было 1,5В. Так как был включен сброс по BOR 4В, то процессор и не запускался. Причиной написания данного вопроса, стало сомнение по надежности работы процессоров AVR но найдя причину сомнение отошло на задний план.

Благодарю за ответы!!!
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.