Зависание меги8 при записи в EEPROM...

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1269
Зарегистрирован: Пт июл 21, 2006 15:05:19
Откуда: плод воображения

Сообщение KT315B »

Интересно, кто-нибудь кроме меня сталкивался с таким? Есть мега8, тактируемая от кварца 8МГц. Первый таймер выдает ежесекундное прерывание, которое обновляет данные на ЖК. К меге прикручен энкодер, опрос которого происходит в основном цикле программы и после каждого изменения позиции энкодера записываются данные в EEPROM, чтобы их можно было восстановить после выключения устройства, тем самым исключив необходимость повторной настройки. Дык вот: после того, как сделано несколько оборотов энкодера - МК как будто зависает - на дальнейшие повороты энкодера не реагирует, прерывание по таймеру не обрабатывает (судя по показаниям ЖК). Спустя секунд 10 процесс "отмерзает", однако при следующем задействовании энкодера все зависает заново. Собственно эту проблему я решил отказом от использования EEPROM, однако все-таки интересно, почему такое могло произойти? Может кто-нибудь наблюдал похожие глюки AVR?
R2AIV 73!
Контактная информация:
Реклама
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 335
Зарегистрирован: Вт сен 11, 2007 10:27:08
Откуда: Киев

Сообщение __Alexander »

Это не глюк авр. Это по документации слишком медленная запись в ЭПРОМ. А зависание/отмерзание - это ты ждешь флага записи. Вот и все. А так, в принципе, давай исходник, проверим.
Реклама
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1269
Зарегистрирован: Пт июл 21, 2006 15:05:19
Откуда: плод воображения

Сообщение KT315B »

Дык нет уже исходника - проблему-то решил! Просто интересны возможные причины... Насчет флага - тоже непонятно, ибо сначала запись проходит на ура и ничего не виснет - все начианет виснуть с определенного момента.
R2AIV 73!
Контактная информация:
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 335
Зарегистрирован: Вт сен 11, 2007 10:27:08
Откуда: Киев

Сообщение __Alexander »

Правильно, виснуть начинает с повышением скорости оборотов энкодера. Хотя, если проблему решил - то не в этом дело. Без исходника можно чепуху наговорить.
Реклама
Эиком - электронные компоненты и радиодетали
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1269
Зарегистрирован: Пт июл 21, 2006 15:05:19
Откуда: плод воображения

Сообщение KT315B »

Хм, странно все это, ибо крутил равномерно, но зависание происхожило, на конкретной величине переменной, отвечающей за счет оборотов энкодера.... Тогда отстается только ожидание флага освобождления EEPROM?
R2AIV 73!
Контактная информация:
Реклама
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 335
Зарегистрирован: Вт сен 11, 2007 10:27:08
Откуда: Киев

Сообщение __Alexander »

Если равномерно то нет. Может и в проге дело. Тоже ньюансы есть.

Личная ситуация:
такая штука как

if (x)
y = 1;

глючила в таймере пока не напишешь

if (x == 1)
y =1;

так что тут бабка...
Реклама
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1269
Зарегистрирован: Пт июл 21, 2006 15:05:19
Откуда: плод воображения

Сообщение KT315B »

__Alexander писал(а):так что тут бабка...
Мда, компиляторы не совершенны однако... Это какой компилятор, кстати?
R2AIV 73!
Контактная информация:
Мучитель микросхем
Сообщения: 492
Зарегистрирован: Вт июл 22, 2008 08:10:54

Сообщение BerZerK-ku »

KT315B писал(а):Насчет флага - тоже непонятно, ибо сначала запись проходит на ура и ничего не виснет - все начианет виснуть с определенного момента.
А вот для этого и нужен исходник. У меня ATmega8 работает с EEPROM и не жалуется.
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 335
Зарегистрирован: Вт сен 11, 2007 10:27:08
Откуда: Киев

Сообщение __Alexander »

KT315B писал(а):
__Alexander писал(а):так что тут бабка...
Мда, компиляторы не совершенны однако... Это какой компилятор, кстати?
Это ИАР, но тут дело чуть хитрее, в некоторых участках программы все наормально.
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 335
Зарегистрирован: Вт сен 11, 2007 10:27:08
Откуда: Киев

Сообщение __Alexander »

BerZerK-ku писал(а):
KT315B писал(а):Насчет флага - тоже непонятно, ибо сначала запись проходит на ура и ничего не виснет - все начианет виснуть с определенного момента.
А вот для этого и нужен исходник. У меня ATmega8 работает с EEPROM и не жалуется.
У меня не только мега8 работает с памятью нормально, а соссно все авр'ки. Тут дело в скорости. Настрой таймер на частоту кварца, переполение по 1, и в его прерывании пиши в эту память. :)) Это я пошутил. Не пробуй, т.к. гониво получится. На этом собственно вся остальная программа будет ну очень медленно выполняться.
Мучитель микросхем
Сообщения: 492
Зарегистрирован: Вт июл 22, 2008 08:10:54

Сообщение BerZerK-ku »

__Alexander писал(а): У меня не только мега8 работает с памятью нормально, а соссно все авр'ки. Тут дело в скорости. Настрой таймер на частоту кварца, переполение по 1, и в его прерывании пиши в эту память. :)) Это я пошутил. Не пробуй, т.к. гониво получится. На этом собственно вся остальная программа будет ну очень медленно выполняться.
Чушь какая-то... достаточно перед чтением/записью проверить состояние флага EEWE. Так же рекомендуется запрещать прерывания в момент записи.
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 335
Зарегистрирован: Вт сен 11, 2007 10:27:08
Откуда: Киев

