Страница 1 из 1
Зависание меги8 при записи в EEPROM...
Добавлено: Вс авг 17, 2008 22:16:13
KT315B
Интересно, кто-нибудь кроме меня сталкивался с таким? Есть мега8, тактируемая от кварца 8МГц. Первый таймер выдает ежесекундное прерывание, которое обновляет данные на ЖК. К меге прикручен энкодер, опрос которого происходит в основном цикле программы и после каждого изменения позиции энкодера записываются данные в EEPROM, чтобы их можно было восстановить после выключения устройства, тем самым исключив необходимость повторной настройки. Дык вот: после того, как сделано несколько оборотов энкодера - МК как будто зависает - на дальнейшие повороты энкодера не реагирует, прерывание по таймеру не обрабатывает (судя по показаниям ЖК). Спустя секунд 10 процесс "отмерзает", однако при следующем задействовании энкодера все зависает заново. Собственно эту проблему я решил отказом от использования EEPROM, однако все-таки интересно, почему такое могло произойти? Может кто-нибудь наблюдал похожие глюки AVR?
Добавлено: Вс авг 17, 2008 22:22:02
__Alexander
Это не глюк авр. Это по документации слишком медленная запись в ЭПРОМ. А зависание/отмерзание - это ты ждешь флага записи. Вот и все. А так, в принципе, давай исходник, проверим.
Добавлено: Вс авг 17, 2008 22:29:21
KT315B
Дык нет уже исходника - проблему-то решил! Просто интересны возможные причины... Насчет флага - тоже непонятно, ибо сначала запись проходит на ура и ничего не виснет - все начианет виснуть с определенного момента.
Добавлено: Вс авг 17, 2008 23:17:09
__Alexander
Правильно, виснуть начинает с повышением скорости оборотов энкодера. Хотя, если проблему решил - то не в этом дело. Без исходника можно чепуху наговорить.
Добавлено: Пн авг 18, 2008 00:18:35
KT315B
Хм, странно все это, ибо крутил равномерно, но зависание происхожило, на конкретной величине переменной, отвечающей за счет оборотов энкодера.... Тогда отстается только ожидание флага освобождления EEPROM?
Добавлено: Пн авг 18, 2008 00:24:48
__Alexander
Если равномерно то нет. Может и в проге дело. Тоже ньюансы есть.
Личная ситуация:
такая штука как
if (x)
y = 1;
глючила в таймере пока не напишешь
if (x == 1)
y =1;
так что тут бабка...
Добавлено: Пн авг 18, 2008 00:29:11
KT315B
__Alexander писал(а):так что тут бабка...
Мда, компиляторы не совершенны однако... Это какой компилятор, кстати?
Добавлено: Пн авг 18, 2008 07:49:05
BerZerK-ku
KT315B писал(а):Насчет флага - тоже непонятно, ибо сначала запись проходит на ура и ничего не виснет - все начианет виснуть с определенного момента.
А вот для этого и нужен исходник. У меня ATmega8 работает с EEPROM и не жалуется.
Добавлено: Пн авг 18, 2008 12:49:41
__Alexander
KT315B писал(а):__Alexander писал(а):так что тут бабка...
Мда, компиляторы не совершенны однако... Это какой компилятор, кстати?
Это ИАР, но тут дело чуть хитрее, в некоторых участках программы все наормально.
Добавлено: Пн авг 18, 2008 12:54:02
__Alexander
BerZerK-ku писал(а):KT315B писал(а):Насчет флага - тоже непонятно, ибо сначала запись проходит на ура и ничего не виснет - все начианет виснуть с определенного момента.
А вот для этого и нужен исходник. У меня ATmega8 работает с EEPROM и не жалуется.
У меня не только мега8 работает с памятью нормально, а соссно все авр'ки. Тут дело в скорости. Настрой таймер на частоту кварца, переполение по 1, и в его прерывании пиши в эту память.

Это я пошутил. Не пробуй, т.к. гониво получится. На этом собственно вся остальная программа будет ну очень медленно выполняться.
Добавлено: Пн авг 18, 2008 14:59:59
BerZerK-ku
__Alexander писал(а):
У меня не только мега8 работает с памятью нормально, а соссно все авр'ки. Тут дело в скорости. Настрой таймер на частоту кварца, переполение по 1, и в его прерывании пиши в эту память.

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

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

И при этом чтобы основная программа выполнялась и результат записи был достоверный. Хи, флаг проверять.
Если вам не было необходимости писать в еепром чаще 10-ти раз в секунду - то это еще не значит что другим это не надо и типа должно работать.
Добавлено: Ср авг 20, 2008 19:46:51
BerZerK-ku
Почему 10 раз в секунду? как минимум 100 легко потянет.
Почему прога стоять должна? Проверяешь в основном цикле/прерывании флаг, тем же if(). Сброшен - работай с памятью, установлен - иди дальше.
Добавлено: Пт авг 22, 2008 13:46:07
Demon
Сейчас глянул в справочник там указана время записи в EEPROM не более 9мс, а также что на время записи необходимо запрещать все прерывания.
Добавлено: Пт авг 22, 2008 14:09:29
BerZerK-ku
Demon писал(а):Сейчас глянул в справочник там указана время записи в EEPROM не более 9мс, а также что на время записи необходимо запрещать все прерывания.
Внимательнее надо быть, либо сопостовлять данные с написанным в ДШ на микроконтроллер.
Прерывания "РЕКОМЕНДУЕТСЯ" отключать на время выполнения шагов: установка регистров EEDR/EEAR -> установка флага EEMWE регистра EECR -> установка флага EEWE регистра EECR. Связано это с тем, что между записью EEWE и EEMWE должно пройти не более 4 машинных тактов, а значения EEDR/EEAR могут быть изменены во время прерывания.
Добавлено: Пн дек 22, 2008 21:37:35
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 и с МК знаком тоже мало времени. если что то не так то напишите как сделать что бы оно работало нормально.
Добавлено: Вт дек 23, 2008 10:29:09
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 :)
Добавлено: Вт дек 23, 2008 16:42:33
sachok
BerZerK-ku большое спасибо! написал ++b3 и всё заработало как часы!!!