Не записывает в ПЗУ

evgenmatrix
Offline
Зарегистрирован: 25.06.2017

Здравствуйте, при данном скетче при смене значения с 1 на 0 не происходить запись в EEPROM. в чем может быть проблемма?

#include <EEPROM.h>
byte i = 0;
int Upin = 6;
int N = 0;
int K = 0;
 
void setup() {
  Serial.begin (9600);
  pinMode (Upin, INPUT);
}
 
void loop() {
  i = i + 1;
  if (i > 254) {
    i = 0;
  }
 
  Serial.println (i);
  N = digitalRead (Upin);
  Serial.println (N);
  if (N = 0) {
    EEPROM.write(0, i);
  }
  Serial.println (EEPROM.read(0));
  delay (1000);
}
 
sadman41
Offline
Зарегистрирован: 19.10.2016

Вставьте код с номерами строк

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

evgenmatrix пишет:

 не происходить запись в EEPROM.

Да, "не происходить".

evgenmatrix пишет:

в чем может быть проблемма?

В том, что Вы её неправильно написали.

1. Всегда вставляйте код как положено, чтобы можно было ссылаться на номера строк.

2. А пока, изучите вот это и посмотрите, что у Вас написано в строке №ХЗ

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Проблемы нет: код работает в точности так, как написан.

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

if (N = 0)

Это - присваивание, а не сравнение ;)

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

DIYMan пишет:

Это - присваивание, а не сравнение ;)

Ну, вот, пришёл поручик Ржевский ....

Уж коль на то пошло,то вывсёврёти и вводите бедного ньюби в заблуждение! Это именно сравнение! Сравнение результата присваивания с нулём!

Ну, надо ж было так всё опошлить! Поручик! :)))) 

sadman41
Offline
Зарегистрирован: 19.10.2016

Скетч, конечно, убийца EEPROM-а.

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Вот он, где поручик-то! Выше постом :) Евгений - я всёго лишь на полшишечки влез, а sadman41 - по самые не балуй засадил :)

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

ЕвгенийП пишет:

Уж коль на то пошло,то вывсёврёти и вводите бедного ньюби в заблуждение! Это именно сравнение! Сравнение результата присваивания с нулём!

Отнюдь.

Здесь две операции: присваивание и проверка истинности.

evgenmatrix
Offline
Зарегистрирован: 25.06.2017

Увидел ошибку Поставил знак соавнения(==). Проблема в следующем, схема прилагается. Если плата подключена по usb, при размыкании тумблера, соответственно при потере питания на 6 пине, происходит запись в пзу, в том цикле, котором пропадает питание. Если отключить usb, то за счёт задержки реле питание пропадает примерно через 2-3 секунды, запись в пзу не происходит.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

evgenmatrix пишет:

Проблема в следующем

Проблема не в этом, а в том, что Вы не читаете, что Вам пишут. Я же Вам писал

ЕвгенийП пишет:

1. Всегда вставляйте код как положено, чтобы можно было ссылаться на номера строк.

Игнорируете? Так и будем переписываться типа "ошибка в строке №ХЗ"? 

evgenmatrix
Offline
Зарегистрирован: 25.06.2017
#include <EEPROM.h>
byte i = 0;
int Upin = 6;
int N = 0;
int K = 0;

void setup() {
  Serial.begin (9600);
  pinMode (Upin, INPUT);
}

void loop() {
  i = i + 1;
  if (i > 254) {
    i = 0;
  }

  Serial.println (i);
  N = digitalRead (Upin);
  Serial.println (N);
  if (N == LOW) {
    EEPROM.write(0, i);
  }
  Serial.println (EEPROM.read(0));
  delay (4000);
}

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Строки 14-16, в принципе можно удалить. Строка 25 обеспечивает эффект задержки реакции на случайное время (до ~4сек).

evgenmatrix
Offline
Зарегистрирован: 25.06.2017

Проблема не в этом

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

evgenmatrix пишет:

Проблема не в этом

Точно. Проблема в !!!! источнике проблем. Если устранить источник проблем, то и проблемы может быть рассосутся или рассосут ;)

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Если у всех получается, а у вас нет - тут два варианта:

1. Сломался аппарат

2. Кривые руки

evgenmatrix
Offline
Зарегистрирован: 25.06.2017

Аппарат работает, но не так как надо, запись происходит, но не так как надо. Руки возможно. Поэтому и прошу помощи. Вообщем задача сделать одометр с сохранением значения. Может кто подскажет как по другому это реализовать

sadman41
Offline
Зарегистрирован: 19.10.2016

Влезу опять с FRAM. Если не получается с EEPROM - берете такую МС и пишете туда значения каждые... сколько метров критично потерять? Вот каждые эти N метров. Пропадание питания стеречь уже не надо. Если правильно организуете процесс, то скорее на пенсию выйдете, чем МС протрете.

strarbit
Offline
Зарегистрирован: 12.06.2016

рекомендация от atmel не применять адрес 0 eeprom, эта 0 память повреждает данные, если питание не стабильно. Также рекомендация, удерживать питание стабильное на время запись в eeprom.

sadman41
Offline
Зарегистрирован: 19.10.2016

Уважаемая strarbit, поделитесь источником информации о повреждении именно нулевой ячейки. Я на этот счет читал только это: https://www.microchip.com/webdoc/AVRLibcReferenceManual/FAQ_1faq_eeprom_corruption.html - тут написано, что в старых поколениях AVR чаще всего повреждалась нулевая ячейка, но не в обязательном порядке. В новых вроде как все пофиксили - монитор питания следит за напряжением.

strarbit
Offline
Зарегистрирован: 12.06.2016

Уважаемый господин sadman41!  имела читать точно 0 адрес eeprom, нет память #  техническое описание какое от atmel. Если это техническое описание вижу, то отправить адрес Вам.

strarbit
Offline
Зарегистрирован: 12.06.2016

в этом doc  - If the reset occurs later in the write process both the requested address and address zero may be corrupted.