Interrupt Arduino NANO แล้วโปรแกรมค้าง

Started by jingjoks, March 02, 2015, 02:56:47 PM

Previous topic - Next topic

jingjoks

มันไม่ทำงาน เวลากดปุ่ม Interrupt ครับ   รบกวนพี่ๆช่วยดูให้ผมด้วยครับ  ขอบคุณครับ.
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27, 16, 2);

int buttonStop = 3;

void setup()
{
   lcd.begin();
   Wire.begin( );
   attachInterrupt(1, SW_Stop, FALLING);
   pinMode(13, OUTPUT);
}

void loop()
{
  lcd.setCursor(0, 0);
  lcd.print("Program      ");
  digitalWrite(13, HIGH);
}


void SW_Stop()
{
  lcd.setCursor(0, 0);
  lcd.print("            Stop");
  digitalWrite(13, LOW);
}

crywolf

ต่อวงจรยังไงครับ ???

ใน Interrupt ไม่ควรใช้เวลานาน

คัวอย่างครับ

volatile int btnSTOP = 0;

void loop()
{
  lcd.setCursor(0, 0);
  lcd.print("Program      ");

if(btnSTOP == 0)
  {
    lcd.print("Start");
  }
  else
  {
    lcd.print("Stop");
  }
}

void SW_Stop()
{
  btnSTOP = !btnSTOP;
}

i2k

เวลาเกิด Interrupt เราไม่สามารถจะคาดคะเนได้ว่าจะเกิดการขัดจังหวะตรงส่วนไหนของ main loop

ถ้าเกิดการขัดจังหวะหลังคำสั่ง digitalWrite(13, HIGH); ทุกๆครั้งก็ไม่เป็นไร แต่ถ้ามันเกิดขึ้นในระหว่างนั้น มันก็จะมั่วไปหมด

พื้นฐานของโปรแกรมมิ่งเลยครับ ควรศึกษาเรื่อง Reentrancy http://en.wikipedia.org/wiki/Reentrancy_%28computing%29





หมูน้อย

หลังจากรันคำสั่งใน interrupt routine เสร็จแล้ว
Arduino จะกลับมารันคำสั่งใน loop ต่อ
จากโค้ดของท่าน jingjoks ใน Loop มีคำสั่ง digitalWrite(13, HIGH); จึงทำให้เราเห็นเป็น HIGH ตลอด
ส่วน LCD อาจจะเห็นเป็น Program  ตลอด(เดาเอาจากโค้ดนะครับ)

โค้ดส่วนที่เป็น LED ลองใช้โค้ดด้านล่าง ส่วนของ LCD ไปต่อเองนะครับ  ::)

จากโค้ดด้านล่างหลังจากที่เข้าไปรันคำสั่งใน interrupt routine เสร็จแล้ว
จะได้ค่า state ที่เปลี่ยนแปลงไป ซึงถ้าเข้ามารันใน loop ค่า output ก็จะเปลี่ยนตาม


int pin = 13;
volatile int state = LOW;

void setup()
{
  pinMode(pin, OUTPUT);
  attachInterrupt(0, blink, FALLING);
}

void loop()
{
  digitalWrite(pin, state);
}

void blink()
{
  state = !state;
}


อ้างอิงโค้ดจาก http://arduino.cc/en/Reference/AttachInterrupt

tkonline

ตอบเหมือนข้างบน Interrupt routine ควรใช้เวลาให้น้อยสุด ยิ่งไป call library อื่นจะไม่รู้ timing ว่าเสร็จเมื่อไร และจะมี interrupt ซ้อนกันไหม

code นี้ควรจะ flag ตัวแปรไว้ก่อน แล้วคอยเช็ค flag ใน main loop เพื่อ call library แทนการ call ตรงๆใน interrupt routine

แล้วก็ check bounch กับประกาศตัวแปรที่จะ flag เป็น volatile ด้วยครับ

jingjoks

ขอบคุณทุกท่านครับผม ผมจะศึกษาและทดลองดูครับ