Тогда делай переменные статуса каждого триака и в прерываниях проверяй их статусы, если например статус 1-го триакаTRUE то резрешаем его включить и т.д.
Тогда делай переменные статуса каждого триака и в прерываниях проверяй их статусы, если например статус 1-го триакаTRUE то резрешаем его включить и т.д.
брр... толи я вообще нифига не понимаю.. толи пипец.. (
можно привер кода? или хоть где можно об этом почитать?
так.. ладно.. с этим буду разбираться позже..
что на счет датчика тока? Давайте какбы пробовать чтонить на нем сделать...
битая ссылка..
Я ее убрал ,потому как код не проверенный, не факт что работоспособный Хочу собрать устройство и проверить прежде чем выкладывать
Вернусь к этому вопросу... Диммер сделали, но то что изначально я хотел так и не получается
1. Перепробовал разные способы, но добиться включения и отключения прерывания по требованию (с подпрограммы) я не смог.
2. Сделать бегущий огонь с плавным включением и выключением светодиодов в принципе можно (менять в подпрограмме AC_pin), но вот как быть, если хочется сразу 2-е лампы плавно включать и отключать?
3. А реально ли сделать выход с любого цикла, любой подпрограммы, например по нажатию кнопки на loop (что-то типа ресета, в начало всей программы)?
Прошу помощи. Саму цветомузыкальное устройство сделал, но вот без плавного зажига ламп как-то не совсем иестественно... хотелось бы до НГ доделать.
Последний раз редактировалось knyaz2020; 29.12.2011 в 15:17.
Мои проекты - Катер для рыбалки
Всю схему устройства нарисовать сложно, так как она вышла довольно большая. Все это подготовлю и выложу отдельным проэктом, когда хоть на 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);
}
В приведенном выше коде не получается такое реализовать.
Хэх.. вот только что попробовал снова... интересно.. но уже можно сказать это работает... странно что раньше не работало.. мо что-то не так было.
Остается вопрос как сделать чтобы несколько сразу тухло и зажигалось... оптимальный код... хотя как с большим кодом вроде как понимаю.
Да, и еще.. спрашивал раньше, можно ли с любой подпрограммы или цикла выйти по какому-то событию, типа ресет сделать?
Последний раз редактировалось knyaz2020; 30.12.2011 в 01:44.
Для прерывания цикла используй Break
Break используется для принудительного выхода из циклов do, for или while, не дожидаясь завершения цикла по условию. Он также используется для выхода из оператора switch
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)