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, возможно, я пропустил некоторые концепции, но я читал, что прерывания не должны прерывать задержки вне прерывания

, 👍1

Обсуждение

изменчивость квалифицируется Ч., @timemage

Я не знаю, уместно ли для этого отмечать как дубликат, но взгляните на этот вопрос и приведенный там ответ. Если это поможет, то, возможно, в этом есть смысл., @timemage

@timemage да, это так - спасибо. вы хотите опубликовать ответ?, @Alexander Frey


1 ответ


2

Как и упоминал timemage, я должен был квалифицировать ch как изменчивый. итак:

volatile unsigned char CH[] = {CH1, CH2, CH3, CH4};

является ли исправление

,