Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
11.11.2015, 13:39
|
|
Прописка
Регистрация: 06.03.2007
Сообщений: 144
Сказал спасибо: 22
Сказали Спасибо 10 раз(а) в 10 сообщении(ях)
|
ATMega48 не сохраняется EEPROM
Здравствуйте.
Запрограммировал EEPROM.
Когда включаем устройство при подключенном программаторе EEPROM работает нормально.
Если программатор отсоединить, то Устройство не загружает данные из EEPROM.
Читал EEPROM - данные меняются при работе.
Код:
|
uint8_t eepYellow EEMEM= 4;
ISR(TIMER0_OVF_vect){
if(fTemp›0){
temp++;
if(temp›58){
fYellowPrev=fYellow;
eeprom_write_byte(&eepYellow,fYellow);
fTemp=0;
temp=0;
}
}else{
temp=0;
}
}
int main(void){
DDRD=0x00;
PORTD=0xFF;
DDRC=0xFF;
PORTC=0xFF;
TCNT0 = 1; //
TCCR0A |= (1 ‹‹ WGM01);
TCCR0B |= (1 ‹‹ CS00) | (1 ‹‹ CS02);
TIMSK0 |= (1 ‹‹ TOIE0);
fYellow=eeprom_read_byte(&eepYellow);
fYellowPrev=fYellow;
sei();
while(1){
if(fYellowPrev!=fYellow){
fTemp=1;
}
................
код
................
}
} |
Последний раз редактировалось sanstan; 11.11.2015 в 13:48.
|
|
|
|
11.11.2015, 18:28
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.10.2007
Адрес: Беларусь
Сообщений: 8,048
Сказал спасибо: 60
Сказали Спасибо 3,954 раз(а) в 2,309 сообщении(ях)
|
Re: ATMega48 не сохраняется EEPROM
Дурной тон в прерывании писать в ЕЕПРОМ
Выноси из прерывания
|
|
|
|
11.11.2015, 19:50
|
|
Почётный гражданин KAZUS.RU
Регистрация: 07.10.2007
Адрес: Луганск
Сообщений: 1,816
Сказал спасибо: 13
Сказали Спасибо 399 раз(а) в 214 сообщении(ях)
|
Re: ATMega48 не сохраняется EEPROM
Сообщение от niXto
|
Дурной тон в прерывании писать в ЕЕПРОМ
|
гы, обычно АБСОЛЮТНО ВСЁ пишу в прерываниях таймера... главное распределить ресурсы ядра и периферии, что бы гарантировано успевало обработать все события.
А запись EEPROM делать проверкой перед/после записи, с периодом 10 миллисек - гарантировано работает во всех МК .
Код:
|
ISR_TIM {
counter_restart_interupt=0;
//изменение переменой
if(условия изменения переменой)
{
ram_variable ++;
flag_save_eepom=1;//флаг сохранения в EEPROM
}
//счётчик периода записи в EEPROM
if(counter_10ms--==0)
{
counter_10ms=10ms;
if(flag_save_eepom›0)
{
if(eeprom_variable != ram_variable)
{
eeprom_variable = ram_variable;
}
else flag_save_eepom=0;
}
}
void main (void)
{
init_project();
counter_restart_interupt=0-1;
ram_variable = eeprom_variable;
while(1)
{
if(++counter_restart_interupt==0)
start_interupt();
}
} |
__________________
"picavr(ГАВ)мыло.ру" USB_Analyzer, Digital_Storage_Oscilloscope "picavr.kr1.ru" заказы в Китай компонентов/изготовление: плат/ЖКИ/мембраных клавиатур/имп трансформаторов
|
|
|
|
11.11.2015, 19:58
|
|
Почётный гражданин KAZUS.RU
Регистрация: 20.03.2007
Адрес: "Братское кольцо враждебности", т.е. ближайшее заМКАДье.
Сообщений: 7,072
Сказал спасибо: 3,054
Сказали Спасибо 3,223 раз(а) в 2,188 сообщении(ях)
|
Re: ATMega48 не сохраняется EEPROM
Сообщение от niXto
|
Дурной тон в прерывании писать в ЕЕПРОМ
|
+1
Сообщение от picavr
|
АБСОЛЮТНО ВСЁ пишу в прерываниях таймера...
|
Скорее - "минус 1". Этак можно договориться и до _delay_ms(1000) в прерывании.
|
|
|
|
11.11.2015, 23:35
|
|
Почётный гражданин KAZUS.RU
Регистрация: 02.03.2011
Адрес: Россия, КБР
Сообщений: 629
Сказал спасибо: 108
Сказали Спасибо 596 раз(а) в 334 сообщении(ях)
|
Re: ATMega48 не сохраняется EEPROM
Записывать в EEPROM нужно в прерывании EEPROM...
Что за программатор, устройство питается от него когда он подключен?
И для чего в EEPROM постоянно что-то записывать, как долго устройство должно после "окончательной" прошивки проработать, неделю - две?..
Проверьте, как часто возникает прерывание таймера с/без программатора. Запись в EEPROM должна производиться 1 байт в 5мс (это примерно. время зависит от напряжения питания). Есть ли какой либо WDT, и как он настроен? Ну и т.д. и т.п...
|
|
|
|
11.11.2015, 23:45
|
|
Частый гость
Регистрация: 18.10.2011
Сообщений: 25
Сказал спасибо: 5
Сказали Спасибо 4 раз(а) в 2 сообщении(ях)
|
Re: ATMega48 не сохраняется EEPROM
Напряжение питания на программаторе и в устройстве какое? Ранние ревизии этого чипа (как и 8/88/16 не хотели писать в ЕЕПРОМ при напряжении питания менее 4.6 В.
|
|
|
|
12.11.2015, 00:30
|
|
Заблокирован
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,486
Сказал спасибо: 396
Сказали Спасибо 2,221 раз(а) в 1,319 сообщении(ях)
|
Re: ATMega48 не сохраняется EEPROM
Сообщение от vynt
|
Записывать в EEPROM нужно в прерывании EEPROM...
|
Писать из прерывания можно, но не ждать в нем окончания записи целых 10 мс , когда МК работает на частоте например 20 МГц.
По окончанию записи генерируется прерывание, и вот в нем нужно инициировать следующую запись, проверив, нужно ли и дальше писать еепром.
Сообщение от vynt
|
как долго устройство должно после "окончательной" прошивки проработать, неделю - две?
|
При записи ежедневно 100 раз в день хватит на пару-тройку лет.
Последний раз редактировалось NewWriter; 12.11.2015 в 00:41.
|
|
|
|
12.11.2015, 02:16
|
|
Почётный гражданин KAZUS.RU
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
|
Re: ATMega48 не сохраняется EEPROM
Запись каждого байта EEPROM занимает 8k циклов встроенного RC генератора(читать документацию).
Отсюда и исходите -можно ли в прерывании организовывать запись в EEPROM, или нет.
(подсказка - нельзя)
|
|
|
|
13.11.2015, 10:23
|
|
Гражданин KAZUS.RU
Регистрация: 04.04.2007
Сообщений: 941
Сказал спасибо: 571
Сказали Спасибо 113 раз(а) в 85 сообщении(ях)
|
Re: ATMega48 не сохраняется EEPROM
Нельзя записывать EEPROM еще находясь в предидущем прерывании от этого же EEPROM-а , а во всех остальных прерываниях - можно ,так как запись стартуем битом EEWE(EEPE) (подробности по datasheet-у, после записи он сам сбрасывается аппаратно - тоже по datasheet-у), (при этом еще можно кучу действий делать чтобы не терять 8-10 мс бесполезно пока этот бит сбросится) - так вот - дальше просто ждем пока он сбросится после окончания записи в EEPROM-е, и следовательно само это ожидание (И ВЗВОД ЭТОГО БИТА - что интересно!) можно организовать в любом месте проги, хоть в прерывании, хоть не в прерывании. При этом все равно разрешено само прерывание конкретно от EEPROM-а или нет.
P.S. На время ожидания еще нужно запретить все прерывания так как записываемые данные могут быть искажены в ходе записи в EEPROM если при этом неожиданно возникнут еще какие-либо прерывания, то есть чтобы данные надежно записывались - на это время сбрасывать бит I регистра SREG, ну а после записи - восстанавливать его в исходное. Если в системе по проге точно не ожидается никаких прерываний в это время или хотя бы когда пишем EEPROM - то со сбросом бита I в SREG можно и не заморачиваться.
__________________
Короче асма кода нет !
Последний раз редактировалось pinco; 13.11.2015 в 10:46.
Причина: дополнение
|
|
|
|
13.11.2015, 11:38
|
|
Заблокирован
Регистрация: 22.04.2014
Сообщений: 0
Сказал спасибо: 15
Сказали Спасибо 366 раз(а) в 284 сообщении(ях)
|
Re: ATMega48 не сохраняется EEPROM
Сообщение от pinco
|
во всех остальных прерываниях - можно
|
Сообщение от pinco
|
нужно запретить все прерывания так как записываемые данные могут быть искажены в ходе записи в EEPROM если при этом неожиданно возникнут еще какие-либо прерывания
|
Разрыв шаблона пятой степени!
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 02:14.
|
|