Свежие обсуждения
Микроконтроллеры

3 канальный ШИМ на Tiny15L?

1 3 5

На таком принципе была написана программа для 24-канального шима на 20 МГц аврке, 256 точек, 6 кГц, возможно изменение всех уставок за один период шима. На периоде шима может быть до 25 прерываний, занимают минимум процессорного времени, зато фоновая программа приёма и упорядочения уставок и ассоциированных с ними номеров каналов занимает всё остальное время. Правда, если снизить частоту шим до 3 кГц, то примерно 80% времени процессора будет свободно для других задач.

Для трёхканального шима задача упорядочения уставок вырождается в два-три десятка операторов. Сиё осложняется отсутствием памяти, но думаю задача вполне решаема

 

Вобщем что-то получилось. Для начала цвета просто переливаются. Решил как и говорили выше в лоб.
Реализацию по способу GM отложил до лучших времён. Программист из меня получился посредственный.
Что однако не мешает реализовывать на МК некоторые свои идеи.

 

GM, а ведь в вашей реализации ШИМа невозможно получить коэффициент заполнения 100%?

 

Напрямую - да, но здесь легко выкрутиться - в обработчике по переполнению установить линию руками, т.е. вместо ldi temp,0 заносить в порт данные из другого регистра - в нем на месте 100% ШИМа в битах устанавливаем лог.1, в остальных местах - лог.0. Просто 100% ШИМ - случай достаточно частный

 

chav1961: Просто 100% ШИМ - случай достаточно частный

Сделать нет проблем, от 0 и до 100, но при 0 и при 100 это не будет шим по определению.

 

smg123: Реализацию по способу GM отложил до лучших времён

Попробуйте такой вариант с переключателем а ля switch.

;Процедура обработки прерывания таймер1 по сравнению (11МЦ)

pwmisr:   sbrc     switch,0           ;первое прерывание?

          rjmp     pwm1               ;да

          sbrc     switch,2           ;третье прерывание?

          rjmp     pwm3               ;да

pwm2:     out      portb,set2         ;второй образ порта

          out      ocr1,time3         ;уставка 3

          ldi      switch,4           ;указатель на 3 прерывание

          reti                        ;сделано

pwm1:     out      portb,set1         ;первый образ порта

          out      ocr1,time2         ;уставка 2

          ldi      switch,2           ;указатель на 2 прерывание

          nop                         ;выравнивание веток

          reti                        ;сделано

pwm3:     out      portb,set3         ;третий образ порта

          nop                         ;выравнивание веток

          reti                        ;сделано


;Процедура обработки прерывания таймер1 по переполнению (11МЦ) 

eopwm:    ldi      temp,0             ;обнуление

          out      portb,temp         ;порта

          ldi      switch,1           ;указатель на 1 прерывание

          out      ocr1,time1         ;уставка 1

          nop                         ;выравнивание времени

          nop                         ;выполнения прерываний

          nop                         ;(факультативно)

          reti                        ;сделано

Шорт побери, скипа съел всё форматирование. Как побороть проблему?

 

GM: Шорт побери, скипа съел всё форматирование. Как побороть проблему?

Я обрамляю каждую строчку, типа так:
<pre>eopwm: ldi temp,0 ;обнуление
</pre><pre> out portb,temp ;порта
</pre><pre> di switch,1 ;указатель на 1 прерывание
</pre>

Получается широко, но получается :

eopwm:	ldi temp,0	;обнуление
	out portb,temp	;порта
	di switch,1	;указатель на 1 прерывание

 

Спасибо, но получается как-то не козяво. Хорошо ещё не по одной строке на страницу(

 

А что делать?

ЗЫ. Переносите закрывающий тег на следующую строчку, как я показал, это самый компактный вариант.

 

Если у меня второй обработчик прерываний (по таймеру Т0) обрабатывает алгоритмы изменения каждого ШИМ, то длительность обработки прерывания не должна быть больше длительности шага ШИМ, т.е. периода переполнения таймера Т1, с пом. которого формируется 3 канала ШИМ?
"Доктор, я правильно вложила свой ваучер?" (С) анекдот.

Если я размещаю обработку алгоритмов в основной программе - ругается симулятор на переполнение счётчика команд.