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

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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 07.11.2015, 13:36   #11
Dmti
Junior Member
 
Регистрация: 07.11.2015
Сообщений: 4
Вес репутации: 0
Dmti is an unknown quantity at this point
По умолчанию Re: Многоканальный Dimmer, работающий в фоновом режиме

Всем здравствуйте. Выкладываю так для разнообразия когда то писал для меги8 отлаживал на ардуино 2560 нужно было использовать минимум процессорного времени. Скетч был написан чисто только для отладки. Может каму будет интересно.
Цитата:
#include <avr/io.h>
#include <avr/interrupt.h>

//**************************************** ******************************
#define synh PD0 //ВХОД синхро импульс перехода через 0 прерывание INT0
#define tir PB7 //ВЫХОД импульс упровление симистором 13 со светодиодом
volatile unsigned int tcntValue;//время после которого срабатывает таймер
volatile unsigned int tcnt, pause;//время через которое закроется тиристор
int min = 23; int max = 1024; int Pressure = 3;
//**************************************** ******************************
ISR(INT0_vect) // Функция обработки прерывания INT0
{
// настраиваем делитель таймера
TCCR1A = Pressure;
//выставляем начальное значение таймера
OCR1A = tcntValue;//Через сколько тиков включить
OCR1B = tcnt; //через сколько выключить
TCNT1 = 0; //обновляем счет тиков
}

//**************************************** ******************************
//Тайме первый цикл включает второй выключает тиристор
ISR (TIMER1_COMPA_vect)
{
PORTB |= ( 1 << tir); //включаем тиристор
}
ISR (TIMER1_COMPB_vect)
{
PORTB &=~ ( 1 << tir); //выключаем тиристор
OCR1A = OCR1B = 0;// и останавливаем таймер
}

//**************************************** ******************************
void setup() {
pinMode(3, OUTPUT);
analogWrite(3,10);
tcntValue = 10;
pause = 5;
tcnt = tcntValue + pause;
//---------------------------//настраиваем порты для управлением симистора
DDRB = ( 1 << tir ); //настраиваем tir на выход
PORTB &= ~( 1 << tir ); //гасим светодиод
DDRD &= ~_BV(synh); //вход детектора нуля INT0
PORTD |= _BV(synh); //с подтягивающим резистором для питания транзистора оптрона

//---------------------------//Запрещаем прерывание глобально
cli();
//---------------------------//настраиваем внешнее прерывание
EIMSK &= ~ (1 << INT0); //Запретить прерывание
EICRA &= ~ (1 << ISC00) | (1 << ISC01); //Обнуляем биты ISC00 и ISC01 в регистре EICRA
EICRA |= 2; //и включаем сработку по фронту
EIMSK |= (1 << INT0); //разрешаем внешнее прерывание 0

//---------------------------//настраиваем прерывание на таймер
TCCR1B = Pressure; //настраиваем делитель на 8 (1тик=0.5мкс 20мс=400тиков)
SREG |= (1<<7); // Глобальное разрешение прерываний.
TIMSK1 |= (1<<OCIE1A) | (1<<OCIE1B); //включаем компаратор А и В

//---------------------------//Разрешаем прерывание глобально
sei();
Serial.begin(9600);
}

//**************************************** ******************************
void loop() {
tcntValue = analogRead(A0);
if(tcntValue > max) tcntValue = max;
if(tcntValue < min) tcntValue = min;
tcnt = tcntValue + pause;
Serial.print(tcntValue);
Serial.print(" == ");
Serial.println(tcnt);
}
Dmti вне форума   Ответить с цитированием
 


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

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

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

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


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


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