Зависание меги8 при записи в EEPROM...
Интересно, кто-нибудь кроме меня сталкивался с таким? Есть мега8, тактируемая от кварца 8МГц. Первый таймер выдает ежесекундное прерывание, которое обновляет данные на ЖК. К меге прикручен энкодер, опрос которого происходит в основном цикле программы и после каждого изменения позиции энкодера записываются данные в EEPROM, чтобы их можно было восстановить после выключения устройства, тем самым исключив необходимость повторной настройки. Дык вот: после того, как сделано несколько оборотов энкодера - МК как будто зависает - на дальнейшие повороты энкодера не реагирует, прерывание по таймеру не обрабатывает (судя по показаниям ЖК). Спустя секунд 10 процесс "отмерзает", однако при следующем задействовании энкодера все зависает заново. Собственно эту проблему я решил отказом от использования EEPROM, однако все-таки интересно, почему такое могло произойти? Может кто-нибудь наблюдал похожие глюки AVR?
R2AIV 73!
- Реклама
Дык нет уже исходника - проблему-то решил! Просто интересны возможные причины... Насчет флага - тоже непонятно, ибо сначала запись проходит на ура и ничего не виснет - все начианет виснуть с определенного момента.
R2AIV 73!
Хм, странно все это, ибо крутил равномерно, но зависание происхожило, на конкретной величине переменной, отвечающей за счет оборотов энкодера.... Тогда отстается только ожидание флага освобождления EEPROM?
R2AIV 73!
- Реклама
Мда, компиляторы не совершенны однако... Это какой компилятор, кстати?__Alexander писал(а):так что тут бабка...
R2AIV 73!
- Сообщения: 492
- Зарегистрирован: Вт июл 22, 2008 08:10:54
У меня не только мега8 работает с памятью нормально, а соссно все авр'ки. Тут дело в скорости. Настрой таймер на частоту кварца, переполение по 1, и в его прерывании пиши в эту память.BerZerK-ku писал(а):А вот для этого и нужен исходник. У меня ATmega8 работает с EEPROM и не жалуется.KT315B писал(а):Насчет флага - тоже непонятно, ибо сначала запись проходит на ура и ничего не виснет - все начианет виснуть с определенного момента.
- Сообщения: 492
- Зарегистрирован: Вт июл 22, 2008 08:10:54
Чушь какая-то... достаточно перед чтением/записью проверить состояние флага EEWE. Так же рекомендуется запрещать прерывания в момент записи.__Alexander писал(а): У меня не только мега8 работает с памятью нормально, а соссно все авр'ки. Тут дело в скорости. Настрой таймер на частоту кварца, переполение по 1, и в его прерывании пиши в эту память.Это я пошутил. Не пробуй, т.к. гониво получится. На этом собственно вся остальная программа будет ну очень медленно выполняться.
Чушь? Посмотри в ДШ время записи в еепром. Это тебе не флеш.BerZerK-ku писал(а):Чушь какая-то... достаточно перед чтением/записью проверить состояние флага EEWE. Так же рекомендуется запрещать прерывания в момент записи.__Alexander писал(а): У меня не только мега8 работает с памятью нормально, а соссно все авр'ки. Тут дело в скорости. Настрой таймер на частоту кварца, переполение по 1, и в его прерывании пиши в эту память.Это я пошутил. Не пробуй, т.к. гониво получится. На этом собственно вся остальная программа будет ну очень медленно выполняться.
Ну и что что я флаг проверю? Пока запись не произойдет - ничего работать не будет. Т.к. всё будет находиться в ожидании этого флага. А установка этого флага (т.е. время записи) намного меньше выходящих импульсов с энкодера.
Попробуй писать в еепром с частотой 16 Мгц.
Если вам не было необходимости писать в еепром чаще 10-ти раз в секунду - то это еще не значит что другим это не надо и типа должно работать.
- Сообщения: 492
- Зарегистрирован: Вт июл 22, 2008 08:10:54
- Сообщения: 492
- Зарегистрирован: Вт июл 22, 2008 08:10:54
Внимательнее надо быть, либо сопостовлять данные с написанным в ДШ на микроконтроллер.Demon писал(а):Сейчас глянул в справочник там указана время записи в EEPROM не более 9мс, а также что на время записи необходимо запрещать все прерывания.
Прерывания "РЕКОМЕНДУЕТСЯ" отключать на время выполнения шагов: установка регистров EEDR/EEAR -> установка флага EEMWE регистра EECR -> установка флага EEWE регистра EECR. Связано это с тем, что между записью EEWE и EEMWE должно пройти не более 4 машинных тактов, а значения EEDR/EEAR могут быть изменены во время прерывания.
У меня не зависает но тоже есть проблемы с работой eeprom на меге8.
сейчас немного кода:
Вот всё что связано с записью.
когда вывожу значение "с3" на дисплей то там обычно на 1 больше чем должно бить. подозреваю что проблема в программе так как первый раз работаю с eeprom и с МК знаком тоже мало времени. если что то не так то напишите как сделать что бы оно работало нормально.
сейчас немного кода:
Код: Выделить всё
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
Код: Выделить всё
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 :)BerZerK-ku большое спасибо! написал ++b3 и всё заработало как часы!!!
Я не Сашок!!!


