การใช้งานไมโครคอนโทรลเลอร์ไม่ว่าจะนำไปประยุกต์ใช้งานในด้านใดก็ตามต้องมีการเขียนโปรแกรมในส่วนการหน่วงเวลา ทั้งนี้ก็เพราะว่าไมโครคอนโทรลเลอร์ใช้เวลาในการทำงานในแต่ละคำสั่งสั้นมาก ในการทดลองนี้เป็นการศึกษาวิธีการเขียนโปรแกรมหน่วงเวลาเพื่อให้เหมาะกับงานที่จะนำไปใช้งาน
การเขียนโปรแกรมหน่วงเวลาสามารถทำได้ 2 แบบคือ
1. การหน่วงเวลาโดยอาศัยการคำนวณทางคณิตศาสตร์
2. การหน่วงเวลาโดยอาศัยการทำงานของวงจรไทเมอร์เคาน์เตอร์
การหน่วงเวลาโดยอาศัยการคำนวณทางคณิตศาสตร์
เป็นการเขียนฟังก์ชั่นเพื่อให้ไมโครคอนโทรลเลอร์ไปคำนวณคณิตศาสตร์(นับเลข) ซึ่งผู้เขียนโปรแกรมสามารถใช้ฟังก์ชั่นได้หลายแบบขึ้นอยู่กับเทคนิคของแต่ละท่าน สำหรับในที่นี้ของแนะนำการใช้ฟังก์ชั่น For โดยมีผังไหลดังรูป
ตัวโปรแกรมจะได้ดังนี้
void delay(void)
{
int x;
for(x=0;x<1000;x++)
{}
}
เวลาเรียกใช้งานใช้รูปแบบ delay();
ในทางปฏิบัติการใช้ for เพียงครั้งเดียวจะใช้สำหรับหน่วงเวลาสั้นๆเท่านั้น หากต้องการหน่วงเวลามากขึ้นจะใช้ฟังก์ชั่น for ซ้อนอีกชั้นและให้มีการรับค่ากำหนดเวลาเข้าฟังก์ชั่นเพื่อให้สามารถหน่วงเวลาได้หลากหลายค่า ดังนี้
void delay(int n)
{
int x,y;
for(x=0;x<n;x++)
{
for(y=0;y<500;y++)
{
}
}
}
เวลาเรียกใช้งานใช้รูปแบบ delay(100); จะหน่วงเวลาน้อยกว่า delay(200); เนื่องจากค่าที่ส่งเข้าไปในฟังก์ชั่น
การหน่วงเวลาโดยอาศัยการทำงานของวงจรไทเมอร์เคาน์เตอร์
ไมโครคอนโทรลเลอร์มีวงจรไทเมอร์เคาน์เตอร์อยู่ภายในตัวซึ่งวงจรนี้ทำงานได้ 2 แบบขึ้นอยู่กับแหล่งสัญญาณนาฬิการที่ป้อนให้วงจร หากใช้สัญญาณนาฬิกาจากภายใน(คริสเตอร์ที่ใช้งาน) วงจรจะทำหน้าที่เป็นวงจรไทเมอร์ แต่หากใช้สัญญาณนาฬิกาจากภายนอกก็จะเป็นวงจรนับสัญญาณหรือที่เรียกว่าวงจรเคาน์เตอร์
วงจรไทเมอร์เคาน์เตอร์มีโหมดการทำงานอยู่ด้วยกัน 4 โหมดคือโหมด 0 ถึงโหมด 3 แต่ที่มักใช้กันบ่อยมี 2 โหมดคือ
โหมด 1 ใช้ในการหน่วงเวลา
โหมด 2ใช้ในการกำหนดค่าอัตราบอด (Baud Rate)
ในการกำหนดโหมดกำหนดที่รีจิสเตอร์ TMOD
เมื่อกำหนดโหมด 1 สำหรับวงจรไทเมอร์ 0 ใช้คำสั่ง
TMOD=0x01;
เมื่อกำหนดโหมด 1 สำหรับวงจรไทเมอร์ 1 ใช้คำสั่ง
TMOD=0x10;
เมื่อกำหนดโหมด 1 สำหรับวงจรไทเมอร์ 0 และ วงจรไทเมอร์ 1 ใช้คำสั่ง
TMOD=0x11;
วงจรในโหมด 1 (จากรูปยกตัวอย่างเพียงวงจรไทเมอร์ 1เท่านั้น)
บิตที่ใช้ควบคุมและตรวจสอบมี 2 บิตคือTR1 (วงจรไมเมอร์ 0 คือบิต TR0) ซึ่งเป็นบิตควบคุมการทำงาน(ตัดต่อสวิตช์ดังรูป) และบิตแสดงผลเมื่อทำงานครบคือ TF1ตัวอย่างโปรแกรมหน่วงเวลาดังนี้
void delay(void)
{
int i;
TMOD=0x10;
for(i=0;i<50;i++)
{
TH1=0xDC;
TL1=0x00;
TF1=0;
TR1=1;
while(TF1==0)
{}
TR1=0;
}
}
ซึ่งการกำหนดค่าในรีจิสเตอร์ TH,TL เป็นการกำหนดคาบเวลาในการทำงานในแต่ละครั้งของวงจรไทเมอร์
ค่า THTL คือค่าที่ต้องกำหนดลงในรีจิสเตอร์ สำหรับในการคำนวณจะคำนวณเป็นเลขฐานสิบก่อนเมื่อนำไปใช้งานถึงเปลี่ยนเป็นเลขฐาน 16 แล้วแยกใช้งานโดยสองหลักหลังจะกำหนดในรีจิสเตอร์ TLและสองหลักหน้าจะไว้ใน TH
ถ้าใช้คริสตอล 11.0592MHz และ 12MHz จะได้ดังนี้
ต่อครับ
ในการคำนวณจริงๆค่าที่ได้จะไม่ลงตัวทั้งนี้อันเนื่องมาจากค่าคริสตอล (ค่าในตารางเป็นค่าที่ปัดเศษแล้วครับ)
โปรดติดตามบทความอื่นๆในตอนต่อไป
ครูประภาส สุวรรณเพชร