การติดต่อกับ 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);
      }

   }
}




รายการหน้าเว็บย่อย



Comments