-CodeVisionAVR C Compiler такие команды принимает. -AVRStudio такие команды принимает. -Ардуино тоже должна такие команды принимать.
Запись я делают так: -записываю в буфер. -считаю CRC32 для буфера. -после записи делаю верификацию. -если в процессе записи произошла ошибка то устанавливается флаг "ошибка" и загорается светодиод "ошибка".
Спойлер
Код:
//////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////TX_EEPROM: void TX_EEPROM(void) { /////////////////////////////////////////////// TX: Interrupts: //#asm("sei") // вкл Global Interrupts #asm("cli") // выкл Global Interrupts /////////////////////////////////////////////// сброс флаг error_EEPROM error_EEPROM = 0; /////////////////////////////////////////////// флаг > TX_int TX_int[0] = blok_sys; // blok_sys //-начальное 0. TX_int[1] = Lampa; // Lampa TX_int[2] = 0; // TX_int[3] = slider_5; // Ползунок 5 Температура MAX TX_int[4] = slider_4; // Ползунок 4 Температура MIN TX_int[5] = hour_ON; // часы ON TX_int[6] = min_ON; // минуты ON TX_int[7] = hour_OFF; // часы OFF TX_int[8] = min_OFF; // минуты OFF TX_int[9] = 0; TX_int[10] = 0; TX_int[11] = 0; /////////////////////////////////////////////// crc: //TX_int[12] = 0; //TX_int[13] = 0; //TX_int[14] = 0; //TX_int[15] = 0; /////////////////////////////////////////////// crc буфер EEPROM: TX_len = 16; fcrcTX(); /////////////////////////////////////////////// запись буфер > EEPROM: for (xTX=0; xTX<TX_len; xTX++) { EEAR = xTX; EEDR = TX_int[xTX]; EECR |= 0b00000100; EECR |= 0b00000010; while(EECR & 0b00000010); }; /////////////////////////////////////////////// верификация: (EEPROM == буфер) for (xTX=0; xTX<TX_len; xTX++) { EEAR = xTX; EECR |= 0b00000001; x1TX = EEDR; if ( TX_int[xTX] != x1TX ) {error_EEPROM = 1;}; // флаг error_EEPROM }; /////////////////////////////////////////////// LCD if (error_EEPROM) {PORTD.6=1; PORTD.7=1;} // флаг error_EEPROM else {PORTD.6=0; PORTD.7=0;}; // сброс флаг error_EEPROM /////////////////////////////////////////////// TX: Interrupts: #asm("sei") // вкл Global Interrupts //#asm("cli") // выкл Global Interrupts }; ////////////////////////////////////////////////////////////////////////////////
Чтение я делают так: -читаю в буфер. -считаю CRC32 для буфера. -если в процессе чтения произошла ошибка то устанавливается флаг "ошибка" и загорается светодиод "ошибка".
Спойлер
Код:
//////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////RX_EEPROM: void RX_EEPROM(void) { /////////////////////////////////////////////// TX: Interrupts: //#asm("sei") // вкл Global Interrupts #asm("cli") // выкл Global Interrupts /////////////////////////////////////////////// сброс флаг error_EEPROM error_EEPROM = 0; /////////////////////////////////////////////// чтение EEPROM > буфер: for (xTX=0; xTX<16; xTX++) { EEAR = xTX; EECR |= 0b00000001; TX_int[xTX] = EEDR; }; /////////////////////////////////////////////// crc буфер EEPROM: RX_len = 16; fcrcRX(); /////////////////////////////////////////////// проверка crc: if (crcRX==0) { ////////////////////////////////////////////// TX_int > флаги blok_sys = TX_int[0]; // blok_sys //-начальное 0. Lampa = TX_int[1]; // Lampa // = TX_int[2]; // slider_5 = TX_int[3]; // Ползунок 5 Температура MAX slider_4 = TX_int[4]; // Ползунок 4 Температура MIN hour_ON = TX_int[5]; // часы ON min_ON = TX_int[6]; // минуты ON hour_OFF = TX_int[7]; // часы OFF min_OFF = TX_int[8]; // минуты OFF } /////////////////////////////////////////////// error_crc: else { error_EEPROM = 1; // флаг error_EEPROM }; /////////////////////////////////////////////// LCD if (error_EEPROM) {PORTD.6=1; PORTD.7=1;} // флаг error_EEPROM else {PORTD.6=0; PORTD.7=0;}; // сброс флаг error_EEPROM /////////////////////////////////////////////// TX: Interrupts: #asm("sei") // вкл Global Interrupts //#asm("cli") // выкл Global Interrupts }; ////////////////////////////////////////////////////////////////////////////////
Отключать прерывания не обязательно. При записи МК сам отключает прерывания. Но я отключаю. Чтобы мне ничего не мешало))
Ещё можно добавить шифрование. Чтобы враг не догадался))
Роман, не пудрите человеку мозг. В CVAVR вся работа с ЕЕПРОМ уже встроена. eeprom char hello = 1; //создаём переменную в ЕЕПРОМ, инициализируем 1-цей. hello = 5; //записали новое значение, и т.п. И ни о чём не думаем.
"А если острым? А если в глаз?" (С) Извините, не удержался.
_________________ Репозиторий STM32: https://cloud.mail.ru/public/2i19/Y4w8kKEiZ Актуальность репозитория: 1 сентября 2025 года Если чего-то не хватает с сайта st.com - пишите, докачаю.
Зачем делать, если есть готовое! Другое дело, что это нестандартно. Зато просто. Почему он и нравится начинающим. Для массива есть eeprom_write_block/eeprom_read_block. И не нужно изобретать, а то может получиться "в глаз".
вот тут я согласен. не нужно изобретать... если есть даташит... где производитель МК уже всё написал.
А начинающим я бы порекомендовал читать даташиты и делать как в даташитах. Так любой кто разбирается в МК быстро и просто прочитает ваш код. Если делать не так как в даташите то никто не будет часами сидеть разбираться в вашем коде... что вы там накарябали)) Надо всё делать по стандарту... от производителя.
Потому что каша в программе и, очевидно, в голове! c и d сразу сохраняешь нулевыми и что ты тогда хочешь получить! Код форматируй и вставляй с тегом. Иначе ковыряйся сам.
Какая разница, что первоначально, при включении питания у меня c и d нули. Мне нужно такое состояние на портах D0 и D1 из памяти и при необходимости его менять с записью в еепром. Предложи свой вариант, проверю в железе.
При формировании файла прошивок, флешь нормальная, а еепром какой то кастрированный получается
Так у вас только два байта в еепром.
Alex_ka писал(а):
и программатор подвисает при записи еепром. и это на разных версиях 2.05,3.12, 3.14.
А это уже проблемма, попробуйте стереть еепром. Проверьте ее записав в нее все 0xFF потом все 0х00, потом считайте и проверьте содержимое. Обычно бывает опция стирать еепром при записи.
Alex_ka писал(а):
c_eep=c; d_eep=d;
Вам уже написали, что вы в начале программы перезаписываете значение, это безсмысленно. Логичней считать в переменную значение из еепром с=с_eep;
Да первонально нулям. А потом надо, чтобы от состояния на портах "В", это значения менялось в еепром, в зависимости от портов "В" и потом считывалось из памяти новое значение. Мне нужно первоначально при включении нули.
Да первонально нулям. А потом надо, чтобы от состояния на портах "В", это значения менялось в еепром, в зависимости от портов "В" и потом считывалось из памяти новое значение. Мне нужно первоначально при включении нули.
Записывать ноль в еепром, при старте программы, самое глупое решение. Если в любом случаее затираете значение в еепром, то он вам вообще не нужен, просто храните значение в переменной.
Это кусочек БОЛЬШОЙ программы. А сама программа делает очень странные вещи)) Так сразу не поймешь. Но вопрос был не в этом. А в том что епром не работает. Оно и понятно. Потому что не по даташиту.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения