Привет, коллеги!
Задача: управлять RGB лентой через ИК-пульт. Объект: ATmega8A
Проблема: не управляется, когда всё сразу включено.
Т.к. надо 3 ШИМ, то задействованы все таймеры. А при приёме ИК-данных с пульта надо считать импульсы через таймер. Получается мы можем делать, либо ШИМ либо подсчет импульсов, так получается? Атмега8 не подходит?
Естественно, если таймер занят внутренним тактированием, то он не может работать от внешнего тактирования. Это же логично
Также логично, если таймер занят для чего-либо, то использовать его для чего-то другого нереально.
Или я что-то не допонимаю...
небольшое уточнение, заняты не все таймеры, а 16-битный и 8-битный, который может работать "Сброс по совпадению". Оставшийся таймер не подходит, т.к. при считывании важны точные измерения.
уверен на 100% - подходит.
дело в том, что вашу задачу можно решить даже на attiny13 - см. мой вариант http://simple-devices.ru/prj/9-electr/8 ... te-control позже я модифицировал этот проект для работы с "настоящим" пультом, обычно применяемым для RGB-лент.
просто если вам надо РЕШИТЬ ЗАДАЧУ - это можно легко и просто сделать. но если вам надо ДЕЛАТЬ, КАК ПОЛОЖЕНО - вы можете столкнуться с проблемами, как сейчас.
Использовать целый аппаратный таймер для одного канала такой вещи как светодиод - ИМХО расточительство, хотя если много каналов не надо, то это ваше право...
Имея всего ОДИН таймер, можно сделать количество каналов программной ШИМ, ограниченное только:
1) разрешающей способностью
2) частотой ШИМ
3) общей загруженностью контроллера
А остальные таймеры можно использовать как угодно, хоть для ИК.
Например не проблема сделать 8 каналов с разрешающей способностью 8 бит и частотой от 100Гц при тактовой 8МГц и при этом занять менее 20% вычислительной способности ядра. Последнее что я делал было на меге48 с 21х16 каналами (т.е 336, хотя всего 4 разряда ШИМ) и оно еще по UART принимало картинку 21х16 пикселей со скоростью почти 20 кадров в секунду.
Неправильно собранная из неисправных деталей схема нуждается в отладке и сразу не работает... (С)
У меня есть пример на ассемблере. Программный шим. 32 светодиода. Мк занят на 100 %. Так что не торопитесь утверждать, что шимить и параллельно выполнять еще много чего раз плюнуть.
Ага, и еще тактовая МК сколько? У меня тоже есть примерчик: 48 каналов, 8 бит, 120Гц, тут да 100% загрузка, но там тактовая 8МГц и вывод не на прямую на ноги контроллера, а по SPI (и ни одного таймера или прерывания кстати не задействовано, тупо все в цикле).
Ну а вообще, конечно надо задачу полностью знать, а то может у топикстартера там контроллер "логарифмы тангенсов" считает от чисел, которые ему с ик-пульта присылают, тогда конечно програмной ШИМ не отделаться...
Неправильно собранная из неисправных деталей схема нуждается в отладке и сразу не работает... (С)
В итоговом варианте задача выглядеть будет так: контроллер RGB ленты, будет управляться с ИК-пульта, а также управляться через Синезуб. Синезуб планируется пока только на прием, хотя и надо предусмотреть возможность отправки какой-нибудь инфы))) Поэтому и выбран был изначально вариант в аппаратным ШИМ. До этого так плотно таймеры не использовал, а тут они сразу все и понадобились, даже получается не хватает... Сейчас пока другие задачи возникли, с этим проектом продолжу чуть позже и обязательно попробую советы выше.
Алексей bird писал(а):В итоговом варианте задача выглядеть будет так: контроллер RGB ленты, будет управляться с ИК-пульта, а также управляться через Синезуб.
atmega8 - за глаза хватит! можно даже о atmega48 задуматься.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Ну там у таймеров регистров сравнения всего 2 штуки, так что 3 канального чисто аппаратно на одном таймере не получится. Можно программно-аппаратно сделать. Настраиваете таймер, в обработчике прерывания инкрементируете 3 переменные и сравниваете их же и по результату сравнения логические уровни на ногах контроллера переключаете. Что-то типа виртуальных таймеров на одном аппаратном.
НАПАЛМ писал(а):Настраиваете таймер, в обработчике прерывания инкрементируете 3 переменные и сравниваете их же и по результату сравнения логические уровни на ногах контроллера переключаете. Что-то типа виртуальных таймеров на одном аппаратном.
Ну примерно так и делается, только инктементировать надо не 3 переменных, а одну - программный счетчик, и по результату его сравнения с тремя переменными - дергать ногами RGB. Аппаратный таймер запускается в режиме CTC, так можно легко регулировать частоту программной ШИМ. Если делать 8 разрядов, то частота получится как частота срабатывания CTC/256. При этом на основе этого же таймера можно сделать еще несколько программных делителей с удобными частотами срабатывания, которые потом могут понадобиться в программе, например 1с для встроенных часов или какой-нибудь 50мс для анимации/плавного изменения цвета.
Неправильно собранная из неисправных деталей схема нуждается в отладке и сразу не работает... (С)