25.08.2016, 05:38 | #11 |
Junior Member
Регистрация: 25.07.2016
Сообщений: 2
Вес репутации: 0 |
Re: Многоканальный Dimmer, работающий в фоновом режиме
Имеется Nano (328) и диммер.
Код взял с этой темы. Работает, но с задержкой около одной секунды. На контроллере светодиод RX моргает моментально, сразу после отправки данных в порт, а уже спустя секунду изменятся яркость лампочки. Как минимизировать эту паузу? Код:
#include <TimerOne.h> volatile uint8_t tic ; uint8_t data; int Dimmer; void setup() { //*********************Настраиваем порты на выход********************** pinMode (3, OUTPUT); digitalWrite(3, LOW); // гасим оответствующий пин Dimmer = 10; //выставим яркость соответствующего диммера в 0 attachInterrupt(0, detect_up, LOW); // настроить срабатывание прерывания interrupt0 на pin 2 на низкий уровень Timer1.initialize(40); // Интервал срабатывания таймера в мкс Timer1.attachInterrupt(halfcycle); //будет вызыватся каждый раз при отсчете заданого времени Timer1.stop(); Serial.begin(115200); //инициализация порта randomSeed(analogRead(0)); //псевдогенератор случайных чисел будет использовать шумы на аналог пин 0 Serial.begin(9600); } //********************обработчики прерываний******************************* void halfcycle() //прерывания таймера { tic--; //счетчик if (Dimmer > tic ) digitalWrite(3, HIGH); //управляем выходом (откроем семистор) } void detect_up() // обработка внешнего прерывания. Сработает по переднему фронту { tic = 200; //обнулить счетчик Timer1.resume(); //запустить таймер attachInterrupt(0, detect_down, HIGH); //перепрограммировать прерывание на другой обработчик } void detect_down() // обработка внешнего прерывания. Сработает по заднему фронту { Timer1.stop(); //остановить таймер digitalWrite(3, LOW); tic = 200; //обнулить счетчик attachInterrupt(0, detect_up, LOW); //перепрограммировать прерывание на другой обработчик } void loop() { if (Serial.available() > 0) { Dimmer = Serial.parseInt(); } } |
Здесь присутствуют: 47 (пользователей: 0 , гостей: 47) | |
|
|