Форум обсуждения систем  

Вернуться   Форум обсуждения систем "Умный дом", проектов Ардуино, OpenWRT и других DIY устройств > Форум умного дома > Сделай сам

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 25.08.2016, 05:38   #11
sveloga
Junior Member
 
Регистрация: 25.07.2016
Сообщений: 2
Вес репутации: 0
sveloga is an unknown quantity at this point
По умолчанию 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();
   }
}
sveloga вне форума   Ответить с цитированием
 


Здесь присутствуют: 47 (пользователей: 0 , гостей: 47)
 

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход


Текущее время: 08:43. Часовой пояс GMT +3.


Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Яндекс.Метрика