Вход 2 ардуино запитан от сети через опторазвязку по стандартной схеме.
если не использовать таймер 1 а использовать Delay все работает.
Схема должна работать на подобие димера.
Раздел: Песочница (Q&A)
если не использовать таймер 1 а использовать Delay все работает.
Схема должна работать на подобие димера.
#include <avr/io.h>
#include <avr/interrupt.h>
int AC_pin = 10; // выход для симистора
volatile unsigned int dim;
volatile int front;
volatile int i=0;//перменнная мигания светодиодом
#define LED_PIN 13
void setup()
{
pinMode(AC_pin, OUTPUT);
pinMode(LED_PIN, OUTPUT);
cli(); // disable global interrupts
TCCR1A=0;
TCCR1B = (0<<CS12)|(1<<CS11)|(0<<CS10); // настраиваем делитель на 8 таймера 1
//16000000/8=2000000;1/2000000=0.0000005c * 65535=0,0327675сек переполнение
//0.01сек длительность полупериода(при 50гц).(65535*0,01)/0.0327675=20000-1 отсчетов таймер сделает за 0,01 сек
//значит эти 20000 мы будем отсчитывать между 45535 и 65535
sei(); // выставляем бит общего разрешения прерываний
attachInterrupt(0, FrontUp, RISING); //разрешаем прерывание по изменению уровня с низкого на высокий
dim=45600;
}
// Функция обработки прерывания на подъем
void FrontUp()
{
i++;
if(i>100)
{
digitalWrite(LED_PIN, HIGH);
}
detachInterrupt(0);
front=0;
TCNT1 = dim;
TIMSK1 |= (1<<TOIE1); // разрешаем прерывание по переполнению таймера 1
}
// Функция обработки прерывания на спад
void FrontDown()
{
i++;
if(i>200)
{
digitalWrite(LED_PIN, LOW);
i=0;
}
detachInterrupt(0);
front=1;
TCNT1 = dim;
TIMSK1 |= (1<<TOIE1); // разрешаем прерывание по переполнению таймера 1
}
ISR( TIMER1_OVF_vect )//сработало прерывание по переполнению таймера TCNT1 = Delay_On;
{
switch (front)
{
case 0:
digitalWrite(AC_pin, HIGH); // включить симистор
front=2;
TCNT1 = 65500;
break;
case 1:
digitalWrite(AC_pin, HIGH); // включить симистор
front=3;
TCNT1 =65500;
break;
case 2:
digitalWrite(AC_pin, LOW); // выключение симистора(он выключится
attachInterrupt(0, FrontDown, FALLING);//на спад
TIMSK1 &= ~(1<<TOIE1); // запрещаем прерывание по переполнению таймера 1
break;
case 3:
digitalWrite(AC_pin, LOW); // выключение симистора(он выключится
TIMSK1 &= ~(1<<TOIE1); // запрещаем прерывание по переполнению таймера 1
attachInterrupt(0, FrontUp, RISING); //на подьем
break;
}
}
void loop()
{
if(front==3)dim=dim + 10;
if(dim>65500)dim=45600;
}
}
Раздел: Песочница (Q&A)