การติดต่อกับ Switch ON-OFF

วันที่โพสต์: Apr 24, 2011 2:51:26 AM

การติดต่อกับ Switch ON-OFF

ในการติดต่อรับค่าจากสวิทช์ เพื่อให้ไมโครคอนโทรลเลอร์กระทำการบางอย่างให้เรา ในการต่อวงจรหากเราต้องการที่จะรับค่าสภาวะ ON-OFF จากการเปิด ปิด สวิทช์แล้ว เราสามารถที่จะต่อสวิทช์เข้ากับไมโครคอนโทรลเลอร์ โดยมีวงจรการเชื่อมต่อ 2 แบบ ให้เราเลือก ซึ่้งทั้งสองวงจรนี้ ในแง่ของอุปกรณ์แล้ว ใช้จำนวนอุปกรณ์เท่ากัน หรือเหมือนกัน แต่ลักษณะการต่อวงจรไม่เหมือนกัน และให้ค่าสัญญาณทางดิจิตอลต่างกัน

แบบที่ 1 การต่อแบบ Active High

ในการต่อแบบนี้ ในสภาวะที่หน้าสัมพัส ของสวิทช์ไม่ได้เชื่อมต่อกัน หรือสวิทช์ไม่ได้ถูกกดไว้ ทางฝั่งไมโครคอนโทรลเลอร์จะได้รับสภาวะ เป็น LOW หรือเป็น Logic 0 แต่เมื่อสวิทช์ถูกกระตุ้น หรือหน้าสัมพัสของสวิทช์ เชื่อมต่อกัน จะทำให้เกิดกระแสไฟฟ้าไหล และเกิดแรงดันที่ขาอินพุต ของไมโครคอนโทรลเลอร์ ทำให้ที่ขาของไมโครคอนโทรลเลอร์ได้รับสภาวะเป็น High หรือเป็น Logic 1

แบบที่ 2 การต่อแบบ Active Low

ในการต่อวงจรแบบนี้ ตำแหน่งของสวิทช์จะตรงกันข้ามกับการต่อแบบแรก ที่ขาอินพุตของไมโครคอนโทรลเลอร์จะได้รับสภาวะตรงกันข้ามกับแบบแรก คือ เมื่อสวิทช์ไม่ได้รับการกระตุ้น หรือหน้าสัมพัสยังไม่ได้สัมพัสกันนั้น ที่ขาอินพุตของไมโครคอนโทรลเลอร์จะได้รับสภาวะ High หรือ Logic 1 แต่เมื่อสวิทช์ได้รับการกระตุ้น หรือหน้าสัมผัสเชื่อมต่อกันแล้ว จะทำกระแสจากที่เคยไหลเข้าไมโครคอนโทรลเลอร์ ไหลลงไปที่ตำแหน่งกราวด์แทน ทำให้ที่ขาอินพุตของไมโครคอนโทรลเลอร์ได้รับสภาวะ Low หรือ Logic 0

วิธีการจดจำง่ายๆ ก็คือ

ถ้าต่อ Switch แบบ Active High เราต้องต่อ R pull down ที่ขาไมโครคอนโทรลเลอร์

ถ้าต่อ Switch แบบ Active Low เราต้องต่อ R pull up  ที่ขาไมโครคอนโทรลเลอร์

      ในการนำไปใช้ เราสามารถเลือกที่จะต่อแบบ Active Low หรือว่า Active High ก็ได้ แต่ในการเขียนโค๊ดที่ไมโครคอนโทรลเลอร์ เราจะต้องเขียนโค๊ดให้สัมพันธ์กับวงจรที่เราต่อด้วย

ตัวอย่างการนำไปใช้งาน

// Complier : PIC CCS C complie V4.106

// MCU       : PIC18F458

// By        : Mr.P

#include <18F458.h>

#define CRYSTAL 20000000 //crystal 20MHz

#fuses HS

#fuses NOLVP,NOWDT

#fuses NOPROTECT

#use delay(clock=CRYSTAL)

#use rs232(baud=9600,xmit=PIN_C6,rcv=PIN_C7)

void main(void)

{

   set_tris_b(0xff);

   set_tris_a(0x00);

  

   while(TRUE)

   {

      output_low(PIN_A0);

      output_low(PIN_A1);

      if(!input(PIN_B0))  // Active Low

      {

         delay_ms(100);

         output_high(PIN_A0);

         delay_ms(1000);

      }

      if(input(PIN_B1))   // Active High

      {

         delay_ms(100);

         output_high(PIN_A1);

         delay_ms(1000);

      }

   }

}