Проблема при загрузке программы через программатор

Aleksandr1968
Offline
Зарегистрирован: 06.02.2018

Добрый день, уважаемые форумчане. Столкнулся вот с какой проблемой. Написана и отлажена программа термостата.  Программа написана для Нано. Загружается через USB (важно). Программа после запуска сохраняет в постоянной памяти два предустановленных значения : температуру и время. При каждом последующем пуске программа использует эти 2 значения как исходные. Все работает. 

Вот эти 2 строки из кода, которые считывают постоянную память:

EEPROM.get(10,min);

EEPRPM.get(20, temp_control);

Дальше появилась проблема. Стал прошивать программатором USBASP. Мне важно шить именно им. Программа НЕ работает. Опытным путем установил, что если закомментировать эти 2 вышеуказанные строки, то при прошивке программатором программа начинает работать исправно (только вместо значений из памяти берутся нулевые значения). Не могу понять в чем проблема. На сколько я понимаю, при прошивке через программатор стирается загрузчик. 

То есть программа записаннмя через загрузчик работает. Без загрузчика - нет.

Можете подсказать соображения по решению проблемы?  С уважением. 

 

 

b707
Offline
Зарегистрирован: 26.05.2017

полный код выложите

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

Как вы определяете, что она НЕ работает, а не РАБОТАЕТ, но НЕ ТАК?

Aleksandr1968
Offline
Зарегистрирован: 06.02.2018

Используется 2 дисплея (темерпатура и время) и 3 кнопки (+ -  и Старт). Кнопкой старт (короткое нажатие) выбирается дисплей (выбранный дисплей мигает),  Кнопки +/- для установки значения парамертра. Долгое нажатие кнопки Старт - пуск системы. При старте происходит запись установленных значений в посточнную память. При очередном включении системы данные из постоянной памяти сразу выводятся на дисплеи (первонвчально там нули).  Это когда все работает (запись через USB). При записи через программатор дисплеи с нулевыми значениями зажигаются исправно, и дальше уже не получается выбрать дисплей и ввести значение. 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Ошибка в 73 строке

Aleksandr1968
Offline
Зарегистрирован: 06.02.2018

не смешно, код большой.  Прошу идею подсказать

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Aleksandr1968 пишет:

не смешно, код большой.  Прошу идею подсказать

Смишно.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Aleksandr1968 пишет:

EEPROM.get(10,min);

EEPRPM.get(20, temp_control);

Вторая строка непонятно што и откуда читает

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

DetSimen пишет:

Aleksandr1968 пишет:

EEPROM.get(10,min);

EEPRPM.get(20, temp_control);

Вторая строка непонятно што и откуда читает

Чё там непонятного, пакет линуксовый получает

b707
Offline
Зарегистрирован: 26.05.2017

Aleksandr1968 пишет:

не смешно, код большой.  Прошу идею подсказать

идея очень простая - вероятнее всего, если из ЕЕПРОМа читаются нули - у вас что-то в программе крашится. Так если не хотите показывать код - внимательно проверьте, в каких именно кусках кода участвуют значения. читаемые из ЕЕПРОМ.

Только думаю, что код все же придется выложить. Если б вы сами могли найти ошибку - не пришли бы на форум.

Aleksandr1968
Offline
Зарегистрирован: 06.02.2018

Прошу прощенья 

Во второй строке, конечно ошибка,  EEPROM

Aleksandr1968
Offline
Зарегистрирован: 06.02.2018

Спасибо, поковыряю. Но почему при загрузке верез USB все работает

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

Aleksandr1968 пишет:

Во второй строке, конечно ошибка,  EEPROM

А ua6em написал, что в 73 строке. Кому верить??

b707
Offline
Зарегистрирован: 26.05.2017

Aleksandr1968 пишет:

Но почему при загрузке верез USB все работает

а вот не уверен.

проведите такой эксперимент - ничего не трогайте в программе, только поменяйте адреса чтения из ЕЕПРОМ на какие-нибудь левые, например

EEPROM.get(155,min);

EEPRPM.get(232, temp_control);

и залейте через USB

Aleksandr1968
Offline
Зарегистрирован: 06.02.2018

сегодня проверю

 

Aleksandr1968
Offline
Зарегистрирован: 06.02.2018

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

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Aleksandr1968 пишет:

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

Што? Для тупых пропродробнее.

bwn
Offline
Зарегистрирован: 25.08.2014

b707 пишет:

Только думаю, что код все же придется выложить. Если б вы сами могли найти ошибку - не пришли бы на форум.

От себя, клянусь, красть и китайцам продавать не будем.)))

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Jeka_M пишет:

Aleksandr1968 пишет:

Во второй строке, конечно ошибка,  EEPROM

А ua6em написал, что в 73 строке. Кому верить??

Никому верить нельзя, мне можно (с) Мюллер )))

Aleksandr1968
Offline
Зарегистрирован: 06.02.2018

Всем доброго вечера. 

Вот версия программы, имитирующей мою проблему. Светодиод и кнопка. Кропкой можно светодиод включить - выключить, при этом состояние светодиода сохраняется в постоянной памяти. То есть, если светодиод горит, то при выключении и включении контроллера он также загорается. И наоборот.

При загрузке через USB порт Нано все исправно работает. Светодиод от кнопки включается - выключается, состояние в память записывается и считывается.

При загрузке через программатор реакции на кнопку нет, счетодиод сразу горит. Программа не работает.

Перед каждой загрузкой программы запускаю очистку EEPROM.

Aleksandr1968
Offline
Зарегистрирован: 06.02.2018
#include <EEPROM.h>

#define BUTTON_PIN     19
#define LED_PIN        3

boolean buttonWasUp = true;
byte led_state = 0;

void setup()
{
  pinMode(BUTTON_PIN, INPUT_PULLUP);
  pinMode(LED_PIN, OUTPUT);

  led_state = EEPROM.read(100);
}

void loop()
{
  boolean buttonIsUp = digitalRead(BUTTON_PIN);
  if (buttonWasUp && !buttonIsUp)
  {
    delay(10);
    buttonIsUp = digitalRead(BUTTON_PIN);
    if (!buttonIsUp)
    {
      led_state = 1 - led_state;
      EEPROM.write(100, led_state);
    }
  }
  buttonWasUp = buttonIsUp;

  digitalWrite(LED_PIN, led_state);
}

 

Aleksandr1968
Offline
Зарегистрирован: 06.02.2018

Тот же код, только правильно выложил.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

с какого адреса в память и какой бинарник грузите через программатор?

Если средствами IDE то к чему такие извращения?

Aleksandr1968
Offline
Зарегистрирован: 06.02.2018

И еще момент. Если строку 27 закомментировать (чтение из памяти) 

 27    //  EEPROM.write(100, led_state);

То программа будет исправно работать при ее записи как через USB, так и через программатор. Только, естественно, не будет чтения из памяти.

В чем проблема?

 

Aleksandr1968
Offline
Зарегистрирован: 06.02.2018

Программа загружаетсчя из IDE. 

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

Если после 26 строки вывести значение статуса Led - хоть раз при переключении кнопкой ноль будет?

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Понятно! Питалово проверяли?