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

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

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

     

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

    Проверка EEPROM

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

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

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

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

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

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

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

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

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

    /******************************************************
     * 2019-10-22 Mr.ALB 
     * Проверка работоспособности EEPROM 
     * 
     * Скетч использует 3016 байт (21%) памяти устройства 
     ******************************************************/
    
    #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);  // Случайное число
        fnTxRx(i); // Записываем и считываем val по адресу i
        
        if(val != val_rx)
        {// Если записанное число не совпадает со считанным  
          Serial.print("\t");
          Serial.println("Не совпадает!"); // Сообщение
          while(1); // Остановка программы в безконечном цикле
        }
        // Иначе переход на следующую строку
        else Serial.println(); 
        delay(5);   
      }
      
      // Вывод сообщения о результате проверки
      Serial.println();
      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;
        fnTxRx(i);  // Записываем и считываем val по адресу i
      }
      Serial.println();
      Serial.println("Очистка EEPROM завершена.");
      while(1); // Остановка программы в безконечном цикле
    }
    
    /* Функция записи и считывания числа в и из EEPROM */
    void fnTxRx(int i)
    {
      int val_rx;
      Serial.print(i);
      Serial.print("\t");
     
      // Записываем число в EEPROM
      EEPROM.write(i, val); 
      Serial.print("записано: ");
     
      // Выводим записанное число
      Serial.print(val); 
      Serial.print("\t");
    
      // Считываем записанное число из ячейки
      val_rx=EEPROM.read(i); 
      Serial.print("считано: ");
     
      // Выводим десятичное значение
      Serial.print(val_rx,DEC); 
    }
    

    Скетч можно скачать тут: eeprom_test.zip


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