ссылка на --> предыдущую часть
Шимы и светоэффекты настроены. Теперь займусь управлением всем этим. Буду переключать режимы и скорость при помощи двоичного переключателя. Это вот такая штука. Существуют поминиатюрнее, но в наличии у меня только это
В контроллере есть свободный порт "А". Буду использовать его. Подключу к нему переключатели вот так:
Первый на режимы, второй на скорость.
Подготовлю порт А
Здесь попутно устанавливаю максимальную скважность в 30 проц . Так как поизучав схемы стабилизаторов тока светодиодных лент, прикинул , что там такая скважность примерно. Также умножаю на 3 период таймера 4, чтобы скорость совпадала с бегущими огнями - он считает одновременно на три канала .
Настрою еще и таймер 5 на 4 секунды примерно . Он мне понадобится для автоматического перебора режимов.
Теперь собственно управление. Режимы буду переключать просто разрешением/запретом прерываний таймеров и изменением минимальной скважности. Пишу в "теле" бесконечного цикла в главной функции вот это:
Здесь я опрашиваю порт А . Выделяю биты режима и , в зависимости от кода , использую нужный таймер . В трех последних режимах увеличиваю минимальную скважность для режима мерцания (диоды не гаснут полностью). В режимах 2 и 5 сделаю инверсию каналов в прерывании Tmr3 - "бегущий ноль". Получится 6 режимов плюс "0" - автомат.
1-бегущий огонь, 2- бегущий ноль, 3 - бегущая волна, 4- мерцающий бег.огонь, 5 - мерцающий бег.ноль, 6 - мерцающая волна.
0 - автоматический перебор нескольких режимов по 8 сек , примерно , каждый
Скорость буду менять в обработчиках прерывания таймеров. Вот так изменю обработчик Tmr3:
В этой функции выделены две строчки работающие только в режимах 2 и 5. В первой инвертирую каналы методом "исключающее ИЛИ" с единицами (так показалось проще). Получается "бегущий ноль". Во второй помеченной строке, инвертирую в исходное состояние. Скорость устанавливаю изменением периода Tmr3. Опрашиваю порт А, выделяю биты скорости и меняю период. В двух битах 4 скорости получится.
В таймере-4 аналогично. Только здесь меняю период Tmr4.
Далее делаю режим "0- автомат". Пишу функцию обработчика прерывания Tmr5 :
Тут просто по счетчику перебираю несколько режимов по 8 сек , примерно, каждый.
На симуляции получается так
Это режим "0" - авто. Скорость третья.
Виртуальная часть окончена. В итоге - использую таймеры и ШИМ(PWM) . Как и планировал. В последствии буду реализовывать физически.
текст программы >> тут