ссылка на -> предыдущую часть
Каналы ШИМ настроены. Теперь займусь светоэффектами.
Сначала просто "бегущие огни". Для этого я предварительно подготовил Tmr3. Займусь обработкой прерывания этого таймера. Прописываю функцию прерывания до главной функции.
Здесь я сначала сбрасываю флаг прерывания. Потом меняю скважность каналов записывая значение скважности минимальные или максимальные. "Зажигаются" те каналы , где соответствующий бит переменной "sdvig" равен "1" . В условии использую логическое побитовое "И" с расчетом, что в последствии можно было "зажигать" одновременно больше одного канала. В последней строке сдвигаю биты влево (бегущие огни) , обнуляю старшие ненужные биты и закольцовываю первых три бита.
В настройках Tmr3 не забываю разрешить прерывание IEC0bits.T3IE = 1. Генерирую исполняемый файл, запускаю симуляцию, получаю картинку на "осциллографе":
Скачок на видео - это потому что GIF-ка. Реально все нормально.
Далее настрою обработку прерывания Tmr4. Он у меня отвечает за псевдоаналоговый сигнал. Решил использовать функцию синус. :
Сбрасываю флаг. Период функции sin делю на 20. Получится ступенчатое изменение яркости. При 20 будет на вид достаточно плавно. Значение функции sin меняется от -1 до +1. Нам надо что бы от нуля до +1. Для этого прибавлю 1 - это перенесет значение в диапазон от 0 до +2. Затем делю на 2. Чтобы был эффект "бегущей волны" , сдвину аргумент sin для каждого канала по фазе на треть окружности (аргумент в радианах ). Полученные коэффициенты умножаю на длительность периода ШИМ. Получаю скважности для каналов. Контролирую границы. Присваиваю значения регистрам скважности.
Иду в настройки таймеров. Разрешаю прерывание IEC0bits.T4IE = 1 и отключаю прерывание IEC0bits.T3IE = 0 . Генерирую исполняемый файл, запускаю симуляцию, получаю картинку на "осциллографе":
Видно, что виртуально работает.
Пока достаточно. В следующий раз планирую сделать управление режимами.