วันที่โพสต์: Apr 24, 2011 2:51:26 AM
ในการติดต่อรับค่าจากสวิทช์ เพื่อให้ไมโครคอนโทรลเลอร์กระทำการบางอย่างให้เรา ในการต่อวงจรหากเราต้องการที่จะรับค่าสภาวะ 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);
}
}
}