Блок с датойБлок с временемБлок с возрастом сайта
Mr.ALB

    Анатолий Беляев (aka Mr.ALB). Персональный сайт

    Да пребудут с вами Силы СВЕТА!

     

    Ардуино (Arduino). #10

    Проверка EEPROM

    Столкнулся с некоторой проблемой – в одной плате Ардуино не все ячейки EEPROM работали на запись, поэтому написал программку, которая проверяет способность микроконтроллера записывать и считывать значения в каждую ячейку EEPROM.

    Собственно программка не большая, всего на 3 кБ. Пользоваться просто: загружаете скетч в ардуинку и включаете монитор серийного порта в среде разработки IDE. На экране вы увидите построчно и последовательно перебор всех ячеек EEPROM, в которые будут записываться случайно выбранное значение и затем оно же будет из ячейки считываться.

    Если записанное и считанное значения совпадают, то переходим к проверке следующей ячейки памяти, а если не совпадают, то программа будет остановлена и на экране будет выведено соответствующее сообщение.

    С помощью этой программки отловил битые ячейки памяти в одной Ардуинке, и перестроил программу для неё так, чтобы не использовать эти неисправные ячейки.

    С тех пор, прежде чем писать отзыв в магазине, все покупаемые платы Ардуино проверяю этой программой, что и вам рекомендую делать.

    Скетч для проверки EEPROM

    Ниже привожу скетч и после него уже архив со скетчем для IDE.

    Весь код подробно закомментирован, с его пониманием, надеюсь, проблем не будет. Можно лишь добавить, что укажите сколько ячеек требуется проверять.

    Для ATMega168 – это 512 ячеек, а для ATMega3281024 ячейки. Соответствующее число передайте значению EEPROM_MAX.

    /*************************************************
     * Проверка работоспособности EEPROM
     * 2019-10-22 Mr.ALB v1
     * 2019-11-19 Mr.ALB v2 Переделка функции fnTxRx
     *  Для вывода сообщений на русском языке в 
     *  Мониторе порта - установите кодировку скетча 
     *  в UTF-8
     *************************************************/
    
    // Подключение библиотеки EEPROM
    #include <EEPROM.h>
    
    //Объём EEPROM
    #define ATmega168 512
    #define ATmega328 1024
    
    // Установите максимальное значение EEPROM
    // уберите комментарий для вашей ATmega
    int EEPROM_max = ATmega168;  // Для ATmega168
    //int EEPROM_max = ATmega328;  // Для ATmega328
    
    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.


    . Mr.ALB
    Предыдущая страница Страница 11 Далее