реклама на сайте
подробности

 
 
> Кто использовал EEPROM AVR, подскажите что не так?
Sirko
сообщение Feb 5 2009, 15:01
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 245
Регистрация: 15-08-07
Пользователь №: 29 795



Не получается сохранить данные в EEPROM ATMega8515.

Упростил код до минимума

Код
[font="Courier New"]int main(void){
     u08 eeData = 0x22;
     u16 eeAddr = 20;
     while(EECR & _BV(EEWE));       //    Ждать завершения предыдущей записи
     EEAR = (eeAddr & 0x01ff);      //    Проинициализировать регистр адреса
     EEDR = eeData;
     EECR |= _BV(EEMWE);            //    Установить флаг EEMWE
     EECR |= _BV(EEWE);             //    Начать запись в EEPROM

     while(EECR & _BV(EEWE));       //    Ждать завершения предыдущей записи
//   EEAR = 0;                      //    Сбросить адрес EEPEROM в "0"

     while(EECR & _BV(EEWE));       //    Ждать завершения предыдущей записи
     EEAR = (eeAddr & 0x01ff);      //    Проинициализировать регистр адреса
     EECR |= _BV(EERE);             //    Выполнить чтение
     eeData = EEDR;

     while(EECR & _BV(EEWE));       //    Ждать завершения предыдущей записи
//   EEAR = 0;                      //    Сбросить адрес EEPEROM в "0"[/font]

и тем не менее на выходе 0xFF.
Потратил много времени на поиск причины, но где ошибка, так и не понял. unsure.gif
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
haker_fox
сообщение Feb 5 2009, 16:42
Сообщение #2


Познающий...
******

Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125



Вот точно рабочий код (ATmega168). На классы можно внимания не обращать.
Код
uint8_t TEEPROM::writeU8(uint16_t addr, uint8_t a)
{
    while(EECR & (1 << EEPE));
    EEAR = addr;
    EEDR = a;
        
        // тут очень желательно запретить все прерывания
    EECR|= (1 << EEMPE);
    EECR|= (1 << EEPE);
        // а тут их снова можно включить

    return EEPROM_OK_RESULT;
}

uint8_t TEEPROM::readU8(uint16_t addr)
{
    while(EECR & (1 << EEPE));
    EEAR = addr;
    EECR|= (1 << EERE);
    return EEDR;
}


Причины неработоспособности Вашего кода на первый взгляд, увы, не вижу... Вот только _BV не нравится мне... И зачем адрес умножать на 0x1ff?


--------------------
Выбор.
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 13th August 2025 - 08:55
Рейтинг@Mail.ru


Страница сгенерированна за 0.0297 секунд с 7
ELECTRONIX ©2004-2016