Прерывания Найти Ошибку

30-10-2014, 17:33 От: admin Посмотрели: 374
Вход 2 ардуино запитан от сети через опторазвязку по стандартной схеме.

если не использовать таймер 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)

Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
Мы рекомендуем Вам зарегистрироваться, либо войти на сайт под своим именем.

Обсудить на форуме


На момент добавления Прерывания Найти Ошибку все ссылки были рабочие.
Все публикации статей, книг и журналов, представлены на этом сайте, исключительно для ознакомления,
авторские права на эти публикации принадлежат авторам статей, книг и издательствам журналов!
Подробно тут | Жалоба
Информация
Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.


Опрос

Ваши предпочтения в TRX


Одинарное преобразование
Двойное преобразование
Прямое преобразование
SDR
Другое
Мне всё равно

Популярные новости
Календарь новостей
«    Май 2024    »
ПнВтСрЧтПтСбВс
 12345
6789101112
13141516171819
20212223242526
2728293031