Официальный сайт компании Arduino по адресу arduino.cc
ATtiny85 и работа с EEPROM
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Имеется скромный проект из данного МК и набора из шести светодиодов WS2812, которыми он управляет. Это подсветка. Режимов у подсветки целый набор. В один прекрасный вечер решил, что информацию о режиме подсветки будет удобнее хранить в ПЗУ, чтобы каждый раз при выкл/вкл подстветка продолжала работать в том режиме, когда отрубили питание.
Написал код. Проверил на макете с Attiny85. Вроде все ок. Но вот при работе в реальных условиях режим часто либо не восстанавливается (леды не горят и нет реакции на нажатие кнопки), либо режим перескакивает на другой (чаще +1, но бывает и больше).
Спасает обнуление ЕЕПРОМа и запись прошивки по новой, но чтобы с этим не мучится в сетап добавил пару строк:
if (EEPROM.read(addr) > NUM_PATTERNS || EEPROM.read(addr) < 0) { EEPROM.write(addr,0); }
В loop у меня сидит функция startShow (EEPROM.read(addr)), которая на основе прочитанного из addr зажигает тот или иной режим подсветки, которых от 0 до 14 (NUM_PATTERNS). 0 - выкл.
Для каждого режима подсветки написана отдельная функция. В каждой из них обрабатывается нажатие кнопки, которая перебирает режимы от 0 до 14. Нажатие кнопки также сидит в своей функции. Вот она:
boolean chkBtn(int buttonState) { if (buttonState == HIGH && (millis() - mark) > BTN_DELAY) { mark = millis(); pattern = EEPROM.read(addr); pattern++; if (pattern > NUM_PATTERNS) {pattern = 0;} EEPROM.write(addr, pattern); return true; } else { return false; } }
Здесь она соответственно считывает из ЕЕПРОМа данные о режиме, записывает их во временную переменную pattern (тип byte), прибавляет к ней единичку, проверяет не вылетели ли мы за пределы, а если да то начинаем отсчет с начала, если ок, то записываем переменную в ЕЕПРОМ.
При изучении глюка выяснилось, что на макетке тоже не все так радостно. В лучшем случае режим работы подсветки работал (корректно восстанавливался) 5 раз из 10 включений.
Однако если залить эту самую прошивку в Atmega328 (Arduino NANO) глюка нет. Чую что не правильно работаю с ЕЕПРОМом (юзаю стандартную библиотеку из Arduino IDE), глюк в прошивке. Правда есть одно но. Тини работает в очень скромной "обвязке" - 2 кондера по питанию 0,1мкф, 100мкф и все. А Atmega328 располагается на нашпигованой плате.
Помогите советом...
1. Код надо приводить полностью. Например, мне кажется, у Вас ошибка в строке №6, но по этому куску уверенно не скажешь.
2. Как установлен фьюз EESAVE?
Большое спасибо за мысль с фьюзом. Как он стоит сейчас не вспомню, но как только будет возможность проверью и отпишусь. Сответственно тогда и скину код.
и никада не пиши в AVR EEPROM ничего значимого с адреса 0, протухает время от времени. Пиши начиная хотя бы с 0x10.
и никада не пиши в AVR EEPROM ничего значимого с адреса 0, протухает время от времени. Пиши начиная хотя бы с 0x10.
Семён, развенчание этих сказок Atmel уже даже в FAQ вынес. Пишут, что была проблема, когда при внезапном отключении питания нулевая ячейка не успевала записаться. Но ее давно уже пофиксили, ввели в чип мониторы напряжения или типа того.
тем не менее. я всего с одной Nanoй абжогса полтора года назад еще, дак теперь не только с 0х10 пишу, а еще и контрольную сумму считаю при старте.
ее давно уже пофиксили
Это микрочип пофиксил, а Вы уверены, что то, что мы закупаем в Поднебесной имеет отношение к микрочип?
Спасибо за совет. Тоже попробую.
ее давно уже пофиксили
Это микрочип пофиксил, а Вы уверены, что то, что мы закупаем в Поднебесной имеет отношение к микрочип?
Справки я не выдаю, рентгеном все чипы не просвечиваю. О чем прочитал - тем поделился.
ее давно уже пофиксили
Это микрочип пофиксил, а Вы уверены, что то, что мы закупаем в Поднебесной имеет отношение к микрочип?
я уверен - лично вам продают палёные контроллеры и палёную водку.
палёную водку.
Ты ошибся, родной, он водку не покупает. Ему продают палёный боярышник.
это мне всё паленое продають.
Как и обещал привожу код ниже целиком:
А вот по поводу фьюзов конфуз. Я вообще их не выставлял и как они должны быть выставлены не знаю. Если можно как-то выставить конкретный фьюз то как это сделать через тот же Ардуино ИДЕ например?
В Ардуино ИДЕ чтобы прошить ATtiny85 я выставляю настройки через меню следующим образом
И как Вы её прошиваете?
Давайте так, Вы не тяните кота за хвост, а расскажит епоностью.
1. Что за 85-ая? На какой плате? на самопальной или покупной? Если ли на плате кварц? Какой?
2. Как Вы её прошиваете? Командой "пршить через программатор" или у Вас там на плате FTDI имеется? Если через программатор, что какой?
Тогда я сомогу ответить про фьюзы и всё остальное. Потому как, если кварца нет, то 16МГц явно много. Должно быть 8 или 1 в зависимости от фьюзов. Ну и много всего - давайте информацию.
Извините, что не предоставил информацию заранее
Это ATTINY85-20SU SOIC8
Шью из Arduino IDE через Arduino NANO, который заранее прошил скетчем ArduinoISP из готовых примеров. Шью на обычной борде вот в таком виде только без светодиода с резистором
В готовом проекте кварц не использую
Для работы с Тини тянул библиотеки отсюда https://github.com/SpenceKonde/ATTinyCore
Значит 16МГц - ТОЧНО мимо. Пробуйте 8, но чтобы гоаорить точно ... можете зайти в меню "Файл|настройки", Включить там подробный вывод загрузки и скопипастить сюда всё, что выдаётся во время загрузки?
Я может че не знаю, но уже штук несколько программировал at85 там же просто выбирается в arduino ide нужный МК и жмется пункт записать загрузчик - ставиться нужная частота - нет?
И кстати attiny при 3 вольтах питания работает только при частоте 1 МГц
Я не знаю, я ни разу не прошивал через ардуино.
Но точно я знаю, что
1. 16МГц (как стоит у ТС) без кварца невозможно
2. Если стоит 16МГц, а реально там 1 или 8, то всё, что связано со временем (millis, delay и т.п.) будет врать
Вот и пытаюсь узнать какие там у ТС фьюзы.
1. 16МГц (как стоит у ТС) без кварца невозможно
ATtiny85 на частоте 16 МГц с использованием PLL должен работать нормально при напряжении питания более 3,3В.
1. 16МГц (как стоит у ТС) без кварца невозможно
ATtiny85 на частоте 16 МГц с использованием PLL должен работать нормально при напряжении питания более 3,3В.
Должен? Сами пробовали?
1. 16МГц (как стоит у ТС) без кварца невозможно
ATtiny85 на частоте 16 МГц с использованием PLL должен работать нормально при напряжении питания более 3,3В.
Нормально работает - интервалы соответствуют установленным.Работает от 5ти вольт. Что еще проверить ?Иде 1.8.5 , AttinyCore из ссылки ТС
1. 16МГц (как стоит у ТС) без кварца невозможно
ATtiny85 на частоте 16 МГц с использованием PLL должен работать нормально при напряжении питания более 3,3В.
Нормально работает - интервалы соответствуют установленным.Работает от 5ти вольт. Что еще проверить ?Иде 1.8.5 , AttinyCore из ссылки ТС
Я извиняюсь но вопрос был про 16 МГц и 3 вольта, а вы пишите что работает при 5 вольт .
Впрочем не важно, пока сами на грабли не наступил это все теория.
И вообще тема про eeprom - давайте придерживаться
Я извиняюсь но вопрос был про 16 МГц и 3 вольта,
Где вопрос про 16Мгц и 3 вольта? Евгений спрашивал про возможность работы от внутреннего на 16Мгц. Вот я и ответил и проверил. А на 3,3 вольта если кому и надо - пусть проверяют.Хотя сейчас гляну...
Работает и на 3.3вольта. Но надо проверять на стабильность.
Спасибо.