Внутренний EEPROM UNO "чтение" возвращает неправильные значения, когда он предшествует "записи".

Я преподаватель Arduino и готовил некоторые материалы по использованию внутреннего EEPROM Arduino UNO, когда столкнулся с проблемой. Проблема в том, что я пытаюсь показать исходное значение в определенном месте EEPROM с помощью функции EEPROM.read, затем я записываю новое значение в это место с помощью функции EEPROM.write и пытаюсь прочитать его снова, пожалуйста, взгляните на его код, я использую последовательный монитор для печати этих значений.

#include <EEPROM.h>

void setup() {
  Serial.begin(9600);
  
  // Выведите на последовательный монитор значение, считанное с адреса 20. "Что должно быть 255"
  Serial.println(EEPROM.read(20));  
  // Запишите в EEPROM значение 143 в адресе 20.
  EEPROM.write(20, 143);           
  // Выведите на последовательный монитор значение, считанное с адреса 20. "Что должно быть 143"
  Serial.println(EEPROM.read(20));    
}

void loop() {

}

Теперь я уже проверил, что это местоположение имеет значение 255, используя другой скетч, который в основном ничего не делает, кроме печати содержимого EEPROM на последовательном мониторе.

#include <EEPROM.h>

void setup() {
  Serial.begin(9600);
  
  for(int i = 0; i < 1024;i++)
  {
    Serial.print("Address: ");
    Serial.print(i);
    Serial.print(", Value: ");
    Serial.println(EEPROM.read(i));  
  }
  
}

void loop() {

}

Так в чем же моя проблема? Моя проблема в том, что в моем первом скетче функция EEPROM.read не возвращает 255, вместо этого она возвращает значение 143, которого даже не должно быть до следующей инструкции. Я знаю, что EEPROM.запись занимает около 3,3 мс, и запись-это то, что изнашивает ячейку EEPROM, но я также знаю, что чтение занимает примерно 0 мс и не изнашивает ячейку EEPROM. Несмотря на это, я намеренно поставил "задержку(100)"; после прочтения все еще нет результата.

#include <EEPROM.h>

void setup() {
  Serial.begin(9600);

  // Print to the Serial Monitor the value read from address 20. "Which should be 255"
  Serial.println(EEPROM.read(20));  
  delay(100);
  // Write to the EEPROM the value 143 in address 20.
  EEPROM.write(20, 143);           
  // Print to the Serial Monitor the value read from address 20. "Which should be 143"
  Serial.println(EEPROM.read(20));    
}

void loop() {

}

Более того, когда я полностью удаляю EEPROM.write из кода и использую EEPROM.только для чтения, я считываю правильные результаты, но, конечно, я также меняю адрес, чтобы проверить его.

Моя установка такова: 64-разрядная версия Windows 10 Pro. Arduino IDE 1.8.15 Версия клона Arduino UNO в Китае. (не SMD)

Мой вопрос в том, что я здесь делаю не так? У меня есть неправильное понимание чего-то здесь? Я уже работал с EEPROMs (как внутренними, так и внешними) с использованием микроконтроллеров PIC18F, поэтому мой опыт (который может быть неверным) показывает, что этот скетч должен работать идеально.

Заранее спасибо.

, 👍2

Обсуждение

Попробуйте добавить "задержка(5000);" в начале настройка. Я думаю, что происходит следующее: вы загружаете свой код. После загрузки код будет запущен немедленно. Затем вы открываете последовательную консоль. **Открытие последовательной консоли сбрасывает Arduino**. Итак, теперь код запускается во второй раз и будет отображать уже записанные данные EEPROM., @Gerben

Отличная интерпретация, но поскольку я в этом не новичок, я никогда не закрываю свою последовательную консоль, чтобы не сбрасывать Arduino, она всегда открыта даже перед загрузкой кода, однако я попробовал, и это действительно сработало. Но почему?, @Abd-AlRahman Muhammad

Среда IDE Arduino приостанавливает последовательное соединение во время загрузки, а затем[resumes](https://github.com/arduino/Arduino/blob/c33fb9fde3cdd6c5d6629fa2a672ef19c110902a/app/src/processing/app/Editor.java#L2105) когда закончите. Похоже, они добавили некоторую задержку перед повторным открытием последовательного соединения. Таким образом, похоже, что ваш код будет выполняться дважды, даже если вы держите последовательную консоль открытой., @Gerben

Большое вам спасибо за ваши разъяснения и ваше время., @Abd-AlRahman Muhammad


2 ответа


Лучший ответ:

3

Это НЕ мой ответ, это ответ @Gerben, спасибо.

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

,

@Gerben должен ответить на этот вопрос. Ваша задача-принять его ответ., @SBF

Я согласен, если он опубликует ответ, я обязательно приму его, вот почему я не принял свой ответ., @Abd-AlRahman Muhammad


-1

Согласно документации по адресу:https://www.arduino.cc/en/Ссылка/EEPROMWrite Запись EEPROM занимает 3,3 мс для завершения. Что говорит нам о том, что вы должны дать ему это количество времени или больше, чтобы завершить операцию. Вставьте задержку после "EEPROM.запись(20, 143);" не менее 3,3 мс или delay(3300);. Это должно решить вашу проблему. Вы также можете использовать это, чтобы ваши ученики прочитали руководство. Представить как проблему, чтобы они могли попытаться ее решить. Как только вы попадетесь на это (как и все мы), вы никогда не забудете.

,

Прочитайте вопрос более внимательно. Проблема заключается в том, что "EEPROM.read ()" происходит _без_ " EEPROM.write ()". Добавление задержки _after_ EEPROM.write() ничего не изменит., @Edgar Bonet