Страница 1 из 1

Фонарик на Attiny13 не работает

Добавлено: Вт ноя 17, 2015 22:19:36
Санябик
Заинтересовался программированием микроконтроллеров, нацарапал фонарик.
Задумка такая:
одинарное нажатие = включение\отключение с сохранением режима яркости,
двойное нажатие = смена режима яркости.
АЦП хочу использовать для стабилизации тока\напряжения.
Но тут проблема: в Протеусе все работает, в железе - нет.
Проэкт CodeVision & схема в Протеусе прилагаются.
Подскажите, пожалуйста, что делаю не так.

Re: Фонарик на Attiny13 не работает

Добавлено: Вт ноя 17, 2015 23:28:33
rjhaviy
Санябик, а можно схему картинкой, протеуса нет на работе :)

Re: Фонарик на Attiny13 не работает

Добавлено: Ср ноя 18, 2015 00:34:51
НАПАЛМ
Санябик писал(а): Но тут проблема: в Протеусе все работает, в железе - нет.
код не открывал, попробую заванговать, антидребезг вы в программе не писали?

Re: Фонарик на Attiny13 не работает

Добавлено: Чт ноя 19, 2015 00:01:09
Санябик
Антидребезг не писал.
Выложил снимок экрана Протеуса
Вместо нижнего вольтметра - светодиод,
вход АЦП - через резистор к плюсу светодиода, или на шунт.

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

Re: Фонарик на Attiny13 не работает

Добавлено: Пт ноя 20, 2015 04:58:30
rjhaviy
Вот первый баг:
Объявление переменной

Код: Выделить всё

unsigned char np;
Вы ее далее используете в обработчике прерывания, а значит нужно писать:

Код: Выделить всё

volatile unsigned char np;
Ведь компилятор может оптимизировать эту переменную, и запихнуть в регистр общего назначения какой нибудь,
а обработчик прерывания может этот регистр "испортить".
volatile запрещает оптимизацию переменной.

Второй баг:
Объявление переменной в eeprom

Код: Выделить всё

eeprom unsigned char shift=1;
Получается, что после каждого нажатия, вы пишете новое значение в eeprom

Код: Выделить всё

if((np==15)&(tap==3)){shift=shift<<1;delay_ms(50);}
Вроде как гарантированных ATMEL 100000 циклов перезаписи eeprom кажется много -
Хватит на год, если щелкать в день по 273 раза. :)
Понятно, что хочется сохранить последнее значение яркости фонарика.
Можно сделать так:
короткие нажатия - переключение яркости
удержание более одной-двух секунд запись значения яркости в eeprom.

Re: Фонарик на Attiny13 не работает

Добавлено: Вт ноя 24, 2015 14:34:58
Санябик
Rjhaviy, спасибо за советы, но volatile не помогает.

Re: Фонарик на Attiny13 не работает

Добавлено: Вт ноя 24, 2015 14:39:32
rjhaviy
Ну я очень бегло код смотрел. :oops:
А чем прошивку в тиньку заливали?

Re: Фонарик на Attiny13 не работает

Добавлено: Ср ноя 25, 2015 23:47:30
Санябик
Прошивал USBASP V2.0 программатором + Khazama AVR Programmer v1.7.0

Re: Фонарик на Attiny13 не работает

Добавлено: Чт ноя 26, 2015 00:24:22
rjhaviy
Fuse bits правильно поставили?

Есть полезный облачность сервис :
http://www.engbedded.com/fusecalc/

Re: Фонарик на Attiny13 не работает

Добавлено: Сб дек 05, 2015 22:01:55
Санябик
Фьюзы скорее всего правильны, в Khazama есть описание настроек.

Re: Фонарик на Attiny13 не работает

Добавлено: Пн дек 07, 2015 21:24:55
rjhaviy
Есть еще Watchdog timer (WDT), который тактируется независимо.
Такой сторожевой пес, охраняющий МК от зависания.
У вас в программе я не нашел его совсем, даже упоминания. :)
А ведь пес тикает даже в SLEEP и в POWERDOWN.
Дотикал до определенного момента, разбудил МК и сбросил.
Поэтому его нужно самого сбрасывать в конце цикла.
Либо отключить его в самом начале программы,
либо использовать в своих, коварных целях. :) Благо Тиньки позволяют это!
(можно генерить не ресет, а прерывание.)

Читайте даташит на ATTINY внимательно:
http://www.atmel.com/images/doc2535.pdf

Re: Фонарик на Attiny13 не работает

Добавлено: Пн дек 07, 2015 21:40:49
rjhaviy
Хотя..., вроде как по умолчанию WDT должен быть выключен :)
Если только fusebit WDT_ON не включен. (Watch dog timer always on)

WDTON — fuse бит, после установки которого сторожевой таймер WDT включается сразу после подачи питания и не может быть отключен программно. Если бит не установлен, то включением и отключением WDT можно управлять программно.

Re: Фонарик на Attiny13 не работает

Добавлено: Пн дек 07, 2015 22:52:47
rjhaviy
А вообще, прошу прощения, схема стрёмная и сама программа тоже.
Надо примерно так:
В обработчике прерывания запрещаем повторное прерывание GICR=0b00000000, просыпаемся.
Опрашиваем кнопку в основном цикле с антидребезгом и т.д
в конце основного цикла снова разрешим прерывания GICR|=0b01000000
....
Времени мало, схемку нарисовал бы...
Нашел вариант на асме для AT90S1200 для опроса матричной клавы с просыпанием:
http://www.gaw.ru/pdf/Atmel/app/avr/AVR240.pdf
Но там есть блок-схемы.

Re: Фонарик на Attiny13 не работает

Добавлено: Вс окт 02, 2016 11:30:56
kaligari
Вот такой дилетантский вопрос. Подскажите, мощность этого фонарика больше чем у вспышки телефона? У меня сейчас на Андроид телефоне установлена куча программных фонарей, но они быстро батарею убивают, поэтому ищу замену.

Re: Фонарик на Attiny13 не работает

Добавлено: Пн окт 10, 2016 02:24:31
radteh
Какой светодиод поставишь, такая мощность и будет

Re: Фонарик на Attiny13 не работает

Добавлено: Ср окт 26, 2016 08:35:42
Полосатый
В протеусе вольтметр работает? Светодиод управляется током, причём немаленьким, если это фонарик. По коду ничего не могу подсказать, но источника тока на схеме не вижу.