не корректная работа attiny13

breambream
Offline
Зарегистрирован: 19.11.2020

Приветствую! Есть код, и есть проблема - при первом включении работает правильно,при отключении питания и повторном включении выдает верный сохраненный результат, но стоит нажать на кнопку как весь регистр гаснет! НО продолжает работать счетчик! тоесть - при нажатии на кнопку,засчитывает инкремент но не выдает результат в регистр. выдает же его только при повторном включении. проблема возникает на attiny 13, ядро MicroCore  https://github.com/MCUdude/MicroCore , но на той же нано например работает верно. прошу вашей помощи. 

#include <EEPROM.h>
byte addr = 0;

bool flag1 = 0;
bool flag2 = 0;
bool bt1 ;
bool bt2;

byte val = 0 ;
byte oldval ;
byte newval ;

byte seq[] = {  

  B00000000,   
  B10000000,
  B01000001,
  B00100010,
  B00010011,
  B00001100,
};


unsigned long last_press;

#define b1 PB3   //pb3  5
#define b2 PB4   //pb4  6 
#define clk PB0   //pb0  4 
#define lat PB1   //pb1  3 
#define ser PB2   //pb2  2


void setup() {



  pinMode(b1, INPUT_PULLUP);
  pinMode(b2, INPUT_PULLUP);
  pinMode(clk, OUTPUT);
  pinMode(lat, OUTPUT);
  pinMode(ser, OUTPUT);

  EEPROM.get(addr, val);


  digitalWrite(lat, LOW);
  shiftOut(ser, clk, LSBFIRST, seq[val]);
  digitalWrite(lat, HIGH);
}

void loop() {



  bt1 = !digitalRead(b1);
  bt2 = !digitalRead(b2);

  if (bt1 == 1 && flag1 == 0 && millis() - last_press > 50) {
    val ++;
    flag1 = 1;
    last_press = millis();
  }

  if (bt2 == 1 && flag2 == 0 && millis() - last_press > 50) {
    val --;
    flag2 = 1;
    last_press = millis();
  }

  if (bt1 == 0 && flag1 == 1 && millis() - last_press > 50) {
    flag1 = 0;
    last_press = millis();
  }

  if (bt2 == 0 && flag2 == 1 && millis() - last_press > 50) {
    flag2 = 0;
    last_press = millis();
  }

  if (val < 1) {
    val = 5;
  }

  if (val > 5) {
    val = 1;
  }


  newval = val;

  if (newval != oldval) {

    EEPROM.put (addr, val);

    digitalWrite(lat, LOW);
    shiftOut(ser, clk, LSBFIRST, seq[val]);
    digitalWrite(lat, HIGH);

    oldval = newval;

  }



}

 

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

переменная val у вас байт, попробуйте использовать для записи чтения EEPROM функции write/read вместо put get.

а зачем при отпускании кнопок сбрасываете last_press ?

breambream
Offline
Зарегистрирован: 19.11.2020

и так и так пробовал, не фунциклирует. да и в правду зачем))))хах)

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

мне кажется тут проблемы с подключением... коли индикатор совсем гаснет...

В качестве совсем бредовой идеи - замените первый(нулевой) байт в массиве seq на что-то с выводом на индикатор... может у вас почему-то val сбрасывается на ноль... хотя в коде я не вижу этого

breambream
Offline
Зарегистрирован: 19.11.2020

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

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

Тогда надо задуматься, чем отличается тини13 от Нано

 код-то в тини13 помещается?

breambream
Offline
Зарегистрирован: 19.11.2020

да, и рааботает с описаной ошибкой.

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

breambream пишет:

да, и рааботает с описаной ошибкой.

вы излишне лаконичны. Какой размер кода и сколько занято памяти?

breambream
Offline
Зарегистрирован: 19.11.2020
Скетч использует 700 байт (68%) памяти устройства. Всего доступно 1024 байт.
Глобальные переменные используют 22 байт (34%) динамической памяти, оставляя 42 байт для локальных переменных. Максимум: 64 байт.
 
wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

В строке 9 val прсваивается 0. В строке 11 newval - по умолчанию тоже инициализируется 0.

При первом проходе после включения кнопки еще не нажаты и выполняется в loop строка 80-81 и val  становится 5. Цикл выполняется до конца и newval тоже становится 5. При нажатии на кнопку инкремент делает val  равным 6 и строки 84-85 превращают его в 1.

Далее цикл - до конца. На индикаторе - то, что соответствует 1.

ТС - попробуй понажимать кнопки несколько раз и посмотри что будет на индикаторе.

Еще один важный опыт - без чтения еепром - проверь саму работу шифтаута и индикатора просто в цикле от 1 до 5 с delay().

И еще - по любому убери библиотеку еепром. Воспользуйся "встроенными" eeprom_read_byte() и eeprom_write_byte(). Меньше мусора - меньше точек, которые надо проверять.

=======================

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

breambream
Offline
Зарегистрирован: 19.11.2020

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

nik182
Offline
Зарегистрирован: 04.05.2015

Если без епром  работает, попробуй запись в епром делать после вывода 

breambream
Offline
Зарегистрирован: 19.11.2020

безуспешно

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

сорян, отходил.

теперь без еепрома попробуй менять индикатор по кнопкам, то есть всё тоже, но без записи в еепром и без чтения в сетапе.

=======================

Ой! Блин! Я и не приметил!

в строках отпускания кнопки 70 и 75 - УБЕРИ все условия в if, кроме bt... == 0    !

breambream
Offline
Зарегистрирован: 19.11.2020

Да,спасибо это уже убрал. но сути проблемы все же не меняет

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

Чет Вы перемудрили с кнопками. А можно нормальным языком написать чего хотите?

breambream
Offline
Зарегистрирован: 19.11.2020

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

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

breambream пишет:

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

Понимаете, Вы описали проблему, а не алгоритм. Что Вы хотели получить от программы я, если честно, не понял. Возможно тупой. Ваши миллис мне не понятны, идея с больше - меньше 5 тоже. Алгоритм бы нормальный, а там можно и посмотреть.

И еще - хорошая программа читается "влет"

breambream
Offline
Зарегистрирован: 19.11.2020

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