วันพฤหัสบดีที่ 25 มิถุนายน พ.ศ. 2558

TIMER1 OVF INTERRUPT ตอน4หน่วงเวลาการนับด้วยPRESCALERในAVRSTUDIO




TIMER1 OVF INTERRUPT ตอน4หน่วงเวลาการนับด้วยPRESCALERในAVRSTUDIO
25/6/2558 SONGCHAI PRAPATRUNGSEE
TIMER1 OVF INTERRUPT ตอน4หน่วงเวลาการนับด้วยPRESCALERในAVRSTUDIO

สูตรหาค่านับของTIMER/COUNTER OVERFLOW
จำนวนครั้งการนับ =
เวลาที่ต้องการอินเทอร์รัพท์ / ((1/F)*PRESCALER))

Start Debug ก่อน
1 คลิก Debug
2 ชี้ Windows
3 คลิก I/O View
4 คลิก TIMER_COUNTER_1
5 คลิก Prescaler source
จากนั้นก็ทำการจำลองได้แล้ว

AVRSTUDIO
ไมโครคอนโทรลเลอร์ตระกูลAVR
1CLOCK = 1INSTRUCTION
ความถี่ขึ้น1ครั้งลง1ครั้งเรียกว่า 1CLOCKหรือ1CYCLE
1INSTRUCTION =การทำงานของไมโครคอนโทรลเลอร์1ครั้ง

TIMER/COUNTER1 มี16บิท คือ65536ค่า(0-65535)
ดังนั้นการโอเวอร์โฟลว์สูงสุด
ของ TIMER/COUNTER1 คือ65536ครั้ง
ค่าสูงสุดของ16บิทคือ65535
พอนับครั้งที่65536 ก็จะเป็นการนับโอเวอร์โฟลว์
โอเวอร์โฟลว์ หมายถึงการนับเกินนั่นเอง
  เมื่อเกิดการโอเวอร์โฟลว์
ไมโครคอนโทรลเลอร์ก็จะเซ็ทบิทFLAGเป็น1
หรือยกธงขึ้นนั่นเอง
หลังจากยกธงขึ้นแล้ว
ก็จะกระโดดจากฟังค์ชันหลักหรือฟังค์ชันmainทันที
มาเข้าที่ฟังชันอินเทอร์รัพท์
เมื่อเข้ามาที่ฟังชันอินเทอร์รัพท์แล้ว
ไมโครคอนโทรลเลอร์ก็จะเซ็ทFLAGเป็น0
หรือยกธงลงโดยอัตโนมัติ
การยกธงลงเพื่อให้สามารถทำงานอินเทอร์รัพท์
ในรอบต่อไปได้
  หลังจากทำงานในฟังชันอินเทอร์รัพท์เสร็จแล้ว
ก็จะกลับเข้าไปที่ฟังค์ชันหลักหรือฟังค์ชันmain
เพื่อทำงานที่ค้างไว้ในฟังชันหลักต่อไป

เวลาสูงสุดที่จะโอเวอร์โฟลว์
คือ 65536 X 0.125US =8192US(ไมโครวินาที)
ถ้าต้องการให้เวลายาวนานกว่านี้
ก็สามารถใช้ปรีสเกลเลอร์เพิ่มเวลาการนับขึ้นมาได้
ปรีสเกลเลอร์คือการเพิ่มเวลาการนับTIMERนั่นเอง

สมมุติว่าใช้CRYSTAL 8MHZ
ก็หมายความว่า ความถี่8MHZทำงาน1ครั้งนั่นเอง
ยิ่งความถี่สูงก็ยิ่งทำงานเร็วนั่นเอง

สูตรหาเวลา T =1/HZ
เวลา =1/ความถี่
1/8MHZ = 0.125US (ไมโครวินาที)
หมายถึง การทำงาน1ครั้งของAVR คือ0.125US
  ถ้าใช้PRESCALERขนาด1
ก็หมายความว่าไม่มีPRESCALERนั่นเอง
เพราะ1คูณอะไรก็ได้ค่าตามที่มาคูณกันนั่นเอง
    ถ้าใช้PRESCALERขนาด1024
ก็จะได้เวลาการนับ1ครั้ง
เพิ่มขึ้นเป็น 0.125 X 1024 = 128US(ไมโครวินาที)
และเวลาที่จะได้สูงสุดในการโอเวอร์โฟลว์
คือการนับสูงสุด 65536ครั้ง
= 65536 X 128 =8388608USหรือ8.388SEC(วินาที)
  ถ้าต้องการให้โอเวอร์โฟลว์ทุกๆ1วินาที
ก็เอา1วินาที ตั้ง
แล้วเอา128US หาร
ก็จะได้เท่ากับ 7812.5ครั้ง ปัดเศษเป็น7813ครั้ง
  เอาค่าสูงสุด16บิท65536 - 7813ครั้ง
ก็จะได้ค่าเริ่มต้นการนับดังนี้
=57723
=0XE17B
= TCNT1H=E1;
= TCNT1L=7B;
 
ถ้าไม่ใช้PRESCALER
ก็ไม่ต้องคูณด้วยPrescalerนั่นเองก็จะได้ดังนี้
1/8MHZ=0.125US
ถ้าต้องการอินเทอร์รัพท์ทุกๆ5MS
=5MS/0.125US =นับ40000ครั้งก็จะได้5MS
TIMER1ค่าสูงสุดที่จะโอเวอร์โฟลว์คือ65536
=65536-40000 =25536
=0X63C0
=TCNT1H =0X63
=TCNT1L =0XC0

SOURCE CODE
/*
 * TIMER1_OVF_INTERRUPT_PRESCALER .C
 *
 * Created: 25/6/2558 18:35:45
 *  Author: sc
 */


#include <avr/io.h>//REGISTER OF AVR
#include <avr/interrupt.h>//INTERRUPT SERVICE ROUTINE

int main(void)
      //sei();//GLOBAL INTERRUPT ENABLE
      SREG=1<<7;//GLOBAL INTERRUPT ENABLE
     
    //T/C1 CONTROLL PRESCALER, IF CS10-3=0 T/C1 STOP
    TCCR1B = (1<<CS12)|(0<<CS11)|(1<<CS10);
    
    TIMSK = 1<<TOIE1;//T/C1 OVERFLOW INTERRUPT ENABLE
  
      TCNT1H=0XE1;//HIGH BYTE T/C1
      TCNT1L=0X7B;//LOW BYTE T/C1
     
    DDRA=255;//PORTA ALL OUTPUT
  
    while(1)
    {
    PORTB=255;
    } 
}

ISR(TIMER1_OVF_vect)
{
    TCNT1H=0XE1;//HIGH BYTE T/C1
    TCNT1L=0X7B;//LOW BYTE T/C1
    PORTA=~PORTA;//TOGGLE PORTA

}


ไม่มีความคิดเห็น: