Показать сообщение отдельно
Старый 05.07.2015, 19:34   #41
Руслан
Senior Member
 
Регистрация: 26.05.2015
Возраст: 43
Сообщений: 283
Вес репутации: 98/0
Руслан will become famous soon enough
По умолчанию Re: датчик ds18b20

хочу установленную (контрольную) пользователем температуру записывать в EEPROM чтоб при выключении-включении прибора считывать установки из EEPROM.

Написал функции чтения и записи в EEPROM.

Если я по адресу 0x00 записываю значение 0xAA и ТУТ-ЖЕ его читаю с проверкой правильности (т.е. проверяю чтоб прочиталось 0xAA) то успешно чтение.


Я решил проверить чтение после выключения питания таким образом:
1) читаю данные с проверкой, что прочиталось 0xAA - ошибка т.к. ещё не было записано ничего - это ожидаемо
2) записываю 0xAA
3) выключаю питание и включаю - и срабатывает пункт 1) т.е. должно прочитаться то что было записано в п.2). Однако проверка того, что считанное значение равно 0xAA НЕ успешная.

Код:
void test_EEPROM2() //тест с откл. питания
{
    unsigned char uc_address;
    unsigned char uc_data_wr;
    unsigned char uc_data_rd;
    
    uc_address = 0x00;
    
//-------------------------------------------
    //1) прочитать
    uc_data_rd = 0;
    uc_data_rd = ee_read(uc_address);
    
    if (uc_data_rd == 0xAA) //проверка правильных данных при чтении
    {
     MYPIN1=1;//вкл.светодиод
    }


    //-----------------------------------------------
    uc_data_wr = 0xAA;    
    // 2) записать
    ee_write(uc_address, uc_data_wr);
    
     MYPIN3=1;//вкл.светодиод
}
Приложу на всяк случай сами функции чтения и записи:

Код:
unsigned char ee_read(unsigned char address)
{
                            //while(WR) continue;     //  пока идёт цикл записи, читать из EEPROM нельзя!
 EEADR=address;   //  адрес считываемого регистра
                            //SetBit(EECON1,0);       //  разрешаем чтение
 EEPGD=0;         //bcf EECON1, EEPGD ; выбрать EEPROM память данных
 RD=1;            //bsf EECON1, RD;  чтение
 return EEDATA;
}

//////////////////////////////////////////////////////////

void ee_write(unsigned char address, unsigned char data)
{
                            //while(WR) continue;     //  ожидаем пока завершится предыдущий цикл записи
EEADR=address;          //  адрес
EEDATA=data;            //  данные

EEPGD=0;         //bcf EECON1, EEPGD ; выбрать EEPROM память данных
WREN=1;          //разрешить запись
GIE=0;           //запретить прерывания

EECON2=0x55;  //  обязательная последовательность
EECON2=0xAA;
WR=1;         // bsf EECON1, WR; установить бит WR для начала записи

//GIE=1;           //разрешить прерывания
//asm("SLEEP");          

while(WR==1);//пока не станет 0 т.е. цикл записи завершён

WREN=0;          //запретить запись
}
А вот эта функция работает успешно:

Код:
void test_EEPROM()
{
    unsigned char uc_address;
    unsigned char uc_data_wr;
    unsigned char uc_data_rd;
    
    uc_address = 0x00;
    uc_data_wr = 0xAA;
    
     MYPIN0=1; //вкл.светодиод
    //-----------------------------------------------
    
    //записать
    ee_write(uc_address, uc_data_wr);
    
     MYPIN3=1;//вкл.светодиод
    
    //-----------------------------------------------
    
    //прочитать
    uc_data_rd = 0;
    uc_data_rd = ee_read(uc_address);
    
     MYPIN2=1;//вкл.светодиод
    
    if (uc_data_rd == uc_data_wr) //проверка правильных данных при чтении
    {
     MYPIN1=1;//вкл.светодиод
    }
}
Подскажите, пожалуйста, почему в функции test_EEPROM2() в пункте 1) чтение не верное т.е. 0xAA не читается, хотя 0xAA было записано перед выключением контроллера PIC18F452?

Заранее благодарю!
Руслан вне форума   Ответить с цитированием