Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Проблема с чтением EEPROM в MEGA32
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему
masterpc
Привожу кусок кода:
Код
union {
       int ival;  
       unsigned int uival;      
       byte bval[2];
      }tp;


    
        tp.uival = 812;
        WriteByteToEEPROM(400, tp.bval[0]);  
        WriteByteToEEPROM(401, tp.bval[1]);  


        tp.bval[0]=ReadByteFromEEPROM(400);
        tp.bval[1]=ReadByteFromEEPROM(401);                  
        Out_digit_LCD(1,1,(tp.ival)*10,0,8);

Проблема в том, что я читаю либо два раза подряд младший байт, либо два раза подряд старший, хотя при считывании EEPROM с процика в ячейках лежит то, что нужно. Видимо проблема с чтением, но я не смог понять в чем именно. Даже если я писал просто два байта подряд, а потом их считывал, то получал либо первый байт два раза либо второй.
Код
        WriteByteToEEPROM(400, 12);  
        WriteByteToEEPROM(401, 78);

        Out_digit_LCD(1,1,(ReadByteFromEEPROM(400))*10,0,8);  
        Out_digit_LCD(2,1,(ReadByteFromEEPROM(401))*10,0,8);

вот ф-и чтения/записи, азял из даташита на мегу32
Код
void WriteByteToEEPROM(int Address, byte Data)
{
    // Wait for completion of previous write
    while(EECR & (1<<EEWE))
    // Set up address and Data Registers
    DisableInterrupts();
    EEAR = Address;
    EEDR = Data;
    /* Write logical one to EEMWE */
    EECR |= (1<<EEMWE);
   /* Start eeprom write by setting EEWE */
    EECR |= (1<<EEWE);
    EnableInterrupts();    
}


byte ReadByteFromEEPROM(int Address)
{
    /* Wait for completion of previous write */
    while(EECR & (1<<EEWE))
    // Set up address register
    EEAR = Address;
    /* Start eeprom read by writing EERE */
    EECR |= (1<<EERE);
    // Return data from Data Register
    return EEDR;
}

Уже не знаю, тчо делать, подобный код работает на меге 88 без всяких проблем, только функции чтения/записи немного другие, но тоже из даташита.
Заранее спасибо!
Flasher
while(EECR & (1<<EEWE))
// Set up address register
Гы... после while должна быть точка с запятой
masterpc
Цитата(Flasher @ Jul 22 2008, 10:41) *
while(EECR & (1<<EEWE))
// Set up address register
Гы... после while должна быть точка с запятой


Я чуть со стула не упал!!! Работает сволочь! А я ступил конкрентно.

Огромное спасибо! beer.gif
Flasher
В функции чтения так как операция записи уже была закончена, проскакивала модификация адресного регистра во второй раз.

Кстати, и в операции записи тоже... поставить ;
masterpc
Цитата(Flasher @ Jul 22 2008, 10:52) *
В функции чтения так как операция записи уже была закончена, проскакивала модификация адресного регистра во второй раз.

Кстати, и в операции записи тоже... поставить ;


Ага, тоже поставил, спасибо!!!
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.