Перипетии нуба с ШИМом на 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 — при оном отключаем ШИМ совсем. Воникает вопрос: как отключать? Можно останавливать таймер. Не лучший вариант: а вдруг на этот таймер что-нибудь ещё посажено? Второй ШИМ, например, или прерывания, или отсчет времени до взрыва? Можно отключать выход таймера — это уже получше, и просто и понятно, получается примерно так:
Как вариант можно менять режима работы самого пина выход/вход.
P.S.
Из комментариев к статье были получены ещё такие решения:
1. Если не принципиально получать 100% заполнения ШИМ, то можно использовать инверсный режим работы выхода;
2. При работе ШИМ в режиме Phase Correct PWM проблема отсутствует.
Всё быстро воткнуто в макетку, с помощью мастера в 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 проблема отсутствует.
- 0
- 12 мая 2016, 16:40
- AnderWonder
- 63
Ускорение травления вибрацией - попытка не пытка

Так родился мини-проект, который был пафосно окрещен «Жалящий Шершень» =)
Читать дальше
Отключение защиты от замерзания электро-котла Protherm Скат

В достаточно неплохой электро-котел встроена защита от замерзания, срабатывающая при достаточно высокой температуре, и которую невозможно отключить.
И если в систему залит антифриз, и планируется периодическое удаленное включение отопления (заранее перед приездом раз в неделю, по праздникам и т.п.), то эта защита может вылиться в копеечку.
Отключаем защиту с помощью навесной схемки на микроконтроллере AVR с цифровым датчиком температуры DS18B20.
Читать дальше
ATTINY13A с завода - обычный ISP вам не поможет
Закупил летом кучу чипов ATTINY 13A на ebay, часть в SU (200 mil) исполнении, часть в SSU (150 mil). С SU (в трее) проблем не возникло, а вот SSU (в ленте) отказались распознаваться обычным китайским USBASP программатором. Перепробовав всевозможные настройки, решил опробовать высоковольтное программирование чтобы попробовать сбросить fuses.
Как обычно это бывает — программировать в таком режиме было нечем.
Полистав полчаса гугл, остановился на самом простейшем для меня варианте (нужна ардуино-совместимая плата).
Что менял под себя:
1) транзистор заменил на 2N2222 (так как были в наличии)
2) 12В подал с лабораторного блока
3) чипы лепил на soic-dip переходник
Перешил на пробу 3 чипа. Все оказались с заводскими fuses: FF FC вместо FF FF
Все ATTINY13A в SSU исполнение, купленные до этого внутри страны, были с обычными fuses (FFFF).
На будущее заказал пару OTS socket для программирования SOIC8/16 т.к. прижимать или припаивать каждый чип нереально.
Что любопытно — на ebay такие socket'ы отдельно стоят всегда дороже (в разы), чем уже припаянные на платки (видимо налепили для каких-то программаторов, которые уже никому не нужны).
Как обычно это бывает — программировать в таком режиме было нечем.
Полистав полчаса гугл, остановился на самом простейшем для меня варианте (нужна ардуино-совместимая плата).
Что менял под себя:
1) транзистор заменил на 2N2222 (так как были в наличии)
2) 12В подал с лабораторного блока
3) чипы лепил на soic-dip переходник
Перешил на пробу 3 чипа. Все оказались с заводскими fuses: FF FC вместо FF FF
Все ATTINY13A в SSU исполнение, купленные до этого внутри страны, были с обычными fuses (FFFF).
На будущее заказал пару OTS socket для программирования SOIC8/16 т.к. прижимать или припаивать каждый чип нереально.
Что любопытно — на ebay такие socket'ы отдельно стоят всегда дороже (в разы), чем уже припаянные на платки (видимо налепили для каких-то программаторов, которые уже никому не нужны).
- 0
- 28 октября 2014, 17:06
- digitdroid
- 15
Автоматическое управление светом. Готовое устройство.
Всем доброго времени суток. В данной заметке хочется поделиться с народом мною разработанным, собранным, отлаженным и уже работающим устройством под названием «The automatic light switch». Что представляет собой приборчик, который включает свет, при появлении движения в комнате. Так же на борту устройства имеется датчик освещения (фоторезистор).
Читать дальше
Читать дальше
Ремонт мини-печи (таймер на микроконтроллере AVR с симистором)

Была у меня мини-печка для бутербродов с механическим таймером.
Работала долго и в общем-то всем устраивала.
Но вот недавно сломался в ней механический таймер — у одной из шестеренок ось перетерлась.
Печь сама по себе работала, только не выключалась.
Вот решил это дело поправить и заодно попрактиковаться в использовании микроконтроллера ATtiny13A в термически жестких условиях.
Читать дальше
Лампа настроения. Изваял тут.
Когда-то давно увидел переливающийся всеми цветами светильник, лампу настроения. Где-то что-то отложилось, и решил когда-нибудь изваять. Тут делать было нечего на днях, и вспомнил я про нее.

Такой вот кубик получился.
Читать дальше

Такой вот кубик получился.
Читать дальше
Отличия ATTiny от ATTiny c индексом A
Знает ли кто-нибудь, чем, отличаются ATTiny2313 от ATTiny2313A и ATTiny13 от ATTiny13A?
А то цена привлекательная, но непонятно чем отличаются характеристики.
UPD: Спасибо всем, если я правильно понял, особенных различий, кроме питания, между ними нет.
А то цена привлекательная, но непонятно чем отличаются характеристики.
UPD: Спасибо всем, если я правильно понял, особенных различий, кроме питания, между ними нет.