Самопальная "третья рука" с подсветкой и вытяжкой

Без держателя «третья рука» пайка и монтаж иногда превращаются в мучение, это всем известно. Так что вещь в хозяйстве незаменимая. Из экземпляров, предлагаемых китайпромом, что-то мне ни один не приглянулся: все они на одно лицо — 2 крокодила и лупа(впрочем для многих задач вполне годны). Если хочешь немного наворотов типа подсветки, то цены уже возмущают. Так что решил заколхозить сам. Получилось отакэ:



Далее по-порядку.


Читать дальше

Перипетии нуба с ШИМом на Attiny13

Возникла давеча простенькая задачка. Нужен был регулируемый вручную ШИМ для теста одной идейки. Под рукой тинька 13 — т.е. цепляем переменник на АЦП и выводим что нам нужно. Казалось бы — проще только светодиодом помигать. Однако. Смеркалось.
Всё быстро воткнуто в макетку, с помощью мастера в CodeVision несколькими щелчками собран проект. Для теста на выход — светодиод. Включаю: горит на полную, кручу резистор — реакции нет. Шустро проверяю все соединения, питание, схему, прошивку — эффект остается. После трехкратного повторения тех же действий возникло недоумение. Беру другую тиньку, прошиваю, включаю — болт. Похоже проблема не в чипе. Некоторое время созерцаю код сгенерированный CodeVision — придраться не к чему. Открываю datasheet, вникаю. Изучил ADC, проверил — всё по канонам. Перешёл к ШИМ.
Краткое описание устройства аппаратного ШИМ на Attiny13 для начинающих:
ШИМ сделан на базе таймера. Т.е. у таймера есть несколько режимов работы, два из них относятся к ШИМу (FastPWM и Phase Correct PWM). Таймер настраивается с помощью двух регистров: TCCR0A,TCCR0B. В них задается режим, частота (делитель), какие каналы используются (есть два — 0A и 0B), режим работы выхода(прямой, инвертированный). Значение ШИМа задаются в регистрах OCR0A и OCR0B — соответственно для каждого канала. Есть ещё у ШИМа такая настройка — чем определяется максимальное значение таймера(TOP), при достижении которого он сбрасывается и бежит с начала — это может быть либо 0xFF, либо значение в регистре OCR0A. У меня был установлен второй режим и значение ШИМа я задавал в регистре же OCR0A.
Немало времени ушло у меня пока я нашёл свою ошибку и ещё больше пока догнал её смысл. Хотя сейчас всё кажется очевидным. Для тех кто, как и я, в танке — TOP должен быть 0xFF. Надо заметить, что настройка режимов через регистры не радует интуитивно понятным интерфейсом. Так вышеозначенный режим определяется битами WGM02:0, два из которых находятся в регистре TCCR0A(00,01), а третий(02) в TCCR0B. Правда мастер CodeVision при начальной настройке здесь наше всё, но когда нужно что-то подправить уже в процессе вот тут-то и приходится поднапрячься.
Короче, следующие грабли. Яркость регулируется, но вот беда: когда довожу ручку до минимума всё равно подсвечивает. Т.е. на АЦП у нас 0, а на выходе не 0. Обидно, понимаешь. Причина такого поведения в том, что в тот момент, когда таймер сбрасывается в 0, на выходе чип выставляет 1, и хотя значение ШИМа у нас задано 0, и уже в следующем такте он это видит и обнуляет выход, но вот этого несчастного скачка достаточно что бы светодиодик светил. Дискомфорт — ты ждешь на выходе чистый 0, а тут тебе гребеночка такая. Вообще говоря проблема известная. Решение приходит в голову практически сразу: когда меняем значение ШИМа, добавляем проверочку на 0 — при оном отключаем ШИМ совсем. Воникает вопрос: как отключать? Можно останавливать таймер. Не лучший вариант: а вдруг на этот таймер что-нибудь ещё посажено? Второй ШИМ, например, или прерывания, или отсчет времени до взрыва? Можно отключать выход таймера — это уже получше, и просто и понятно, получается примерно так:
if(OCR0A==0)TCCR0A&=0x3F;
else TCCR0A=0x83;

Как вариант можно менять режима работы самого пина выход/вход.
P.S.
Из комментариев к статье были получены ещё такие решения:
1. Если не принципиально получать 100% заполнения ШИМ, то можно использовать инверсный режим работы выхода;
2. При работе ШИМ в режиме Phase Correct PWM проблема отсутствует.