Сообщение __Alexander »

BerZerK-ku писал(а):
__Alexander писал(а): У меня не только мега8 работает с памятью нормально, а соссно все авр'ки. Тут дело в скорости. Настрой таймер на частоту кварца, переполение по 1, и в его прерывании пиши в эту память. :)) Это я пошутил. Не пробуй, т.к. гониво получится. На этом собственно вся остальная программа будет ну очень медленно выполняться.
Чушь какая-то... достаточно перед чтением/записью проверить состояние флага EEWE. Так же рекомендуется запрещать прерывания в момент записи.
Чушь? Посмотри в ДШ время записи в еепром. Это тебе не флеш.
Ну и что что я флаг проверю? Пока запись не произойдет - ничего работать не будет. Т.к. всё будет находиться в ожидании этого флага. А установка этого флага (т.е. время записи) намного меньше выходящих импульсов с энкодера.

Попробуй писать в еепром с частотой 16 Мгц. :)) И при этом чтобы основная программа выполнялась и результат записи был достоверный. Хи, флаг проверять.

Если вам не было необходимости писать в еепром чаще 10-ти раз в секунду - то это еще не значит что другим это не надо и типа должно работать.
Мучитель микросхем
Сообщения: 492
Зарегистрирован: Вт июл 22, 2008 08:10:54

Сообщение BerZerK-ku »

Почему 10 раз в секунду? как минимум 100 легко потянет.
Почему прога стоять должна? Проверяешь в основном цикле/прерывании флаг, тем же if(). Сброшен - работай с памятью, установлен - иди дальше.
Нашел транзистор. Понюхал.
Сообщения: 165
Зарегистрирован: Сб янв 20, 2007 20:44:33
Откуда: Из закаулков вашей души

Сообщение Demon »

Сейчас глянул в справочник там указана время записи в EEPROM не более 9мс, а также что на время записи необходимо запрещать все прерывания.
Мучитель микросхем
Сообщения: 492
Зарегистрирован: Вт июл 22, 2008 08:10:54

Сообщение BerZerK-ku »

Demon писал(а):Сейчас глянул в справочник там указана время записи в EEPROM не более 9мс, а также что на время записи необходимо запрещать все прерывания.
Внимательнее надо быть, либо сопостовлять данные с написанным в ДШ на микроконтроллер.
Прерывания "РЕКОМЕНДУЕТСЯ" отключать на время выполнения шагов: установка регистров EEDR/EEAR -> установка флага EEMWE регистра EECR -> установка флага EEWE регистра EECR. Связано это с тем, что между записью EEWE и EEMWE должно пройти не более 4 машинных тактов, а значения EEDR/EEAR могут быть изменены во время прерывания.
Опытный кот
Аватара пользователя
Сообщения: 849
Зарегистрирован: Сб янв 05, 2008 11:05:15
Откуда: Україна м.Луцьк

Сообщение sachok »

У меня не зависает но тоже есть проблемы с работой eeprom на меге8.
сейчас немного кода:

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

eeprom int a1,a2,a3; // змінні для зберігання значеня максимальної температури в eeprom
if (PINC.5==0){c3=(b3++);delay_us(5);}//так происходить смена переменной "b"
//далее сохраняю данные
        if (PINC.3==0)
        {
        delay_ms(50);
        a3=b3;
        lcd_gotoxy(8,0);
        lcd_putsf("SAVED   ");
        delay_ms(1000);
        lcd_clear();
        }
Вот всё что связано с записью.

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

b3=a3//вот так читаю данные которые хранятся в переменной "а"
c3=b3; 

когда вывожу значение "с3" на дисплей то там обычно на 1 больше чем должно бить. подозреваю что проблема в программе так как первый раз работаю с eeprom и с МК знаком тоже мало времени. если что то не так то напишите как сделать что бы оно работало нормально.
Я не Сашок!!!
Контактная информация:
Мучитель микросхем
Сообщения: 492
Зарегистрирован: Вт июл 22, 2008 08:10:54

Сообщение BerZerK-ku »

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

eeprom int a1,a2,a3; // змінні для зберігання значеня максимальної температури в eeprom
if (PINC.5==0){c3=(b3++);delay_us(5);}//так происходить смена переменной "b"
//далее сохраняю данные
        if (PINC.3==0)
        {
        delay_ms(50);
        a3=b3;
        lcd_gotoxy(8,0);
        lcd_putsf("SAVED   ");
        delay_ms(1000);
        lcd_clear();
        }
Вот всё что связано с записью.

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

В память вы пишете b3, а на экран выводите с3. Вот тут и кроется разница в 1. В теле if (PINC.5==0) вы в с3 пишете значение b3, которое ПОСЛЕ этого инкрементируете, и записываете с3 в ЕЕПРОМ. Учтите этот момент. И либо используйте ++b3 вместо b3++, либо пишите в память b3 вместо c3, либо просто на экран выводите с3+1  :)
Опытный кот
Аватара пользователя
Сообщения: 849
Зарегистрирован: Сб янв 05, 2008 11:05:15
Откуда: Україна м.Луцьк

Сообщение sachok »

BerZerK-ku большое спасибо! написал ++b3 и всё заработало как часы!!!
Я не Сашок!!!
Контактная информация:
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»