Arduino Nano пропускает инструкции после прерывания
Я использую Arduino для управления схемой управления фазой переменного тока для управления некоторыми лампами.
Проблема в том, что прерывания, похоже, нарушают код внутри цикла()
.
Этот код должен просто мигнуть одной лампой. Но это не так!
Что я узнал до сих пор:
Индикатор всегда имеет уровень dim_level[22]
, поэтому кажется, что (по крайней мере, первая) задержка в цикле
пропущена.
Странная вещь:
Когда я добавляю заявление, которое занимает некоторое время между задержками, все работает
Например
void loop() {
CH[0] = dim_level[0];
Serial.println("---------------------------------------------------------");
delay(500);
CH[0] = dim_level[22];
Serial.println("---------------------------------------------------------");
delay(500);
}
Неработающий код:
#include <TimerOne.h>
unsigned char channel_1 = 7; // Output to Opto Triac pin, channel 1
unsigned char channel_2 = 6; // Output to Opto Triac pin, channel 2
unsigned char channel_3 = 5; // Output to Opto Triac pin, channel 3
unsigned char channel_4 = 4; // Output to Opto Triac pin, channel 4
unsigned char CH1, CH2, CH3, CH4;
unsigned char i = 0;
unsigned char delay_time = 1; // delay ms or flashing SPEED
unsigned char clock_tick; // variable for Timer1
unsigned char CHANNEL_SELECT; // variable for channel select
unsigned char CH[] = {CH1, CH2, CH3, CH4};
unsigned char dim_level[] = {5, 8, 10, 12, 15, 18, 20, 25, 30, 35, 45, 50, 55, 60, 65, 70, 75, 80, 82, 85, 88, 92, 95}; // don't use this massive for 60Hz
// create new massive for 60Hz
void setup() {
Serial.begin(2000000);
pinMode(channel_1, OUTPUT);// Set AC Load pin as output
pinMode(channel_2, OUTPUT);// Set AC Load pin as output
pinMode(channel_3, OUTPUT);// Set AC Load pin as output
pinMode(channel_4, OUTPUT);// Set AC Load pin as output
attachInterrupt(1, zero_crosss_int, RISING);
Timer1.initialize(100); // set a timer of length 100 microseconds for 50Hz or 83 microseconds for 60Hz;
Timer1.attachInterrupt( timerIsr ); // attach the service routine here
}
void timerIsr()
{
clock_tick++;
if (CH[0] == clock_tick)
{
digitalWrite(channel_1, HIGH); // triac firing
delayMicroseconds(10); // triac On propogation delay (for 60Hz use 8.33)
digitalWrite(channel_1, LOW); // triac Off
}
if (CH[1] == clock_tick)
{
digitalWrite(channel_2, HIGH); // triac firing
delayMicroseconds(10); // triac On propogation delay (for 60Hz use 8.33)
digitalWrite(channel_2, LOW); // triac Off
}
if (CH[2] == clock_tick)
{
digitalWrite(channel_3, HIGH); // triac firing
delayMicroseconds(10); // triac On propogation delay (for 60Hz use 8.33)
digitalWrite(channel_3, LOW); // triac Off
}
if (CH[3] == clock_tick)
{
digitalWrite(channel_4, HIGH); // triac firing
delayMicroseconds(10); // triac On propogation delay (for 60Hz use 8.33)
digitalWrite(channel_4, LOW); // triac Off
}
}
void zero_crosss_int() // function to be fired at the zero crossing to dim the light
{
clock_tick = 0;
}
void loop() {
CH[0] = dim_level[0];
delay(500);
CH[0] = dim_level[22];
delay(500);
}
Я новичок в arduino, возможно, я пропустил некоторые концепции, но я читал, что прерывания не должны прерывать задержки вне прерывания
@Alexander Frey, 👍1
Обсуждение1 ответ
Как и упоминал timemage, я должен был квалифицировать ch
как изменчивый
.
итак:
volatile unsigned char CH[] = {CH1, CH2, CH3, CH4};
является ли исправление
- Как сгенерировать аппаратное прерывание в mpu6050 для пробуждения Arduino из режима SLEEP_MODE_PWR_DOWN?
- Arduino непрерывно считывает значение АЦП с помощью прерывания
- Как правильно использовать volatile переменные в Arduino?
- Как прервать функцию цикла и перезапустить ее?
- 4-битный счетчик вверх и вниз
- Включить и отключить отдельные прерывания
- Управление функцией включения на драйвере микрошагового устройства
- Захват прерывания на обоих фронтах, когда он установлен на RISING или FALLING
изменчивость
квалифицируется Ч., @timemageЯ не знаю, уместно ли для этого отмечать как дубликат, но взгляните на этот вопрос и приведенный там ответ. Если это поможет, то, возможно, в этом есть смысл., @timemage
@timemage да, это так - спасибо. вы хотите опубликовать ответ?, @Alexander Frey