2014-08-01 3 views
-1

Я попытался сделать перерыв в моем arduino uno борту, подключенные правильно подключены, но я не знаю, что не так с кодом. Я хочу, чтобы led1 был работающий по умолчанию, и когда я нажимаю кнопку переключателя, он останавливает работу светодиода1 и начинает делать цикл для led2. Я проверил код несколько раз, и я до сих пор не знаю ошибку в кодеarduino uno код прерывания 2 светодиода 1 переключатель

int led1 = 13; 
int led2 = 12; 
int button=0; 
boolean x = false ; 


void setup() 
{ 
    pinMode(led1, OUTPUT); 
    pinMode(led2, OUTPUT); 
    pinMode(button, INPUT); 
    attachInterrupt(button, ledchange , CHANGE); 
} 

void loop() 
{ 
    digitalWrite(led1, HIGH); // turn the LED on (HIGH is the voltage level) 
    //delay(1000);    // wait for 1000 melli-second 

} 

void ledchange() 
{ 
    x=true; 
    digitalWrite(led1,LOW); 
    for (int i=0 ; i<=5 ; i++) 
    { 
    digitalWrite(led2,HIGH); 
    delay(1000); 
    digitalWrite(led2,LOW); 
    delay(1000); 
    } 

} 

любые предложения?

+0

не использовать 'delay()' в ISR. –

+0

Вы используете D2, а не D0? – mpflaga

+0

И как общий принцип, не делайте длинных вещей в ISR. Лучше всего установить/очистить флаг, а затем проверить флаг в своем основном цикле. – Greycon

ответ

0

@TOMATO - это правильная задержка, не увеличивающая на стороне ISR, так как все прерывания отключены. Следовательно, он не выйдет.

Если вы не активируете прерывания.

void ledchange() 
{ 
    interrupts(); // re-enable interrupts so that ms may increase for following delay() 
    x=true; 
    digitalWrite(led1,LOW); 
    for (int i=0 ; i<=5 ; i++) 
    { 
    digitalWrite(led2,HIGH); 
    delay(1000); 
    digitalWrite(led2,LOW); 
    delay(1000); 
    } 

}