Eeprom читати і писати

#pragma config XINST = OFF
#pragma config FOSC = HS1
// щоб RC1 працював як треба
#pragma config SOSCSEL = DIG
#pragma config WDTEN = OFF
// захист коду
#pragma config CP0 = ON
#pragma config CP1 = ON
#pragma config CP2 = ON
#pragma config CP3 = ON

unsigned char ee_write (unsigned char adr, unsigned char value) static char CARRY;

EEADRH = 0;
EEADR = adr;
EEDATA = value;

EECON1bits.EEPGD = 0;
EECON1bits.CFGS = 0;
EECON1bits.WREN = 1;
EECON2 = 0x55;
EECON2 = 0xAA;
EECON1bits.WR = 1;
while (EECON1bits.WR); // очікуємо поки завершиться попередній цикл записи

пробував по різному писати, в тому числі і тупо за прикладом з доки на мікроконтролер, але не працює. вірніше працює так:
val = 0xFF;
ee_write (0, val);
val = ee_read (0); - повертає 0xFF

але коли я даю вдруге з терміналкі команду
val = ee_read (0);
то завжди отримую 0.

тобто рид позвращает правду тільки після першого запису (підозрюю що десь залишається значення).

тема напевно проста, але я не наздоганяю де я помилився.

Заздалегідь вдячний за відповідь.

1. наскільки надійна ця EEPROM в мк - бо з 5 прошитих мк, в одному дані не сохраняются- пишеться нормально але посол скидання піталова читається 0.
просто якщо я туди наприклад важливу константу запишу яка потім зіпсується - залізяка в цегла перетвориться.

2. при прошивці з MPLAB.X за допомогою pickit3 - еепрому заповнюється значеннями 0xFF. я не зміг знайти як це прибрати, тобто як сказати программатору щоб еепрому взагалі не чіпати?

1. Надійна, було б навпаки, то використовували щось інше. Десь зустрічав думку, що дані тривалого зберігання потрібно зберігати у FLASH пам'яті, а в EEPROMе відносно швидко мінливі (час напрацювання, журнал помилок, збереження останнього значення перед вимиканням харчування і т.д.). Нібито з часом втрачається заряд і спотворюється вміст пам'яті. Але тоді не стикується параметр 20 років зберігання даних.
2. У HITECH, наприклад, є макрос __EEPROM () для ініціалізації значень EEPROM в вихідному коді.

Спасибі, ваша логіка зрозуміла, але коли 20 років пишеш в одному ключі, то складно перенавчатися тим більше проблеми виникають тільки в C
мене до речі ще напружують такі моменти, коли пишеш
if (a> = 3)
то якось зустрічався що компілятор трактував цей вислів як зрушення, у всякому разі у мене таке враження виникло, тому що переписавши умова код запрацював нормально. тепер я таких порівнянь побоююсь


Зрозуміло трактував як зрушення, якщо було написано if (a >> = 3)
причому зсув до молодших бітів і на 3 біти змінної "a".
Вирази присвоєння допустимі і широко використовуються
в таких конструкціях.
Результат if - це 0 / НЕ 0 змінної "a" (стандартне умова С)
Тут справа не в синтаксисі мови - а в бажанні навчитися.

в загальному не можу зрозуміти в чому косяк, може хто стикався і є секрет?

доповнення:
тільки що розпакував новий адаптер і прошив його - з ним працює все відмінно (Як треба), тобто читається він незалежно від запису в пам'ять.
тобто проблема виникає на адаптерах, які попрацювали деякий час - у мене, той який я протягом півроку постійно перепрошивати і у клієнта який користується ним постійно.
тобто щось відбувається з МК з плином часу що не дає йому коректно зчитувати еепрому.

частково я зрозумів у чому проблема.
виявив що глюк на моєму адаптері (Який постійно прошиваю) виникав коли він отримував живлення від піккіт3. коли я зібрав штатну схему алаптера то все відпрацьовував коректно. Далі виявив що якщо після перепрошивки МК відключити плату від програматора і заново підключити то все знову ж працює коректно. тобто мабуть просто після перепрошивки десь щось не зростається.
залишається одне питання - отримати непрацюючий адаптер у клієнта і погратися з ним, може що вилізе.
в загальному вийшла розмова з самим собою, але такі глюки напевно тільки сам і можеш вирішити (зрозуміти що може впливати)

Схожі статті