การทดลองที่ 2 Timer/Counter

โครงสร้างของสถาปัตยกรรมแบบ 8051 ปกติแล้วจะมี 2 Timer/Counter คือ Timer 0 และ Timer 1 แต่ใน 8051 สมัยใหม่จะมีอยู่ 3 Timer/Counter ในการใช้งานเราสามารถกำหนดผ่านทาง register ได้ว่าจะให้เป็น Timer หรือ Counter

  • Timer ในการใช้งานแบบ Timer ค่า register จะเพิ่มขึ้นทีละ 1 ค่าทุก machine cycle หรือจะเรียกได้ว่าเป็นตัวนับค่า machine cycle โดยที่ค่า่ machine cycle จะมีความถี่เท่ากับ 1/12 ของความถี่ออสซิเลเตอร์
  • Counter ในการใช้งานเป็น Counter ค่า register จะเพิ่มขึ้นทีละ 1 ค่า เมื่อสัญญาณมีการเปลี่ยนแปลงจาก Logic “1″ เป็น “0″ ที่ขา T0 (P3.4), T1(P3.5) หรือT2(P1.0) ทุก machine cycle จะมีการสุ่มค่าขึ้นมาเพื่อตรวจสอบสถานะ Logic ถ้า machine cycle นี้ มี Logic “1″ แล้ว machine cycle ถัดไปมี Logic “0″ จะทำให้ค่า Counter เพิ่มขึ้น 1 ค่า เพื่อให้แน่ใจว่าสัญญาณที่เข้ามาถูกต้อง สัญญาณจะต้องมีคาบเวลาอย่างน้อย 1 machine cycle

การประยุกต์ใช้งาน Timer

เราสามารถนำ Timer มาประยุกต์ใช้งานในงานที่ต้องการช่วงเวลาที่แน่นอน เช่นการ scan display แบบ 7 Segment หรือนำ microcontroller มาใช้งานเป็น RTC (Real Time Clock)

การประยุกต์ใช้งาน Counter

เราสามารถนำเซ็นเซอร์มาต่อเข้ากับขา T1-T3 เพื่อใช้ Counter เป็นตัวนับ เคยมีงานอยู่ชิ้นนึงที่ผมเคยทำมา เป็นการเอา Counter ไปนับการเต้นของหัวใจ งานแบบนี้ถ้าต้องการความเที่ยงตรงก็ใช้ XTAL ที่เป็นจำนวนเท่าของ 12 เช่น 12 MHz หรือ 24 MHz เพราะว่าความถี่ของ machine cycle = Fosc/12

รูปที่ 1 ตำแหน่งขาของ 89S52

null

รูปที่ 2 Timer in Capture Mode

null

รูปที่ 3 Timer 2 auto reload (DCEN = 0)

null

รูปที่ 4 Timer 2 auto reload (DCEN = 1)

null

รูปที่ 5 Timer 2 in Baud Rate Generator Mode

null

รูปที่ 6 Timer 2 in Clock-Out Mode

การใช้ Timer หน่วงเวลา

ในการเขียนโปรแกรมหน่วงเวลาให้กับไมโครคอนโทรลเลอร์นั้น ปกติเราจะใช้วิธีวนลูปไปเรื่อยๆ วิธีนี้ใช้ได้ง่ายแต่ค่าเวลาที่ถูกหน่วงนั้นเราจะคำนวณได้ยาก ในการหน่วงเวลาที่ต้องการความแม่นยำอาจใช้ Timer ช่วยในการหน่วงเวลาวิธีนี้มีการคำนวณเล็กน้อย ตามปกติแล้ว Timer จะ overflow ที่ค่า 0xFFFF ซึ่งเท่ากับ 65535 ในเลขฐาน 10 ดังนั้นเวลาที่ถูกหน่วงคือช่วงเวลาตั้งแต่ที่เริ่มทำการนับจบถึงเวลาที่ overflow โดยทั่วไปแล้ว MCS-51 ทำงานหนึ่ง machine cycle ใช้เวลา 1/12 ของความถี่คริสตัล ถ้าคริสตัลมีความถี่ 12 MHz แล้ว MCS-51 จะใช้เวลา 1 machine cycle เท่ากับ 1 uS ถ้าต้องการให้หน่วงเวลาไป 10 mS จะต้องคำนวณดังนี้

1. หาจำนวน machine cycle ที่ทำให้เกิดการ overflow

จำนวน machine cycle = เวลาที่หน่วง / เวลา1machine cycle

จำนวนสัญญาณนาฬิกา = 10mS/1uS = 10,000

2. กำหนดค่าเริ่มต้นให้กับรีจิสเตอร์ Timer

ค่าเริ่มต้น (TH0,TL0) = 65,535 – จำนวน machine cycle

= 65,535 – 10,000 = 55,535 = 0xD8EF

TH0 = D8

TL0 = EF

//************************************************************************//
//Project : LAB2
//Description : Timer/Counter
//Device : 89S52
//XTAL : 11.0592 MHz
//By : ThaiEmbedded 2007
//************************************************************************//
#include <REGX51.H>//————————————————————————//
// Delay (mSec)
//————————————————————————//
/*
1 MC = 12/11.0592MHz = 1.0850694 uSec
1000 uSec = 1 mSec = 921.6 –> ~922
65535-921 = 64614 = 0xFC66
*/
void dmsec(unsigned char time)
{
unsigned char i;
for (i=0;i<time;i++)
{
TH0 = 0xFC;
TL0 = 0×66+4; ????????????????????//+4 For move & compare instruction
TF0 = 0;
TR0 = 1;
while(TF0 == 0);
TR0 = 0;
}
}
//————————————————————————//
// Main
//————————————————————————//
void main()
{
TMOD = 0×01;?????????????????????????//Timer 16 bit
while(1)
{
P0 = 0×01;
dmsec(1);??????????P0 = 0×02;
dmsec(100);
}
}

Download Code การทดลองที่ 2