วันพุธที่ 24 กุมภาพันธ์ พ.ศ. 2559

การใช้ Interrupt รับค่าสวิทช์บน Raspberry Pi

การใช้ Interrupt รับค่าสวิทช์บน Raspberry Pi

Interrupt หรือ การขัดจังหวะ ถูกนำมาใช้ในการรับข้อมูลจากภายนอกทันทีเมื่อเข้ามา ไม่ว่าระบบจะทำอะไรอยู่ หากมีข้อมูลเข้ามาที่ Port Interrupt แล้วล่ะก็ ระบบจะหยุดงานอื่นก่อน แล้วทำการรับข้อมูลจาก Port Interrupt ก่อนเสมอ
เรามาดูตัวอย่างในภาษา C กัน
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <stdlib.h>
#include <wiringPi.h>
// ตัวอย่างนี้เราจะใช้ GPIO ขา 16 ซึ่งก็คือ GPIO4 ในไลบรารี่ของ wiringPi (ดูวิธีการติดตั้ง wiringPi บน Raspberry Pi)
#define BUTTON_PIN 4
// กำหนดค่าตัวแปรของตัวนับ 
volatile int eventCounter = 0;
// ————————————————————————-
// โปรแกรมย่อย myInterrupt: จะถูกเรียกทุกครั้งเมื่อถูก Interrupt
void myInterrupt(void) {
     eventCounter++;
     delay(40); // หน่วงเวลาช่วง Debouncing ของสวิทช์
}
// ————————————————————————-
// main
int main(void) {
     // เรียกใช้งานไลบรารี่ของ wiringPi
     if (wiringPiSetup () < 0) {
          fprintf (stderr, “Unable to setup wiringPi: %s\n”, strerror (errno));
          return 1;
     }
     // กำหนดขา 16 หรือ GPIO4 ให้รับค่า Interrupt เมื่อมีการเปลี่ยนสถานะจาก High เป็น Low หรือการทำงานขอบขาลง แล้วเรียกใช้งานโปรแกรมย่อย myInterrupt()
     if ( wiringPiISR (BUTTON_PIN, INT_EDGE_FALLING, &myInterrupt) < 0) {
          fprintf (stderr, “Unable to setup ISR: %s\n”, strerror (errno));
          return 1;
     }
     // แสดงค่าที่นับได้ทุกๆ 1 วินาที
     while ( 1 ) {
          printf( “%d\n”, eventCounter );
          delay( 1000 ); // หน่วงเวลารอ 1 วินาที แล้วแสดงค่าอีกครั้ง
     }
     return 0;
}
โปรแกรมนี้เป็นโปรแกรมทดสอบการ Interrupt โดยรับค่าจาก Switch เมื่อเรากด Switch จะทำให้แรงดันเปลี่ยนจาก High เป็น Low ซึ่งถ้าเรามองในรูปของสัญญาณแบบดิจิทัลแล้วมันคือการทำงานของขอบขาลง (Falling Edge) นั่นเอง เมื่อโปรแกรม Interrupt ตรวจพบขอบขาลงของสัญญาณ โปรแกรมจะไปเรียกใช้งานโปรแกรมย่อย myInterrupt ทันที แม้ว่าช่วงนั้นโปรแกรมหลัก (main) จะทำการหน่วงเวลา 1 วินาทีอยู่ เช่น เริ่มต้นทำงานค่าที่แสดงต้องเป็น 0 แล้วเราทำการกดปุ่มเร็วๆสัก 3 ครั้งใน 1 วินาที โปรแกรมจะต้องแสดงค่าถัดไปคือ 3 เลย เช่น
0
3
ไม่ใช่แสดง
0
1
2
3
และถ้าเรากดค้างไว้ โปรแกรมจะต้องแสดงค่าเพิ่มแค่ 1 เนื่องจากเกิดขอบขาลงเพียงครั้งเดียวจากการกดปุ่ม
4
4
4
ไม่ใช่
4
5
6
ดังนั้นแล้วโปรแกรม Interrupt จึงสามารถนับจำนวนการกดได้อย่างแม่นยำกว่าโปรแกรมที่ตรวจสอบการกดปุ่มธรรมดา

ไม่มีความคิดเห็น:

แสดงความคิดเห็น