Замена Timer1 на FlexiTimer2

maxpayn
Offline
Зарегистрирован: 25.05.2017

Взял стандартный скетч для диммера, но он не работает на Мега 2560 из-за таймера Timer1, тупо заменил его на FlexiTimer2, но не работает. Подскажите пожалуйста где ошибка?


#define dimPin 8
#define zeroPin 2
#include <FlexiTimer2.h>
//#include <CyberLib.h> // шустрая библиотека для таймера
volatile int tic, Dimmer;

void setup() {
  Serial.begin(9600);
  pinMode(dimPin, OUTPUT);
  digitalWrite(dimPin, 0);
  pinMode(zeroPin, INPUT);                 // настраиваем порт на вход для отслеживания прохождения сигнала через ноль
  attachInterrupt(0, detect_up, FALLING);  // настроить срабатывание прерывания interrupt0 на pin 2 на низкий уровень

//  StartTimer1(timer_interrupt, 40);        // время для одного разряда ШИМ
//  StopTimer1();                            // остановить таймер
 FlexiTimer2::set(40, timer_interrupt) ;
FlexiTimer2::stop() ;
  Serial.println("Start");
}

void loop() {

  // раскомментировать для ввода числа диммирования чеерез монитор порта (0 - 255)
  if (Serial.available()) {
    Dimmer = Serial.parseInt();
    Serial.println(Dimmer);
  }
  
  // раскомментировать для управления потенциометром (аналоговый А0)
  // Dimmer = map(analogRead(0), 0, 1023, 240, 0);
}

//----------------------ОБРАБОТЧИКИ ПРЕРЫВАНИЙ--------------------------
void timer_interrupt() {       // прерывания таймера срабатывают каждые 40 мкс
  tic++;                       // счетчик
  if (tic > Dimmer)            // если настало время включать ток
    digitalWrite(dimPin, 1);   // врубить ток
}

void  detect_up() {    // обработка внешнего прерывания на пересекание нуля снизу
  tic = 0;                                  // обнулить счетчик
 // ResumeTimer1();                           // перезапустить таймер
  FlexiTimer2::start();
  attachInterrupt(0, detect_down, RISING);  // перенастроить прерывание
}

void  detect_down() {  // обработка внешнего прерывания на пересекание нуля сверху
  tic = 0;                                  // обнулить счетчик
 // StopTimer1();  // остановить таймер
 FlexiTimer2::stop() ;
  digitalWrite(dimPin, 0);                  // вырубить ток
  attachInterrupt(0, detect_up, FALLING);   // перенастроить прерывание
}
//----------------------ОБРАБОТЧИКИ ПРЕРЫВАНИЙ--------------------------

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

А что он должен делать-то? О чём вообще речь?

bwn
Offline
Зарегистрирован: 25.08.2014

Це, очередной симисторный диммер.

maxpayn
Offline
Зарегистрирован: 25.05.2017

Не ожидал я несовместимости киберлиб с мегой 2560, на 328 работает отлично ведь, лампочки мигают, а тут надо таймер менять.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

maxpayn пишет:

Не ожидал я несовместимости киберлиб с мегой 2560, 

Они говорят, что совместима.

Вам лучше прямо у них и спрашивать, они там нормально отвечают - http://cyber-place.ru/showthread.php?t=550

maxpayn
Offline
Зарегистрирован: 25.05.2017

Не компилит он с таймером1, видать таймер к архитектуре привязан.

exit status 1

'StartTimer1' was not declared in this scope
DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

ну, бывает, чо. 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ну, я Вам уже сказал, куда обратиться.

bwn
Offline
Зарегистрирован: 25.08.2014

А зачем там Timer1, оно вроде и на киберлибе одной работает.

maxpayn
Offline
Зарегистрирован: 25.05.2017

Я наверное не верно называю т.к. StartTimer1 это функция киберлиб, а не TimerOne

maxpayn
Offline
Зарегистрирован: 25.05.2017

Оказывается есть библиотека RBDdimmer которая нормально работает с Мега 2560