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

Можно ли использовать одновременно ШИМ и внешнее прерывание?

Добавлено: Вс янв 08, 2017 16:33:41
Алексей bird
Привет, коллеги!
Задача: управлять RGB лентой через ИК-пульт. Объект: ATmega8A
Проблема: не управляется, когда всё сразу включено.
Т.к. надо 3 ШИМ, то задействованы все таймеры. А при приёме ИК-данных с пульта надо считать импульсы через таймер. Получается мы можем делать, либо ШИМ либо подсчет импульсов, так получается? Атмега8 не подходит?

Re: Можно ли использовать одновременно ШИМ и внешнее прерыва

Добавлено: Вс янв 08, 2017 16:41:41
Аlex
Естественно, если таймер занят внутренним тактированием, то он не может работать от внешнего тактирования. Это же логично :dont_know:
Также логично, если таймер занят для чего-либо, то использовать его для чего-то другого нереально.
Или я что-то не допонимаю... :roll:

Re: Можно ли использовать одновременно ШИМ и внешнее прерыва

Добавлено: Вс янв 08, 2017 16:47:19
Алексей bird
небольшое уточнение, заняты не все таймеры, а 16-битный и 8-битный, который может работать "Сброс по совпадению". Оставшийся таймер не подходит, т.к. при считывании важны точные измерения.

Re: Можно ли использовать одновременно ШИМ и внешнее прерыва

Добавлено: Вс янв 08, 2017 16:47:45
ARV
Алексей bird писал(а):Атмега8 не подходит?
уверен на 100% - подходит.
дело в том, что вашу задачу можно решить даже на attiny13 - см. мой вариант http://simple-devices.ru/prj/9-electr/8 ... te-control позже я модифицировал этот проект для работы с "настоящим" пультом, обычно применяемым для RGB-лент.

просто если вам надо РЕШИТЬ ЗАДАЧУ - это можно легко и просто сделать. но если вам надо ДЕЛАТЬ, КАК ПОЛОЖЕНО - вы можете столкнуться с проблемами, как сейчас.

прочтите о моём способе приема IR-сигналов с пульта и, если решитесь пойти не той дорогой, что ходят все, вы легко справитесь с решением своей задачи!

Re: Можно ли использовать одновременно ШИМ и внешнее прерыва

Добавлено: Вт янв 10, 2017 23:35:59
Demiurg

Re: Можно ли использовать одновременно ШИМ и внешнее прерыва

Добавлено: Ср янв 11, 2017 07:19:04
Engineer_Keen
Использовать целый аппаратный таймер для одного канала такой вещи как светодиод - ИМХО расточительство, хотя если много каналов не надо, то это ваше право...
Имея всего ОДИН таймер, можно сделать количество каналов программной ШИМ, ограниченное только:
1) разрешающей способностью
2) частотой ШИМ
3) общей загруженностью контроллера
А остальные таймеры можно использовать как угодно, хоть для ИК.
Например не проблема сделать 8 каналов с разрешающей способностью 8 бит и частотой от 100Гц при тактовой 8МГц и при этом занять менее 20% вычислительной способности ядра. Последнее что я делал было на меге48 с 21х16 каналами (т.е 336, хотя всего 4 разряда ШИМ) и оно еще по UART принимало картинку 21х16 пикселей со скоростью почти 20 кадров в секунду.

Re: Можно ли использовать одновременно ШИМ и внешнее прерыва

Добавлено: Ср янв 11, 2017 08:25:54
Demiurg
У меня есть пример на ассемблере. Программный шим. 32 светодиода. Мк занят на 100 %. Так что не торопитесь утверждать, что шимить и параллельно выполнять еще много чего раз плюнуть.

Re: Можно ли использовать одновременно ШИМ и внешнее прерыва

Добавлено: Ср янв 11, 2017 08:28:40
ARV
Demiurg писал(а):У меня есть пример на ассемблере. Программный шим. 32 светодиода. Мк занят на 100 %
а частота ШИМа-то какая? я делал на Си 32 канала ШИМ - при частоте порядка 60Гц еще мноооого времени оставалось...

Re: Можно ли использовать одновременно ШИМ и внешнее прерыва

Добавлено: Ср янв 11, 2017 08:57:59
Engineer_Keen
ARV писал(а):а частота ШИМа-то какая?
Ага, и еще тактовая МК сколько? У меня тоже есть примерчик: 48 каналов, 8 бит, 120Гц, тут да 100% загрузка, но там тактовая 8МГц и вывод не на прямую на ноги контроллера, а по SPI (и ни одного таймера или прерывания кстати не задействовано, тупо все в цикле).
Ну а вообще, конечно надо задачу полностью знать, а то может у топикстартера там контроллер "логарифмы тангенсов" считает от чисел, которые ему с ик-пульта присылают, тогда конечно програмной ШИМ не отделаться...

Re: Можно ли использовать одновременно ШИМ и внешнее прерыва

Добавлено: Ср янв 11, 2017 15:18:29
Алексей bird
В итоговом варианте задача выглядеть будет так: контроллер RGB ленты, будет управляться с ИК-пульта, а также управляться через Синезуб. Синезуб планируется пока только на прием, хотя и надо предусмотреть возможность отправки какой-нибудь инфы))) Поэтому и выбран был изначально вариант в аппаратным ШИМ. До этого так плотно таймеры не использовал, а тут они сразу все и понадобились, даже получается не хватает... Сейчас пока другие задачи возникли, с этим проектом продолжу чуть позже и обязательно попробую советы выше.

Re: Можно ли использовать одновременно ШИМ и внешнее прерыва

Добавлено: Ср янв 11, 2017 15:24:34
ARV
Алексей bird писал(а):В итоговом варианте задача выглядеть будет так: контроллер RGB ленты, будет управляться с ИК-пульта, а также управляться через Синезуб.
atmega8 - за глаза хватит! можно даже о atmega48 задуматься.

Re: Можно ли использовать одновременно ШИМ и внешнее прерыва

Добавлено: Ср янв 11, 2017 17:55:50
НАПАЛМ
Ну там у таймеров регистров сравнения всего 2 штуки, так что 3 канального чисто аппаратно на одном таймере не получится. Можно программно-аппаратно сделать. Настраиваете таймер, в обработчике прерывания инкрементируете 3 переменные и сравниваете их же и по результату сравнения логические уровни на ногах контроллера переключаете. Что-то типа виртуальных таймеров на одном аппаратном.

Re: Можно ли использовать одновременно ШИМ и внешнее прерыва

Добавлено: Ср янв 11, 2017 20:54:30
Engineer_Keen
НАПАЛМ писал(а):Настраиваете таймер, в обработчике прерывания инкрементируете 3 переменные и сравниваете их же и по результату сравнения логические уровни на ногах контроллера переключаете. Что-то типа виртуальных таймеров на одном аппаратном.
Ну примерно так и делается, только инктементировать надо не 3 переменных, а одну - программный счетчик, и по результату его сравнения с тремя переменными - дергать ногами RGB. Аппаратный таймер запускается в режиме CTC, так можно легко регулировать частоту программной ШИМ. Если делать 8 разрядов, то частота получится как частота срабатывания CTC/256. При этом на основе этого же таймера можно сделать еще несколько программных делителей с удобными частотами срабатывания, которые потом могут понадобиться в программе, например 1с для встроенных часов или какой-нибудь 50мс для анимации/плавного изменения цвета.