Тогда делай переменные статуса каждого триака и в прерываниях проверяй их статусы, если например статус 1-го триакаTRUE то резрешаем его включить и т.д.
Вид для печати
Тогда делай переменные статуса каждого триака и в прерываниях проверяй их статусы, если например статус 1-го триакаTRUE то резрешаем его включить и т.д.
брр... толи я вообще нифига не понимаю.. толи пипец.. (
можно привер кода? или хоть где можно об этом почитать?
так.. ладно.. с этим буду разбираться позже..
что на счет датчика тока? Давайте какбы пробовать чтонить на нем сделать...
битая ссылка..
Я ее убрал ,потому как код не проверенный, не факт что работоспособный Хочу собрать устройство и проверить прежде чем выкладывать
Вернусь к этому вопросу... Диммер сделали, но то что изначально я хотел так и не получается :(
1. Перепробовал разные способы, но добиться включения и отключения прерывания по требованию (с подпрограммы) я не смог.
2. Сделать бегущий огонь с плавным включением и выключением светодиодов в принципе можно (менять в подпрограмме AC_pin), но вот как быть, если хочется сразу 2-е лампы плавно включать и отключать?
3. А реально ли сделать выход с любого цикла, любой подпрограммы, например по нажатию кнопки на loop (что-то типа ресета, в начало всей программы)?
Прошу помощи. Саму цветомузыкальное устройство сделал, но вот без плавного зажига ламп как-то не совсем иестественно... хотелось бы до НГ доделать.
Всю схему устройства нарисовать сложно, так как она вышла довольно большая. Все это подготовлю и выложу отдельным проэктом, когда хоть на 90% закончу.
Но вот давайте возьмем схему с первого поста, силовая часть у меня на ее основе. просто там не одна связка оптрон+симистор, а 6шт.
На счет скетча, то он тоже большой, так как там для конкретно этого вопроса очень много лишнего (в моем устройстве есть LCD, который через шифт-регистор подключен, да и сам выход тоже через шифт). Так что я здесь выкладываю только то, что касается именно этого вопроса. Так как сейчас на работе, то точный скетч без ошибок не могу дать, но думаю идея в нем будет понятная:
Т.э. смысл в том, чтобы когда нужно, была возможность включить: attachInterrupt(0, FrontUp, RISING);, когда не нужно - выключить: detachInterrupt(0);Цитата:
#include <avr/delay.h>
int AC_pin = 10; // выход для симистора
volatile uint16_t dim;
uint8_t dimmer=0;// уровень димирования (0-255) 0 = max, 255 = min
void setup()
{
pinMode(AC_pin, OUTPUT);
}
void loop()
{
PlavniyOgon();
}
void PlavniyOgon(){
attachInterrupt(0, FrontUp, RISING); //прерывание по изменению уровня с низкого на высокий
for (int i=1; i<6; i++){
AC_pin=i;
if(dimmer < 255) dimmer++; else dimmer=0; // уменьшения яркости лампы
dim=33*dimmer;
delay(50);
}
AC_pin=i+1;
if(dimmer > 0) dimmer--; else dimmer=0; // увеличение яркости лампы
dim=33*dimmer;
delay(50);
}
detachInterrupt(0);
}
// Функция обработки прерывания на подъем
void FrontUp()
{
detachInterrupt(0);
_delay_us(dim+1000); // отсекаем лишнее
digitalWrite(AC_pin, HIGH); // включить симистор
_delay_us(20); // короткая пауза, чтобы обеспечить включение симистора
digitalWrite(AC_pin, LOW); // выключение симистора(он выключится когда полупериод достигнет нуля)
attachInterrupt(0, FrontDown, FALLING);
}
// Функция обработки прерывания на спад
void FrontDown()
{
detachInterrupt(0);
_delay_us(dim); // отсекаем лишнее
digitalWrite(AC_pin, HIGH); // включить симистор
_delay_us(20); // короткая пауза, чтобы обеспечить включение симистора
digitalWrite(AC_pin, LOW); // выключение симистора(он выключится
attachInterrupt(0, FrontUp, RISING);
}
В приведенном выше коде не получается такое реализовать.
Хэх.. вот только что попробовал снова... интересно.. но уже можно сказать это работает... странно что раньше не работало.. мо что-то не так было.
Остается вопрос как сделать чтобы несколько сразу тухло и зажигалось... оптимальный код... хотя как с большим кодом вроде как понимаю.
Да, и еще.. спрашивал раньше, можно ли с любой подпрограммы или цикла выйти по какому-то событию, типа ресет сделать?
Для прерывания цикла используй Break
Цитата:
Break используется для принудительного выхода из циклов do, for или while, не дожидаясь завершения цикла по условию. Он также используется для выхода из оператора switch