не корректная работа attiny13
- Войдите на сайт для отправки комментариев
Пт, 20/11/2020 - 11:35
Приветствую! Есть код, и есть проблема - при первом включении работает правильно,при отключении питания и повторном включении выдает верный сохраненный результат, но стоит нажать на кнопку как весь регистр гаснет! НО продолжает работать счетчик! тоесть - при нажатии на кнопку,засчитывает инкремент но не выдает результат в регистр. выдает же его только при повторном включении. проблема возникает на 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; } }
переменная val у вас байт, попробуйте использовать для записи чтения EEPROM функции write/read вместо put get.
а зачем при отпускании кнопок сбрасываете last_press ?
и так и так пробовал, не фунциклирует. да и в правду зачем))))хах)
мне кажется тут проблемы с подключением... коли индикатор совсем гаснет...
В качестве совсем бредовой идеи - замените первый(нулевой) байт в массиве seq на что-то с выводом на индикатор... может у вас почему-то val сбрасывается на ноль... хотя в коде я не вижу этого
с подключением все в порядке,подобное подключение на нано,работает без нареканий. изменение байта результата не дало.
Тогда надо задуматься, чем отличается тини13 от Нано
код-то в тини13 помещается?
да, и рааботает с описаной ошибкой.
да, и рааботает с описаной ошибкой.
вы излишне лаконичны. Какой размер кода и сколько занято памяти?
В строке 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(). Меньше мусора - меньше точек, которые надо проверять.
=======================
Отнесись внимательно. Так как того, что ты описал происходить не может, то нужно искать хитрую ошибку. Это может быть и монтаж и код, и даже баг в ядре - в какой-то комбинации вызовов.
сколько не жми, ничего не выводит. только после повторного включения выводит (и выводит верно,тоесть если был первый байт,нажал один раз,то выведет второй байт) без чтения еепром работает. монтаж множество раз проверен, из разу в раз то тот же результат.
Если без епром работает, попробуй запись в епром делать после вывода
безуспешно
сорян, отходил.
теперь без еепрома попробуй менять индикатор по кнопкам, то есть всё тоже, но без записи в еепром и без чтения в сетапе.
=======================
Ой! Блин! Я и не приметил!
в строках отпускания кнопки 70 и 75 - УБЕРИ все условия в if, кроме bt... == 0 !
Да,спасибо это уже убрал. но сути проблемы все же не меняет
Чет Вы перемудрили с кнопками. А можно нормальным языком написать чего хотите?
я же описал проблему. хочу чтоб работало)))) кнопки уже подправил.
я же описал проблему. хочу чтоб работало)))) кнопки уже подправил.
Понимаете, Вы описали проблему, а не алгоритм. Что Вы хотели получить от программы я, если честно, не понял. Возможно тупой. Ваши миллис мне не понятны, идея с больше - меньше 5 тоже. Алгоритм бы нормальный, а там можно и посмотреть.
И еще - хорошая программа читается "влет"
алгоритм таков : листать байты вперед/назад, листать по кругу в любую сторону,выводить в регистр.текущий байт записывать в еепром, чтоб вернуться к нему при след включении.