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

 
 
> Проблема с чтением EEPROM в MEGA32
masterpc
сообщение Jul 22 2008, 07:24
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 124
Регистрация: 1-03-07
Из: Винница
Пользователь №: 25 788



Привожу кусок кода:
Код
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 без всяких проблем, только функции чтения/записи немного другие, но тоже из даташита.
Заранее спасибо!
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 4)
Flasher
сообщение Jul 22 2008, 07:41
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 374
Регистрация: 6-09-05
Из: Тирасполь, Приднестровье
Пользователь №: 8 294



while(EECR & (1<<EEWE))
// Set up address register
Гы... после while должна быть точка с запятой
Go to the top of the page
 
+Quote Post
masterpc
сообщение Jul 22 2008, 07:45
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 124
Регистрация: 1-03-07
Из: Винница
Пользователь №: 25 788



Цитата(Flasher @ Jul 22 2008, 10:41) *
while(EECR & (1<<EEWE))
// Set up address register
Гы... после while должна быть точка с запятой


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

Огромное спасибо! beer.gif
Go to the top of the page
 
+Quote Post
Flasher
сообщение Jul 22 2008, 07:52
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 374
Регистрация: 6-09-05
Из: Тирасполь, Приднестровье
Пользователь №: 8 294



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

Кстати, и в операции записи тоже... поставить ;
Go to the top of the page
 
+Quote Post
masterpc
сообщение Jul 22 2008, 08:15
Сообщение #5


Частый гость
**

Группа: Участник
Сообщений: 124
Регистрация: 1-03-07
Из: Винница
Пользователь №: 25 788



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

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


Ага, тоже поставил, спасибо!!!
Go to the top of the page
 
+Quote Post

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

 


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


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