ทดลอง MCU ตอนที่ 5 (Delay)

การใช้งานไมโครคอนโทรลเลอร์ไม่ว่าจะนำไปประยุกต์ใช้งานในด้านใดก็ตามต้องมีการเขียนโปรแกรมในส่วนการหน่วงเวลา ทั้งนี้ก็เพราะว่าไมโครคอนโทรลเลอร์ใช้เวลาในการทำงานในแต่ละคำสั่งสั้นมาก ในการทดลองนี้เป็นการศึกษาวิธีการเขียนโปรแกรมหน่วงเวลาเพื่อให้เหมาะกับงานที่จะนำไปใช้งาน

 

การเขียนโปรแกรมหน่วงเวลาสามารถทำได้ 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 จะได้ดังนี้

ต่อครับ

ในการคำนวณจริงๆค่าที่ได้จะไม่ลงตัวทั้งนี้อันเนื่องมาจากค่าคริสตอล (ค่าในตารางเป็นค่าที่ปัดเศษแล้วครับ)

 

 โปรดติดตามบทความอื่นๆในตอนต่อไป
    ครูประภาส สุวรรณเพชร