Столкнулся с некоторой проблемой – в одной плате Ардуино не все ячейки EEPROM работали на запись, поэтому написал программку, которая проверяет способность микроконтроллера записывать и считывать значения в каждую ячейку EEPROM.
Собственно программка не большая, всего на 3 кБ. Пользоваться просто: загружаете скетч в ардуинку и включаете монитор серийного порта в среде разработки IDE. На экране вы увидите построчно и последовательно перебор всех ячеек EEPROM, в которые будут записываться случайно выбранное значение и затем оно же будет из ячейки считываться.
Если записанное и считанное значения совпадают, то переходим к проверке следующей ячейки памяти, а если не совпадают, то программа будет остановлена и на экране будет выведено соответствующее сообщение.
С помощью этой программки отловил битые
ячейки памяти в одной Ардуинке, и перестроил программу для неё так, чтобы не использовать эти неисправные ячейки.
С тех пор, прежде чем писать отзыв в магазине, все покупаемые платы Ардуино проверяю этой программой, что и вам рекомендую делать.
Ниже привожу скетч и после него уже архив со скетчем для IDE.
Весь код подробно закомментирован, с его пониманием, надеюсь, проблем не будет. Можно лишь добавить, что укажите сколько ячеек требуется проверять.
Для ATMega168 – это 512 ячеек, для ATMega328 – 1024 ячейки, а для ATMega2560 – 4096 ячейки. Соответствующее число передайте значению EEPROM_MAX.
/************************************************* * Проверка работоспособности EEPROM * 2019-10-22 Mr.ALB v1 * 2019-11-19 Mr.ALB v2 Переделка функции fnTxRx * Для вывода сообщений на русском языке в * Мониторе порта - установите кодировку скетча * в UTF-8 * 2020-03-23 Mr.ALB v2.1 Добавил для ATMega2560 *************************************************/ // Подключение библиотеки EEPROM #include <EEPROM.h> //Объём EEPROM #define ATmega168 512 #define ATmega328 1024 #define ATmega2560 4096 // Установите максимальное значение EEPROM // уберите комментарий для вашей ATmega int EEPROM_max = ATmega168; // Для ATmega168 //int EEPROM_max = ATmega328; // Для ATmega328 //int EEPROM_max = ATmega2560; // Для ATmega2560 byte val, val_rx; void setup() { //Установка начала псевдослучайного числа randomSeed(analogRead(1)); // Инициализация порта для монитора Serial.begin(9600); while(!Serial); } void loop() { // Перебор всех ячеек EEPROM в цикле for(int i=0;i<EEPROM_max;i++) { val=random(0,256); // Случайное число // Записываем val и считываем val_rx по адресу i val_rx=fnTxRx(i,val); if(val!=val_rx) {// Если записанное число не совпадает со считанным Serial.print("\t"); Serial.println("Не совпадает!"); // Сообщение while(1); // Остановка программы в безконечном цикле } else Serial.println(); // Иначе переход на следующую строку delay(5); } // Вывод сообщения о результате проверки Serial.println(); Serial.println("Версия программы v2"); Serial.println("Проверка EEPROM завершена."); Serial.println("Считанные значения совпадают с записанными."); Serial.println(); Serial.println("Через 10 секунд EEPROM будет очищена."); delay(10000); // Задержка 10 секунд /* Очистка EEPROM * записываем в ячейки 0 */ Serial.println(); Serial.println("Очистка EEPROM"); for(int i=0;i<EEPROM_max;i++) { val=0; // Записываем val и считываем val_rx по адресу i val_rx=fnTxRx(i,val); Serial.println(); } Serial.println(); Serial.println("Очистка EEPROM завершена."); while(1); // Остановка программы в безконечном цикле } /* Функция записи и считывания числа в и из EEPROM */ byte fnTxRx(int i, byte v) { byte v_rx; Serial.print(i); Serial.print("\t"); EEPROM.write(i, v); // Записываем число в EEPROM Serial.print("записано: "); Serial.print(v); // Выводим записанное число Serial.print("\t"); v_rx=EEPROM.read(i); // Считываем записанное число из ячейки Serial.print("считано: "); Serial.print(v_rx,DEC); // Выводим десятичное значение return v_rx; }
Скетч можно скачать тут: eeprom_test.zip
Небольшое замечание: если у вас в Мониторе порта вместо русских букв выводятся разные крякозябры, то скорее всего ваш скетч имеет кодировку не UTF-8, а WINDOWS-1251 или какую-то другую. Запишите скетч в кодировке UTF-8.