TIMER0 OVF INTERRUPT ตอน2DEBUGจำลองการทำงาน
22/6/2558 SONGCHAI
PRAPATRUNGSEE
TIMER0 OVF INTERRUPT ตอน2DEBUGจำลองการทำงาน
สูตรหาค่านับของ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/COUNTER0 มี8บิท คือ256ค่า(0-255)
ดังนั้นการโอเวอร์โฟลว์สูงสุด
ของ TIMER/COUNTER0 คือ256ครั้ง
ค่าสูงสุดของ8บิท คือ255
พอนับครั้งที่256 ก็จะเป็นการนับโอเวอร์โฟลว์
โอเวอร์โฟลว์ หมายถึงการนับเกินนั่นเอง
เมื่อเกิดการโอเวอร์โฟลว์
ไมโครคอนโทรลเลอร์ก็จะเซ็ทบิทFLAGเป็น1
หรือยกธงขึ้นนั่นเอง
หลังจากยกธงขึ้นแล้ว
ก็จะกระโดดจากฟังค์ชันหลักหรือฟังค์ชันmainทันที
มาเข้าที่ฟังชันอินเทอร์รัพท์
เมื่อเข้ามาที่ฟังชันอินเทอร์รัพท์แล้ว
ไมโครคอนโทรลเลอร์ก็จะเซ็ทFLAGเป็น0
หรือยกธงลงโดยอัตโนมัติ
การยกธงลงเพื่อให้สามารถทำงานอินเทอร์รัพท์
ในรอบต่อไปได้
หลังจากทำงานในฟังชันอินเทอร์รัพท์เสร็จแล้ว
ก็จะกลับเข้าไปที่ฟังค์ชันหลักหรือฟังค์ชันmain
เพื่อทำงานที่ค้างไว้ในฟังชันหลักต่อไป
เวลาสูงสุดที่จะโอเวอร์โฟลว์
คือ 256 X
0.125US =32US(ไมโครวินาที)
ถ้าต้องการให้เวลายาวนานกว่านี้
ก็สามารถใช้ปรีสเกลเลอร์เพิ่มเวลาการนับขึ้นมาได้
ปรีสเกลเลอร์คือการเพิ่มเวลาการนับใน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(ไมโครวินาที)
และเวลาที่จะได้สูงสุดในการโอเวอร์โฟลว์
คือการนับสูงสุด 256ครั้ง
= 256 X 128
=32768USหรือ32.768MS(มิลลิวินาที)
ถ้าต้องการให้โอเวอร์โฟลว์ทุกๆ5MS(มิลลิวินาที)
ก็เอา5MS ตั้ง
แล้วเอา128US หาร
ก็จะได้เท่ากับ 39.0625ครั้ง
ปัดเศษเป็น39หรือ40ครั้ง
เอาค่าสูงสุด8บิท256 - 40ครั้ง
ก็จะได้ค่าเริ่มต้นการนับดังนี้
= 216
= 0XD8
= TCNT2=0XD8;
ถ้าไม่ใช้PRESCALER
ก็ไม่ต้องคูณด้วยPrescalerนั่นเองก็จะได้ดังนี้
1/8MHZ=0.125US
ถ้าต้องการอินเทอร์รัพท์ทุกๆ32US
=32US/0.125US =นับ256ครั้งก็จะได้32US
TIMER0ค่าสูงสุดที่จะโอเวอร์โฟลว์คือ256
=256-256 =0
=0X00
=TCNT0 =0X00
SOURCE CODE
/*
*
TIMER0_OVF_INTERRUPT.c
*
* Created:
22/6/2558 9:35:45
* Author: sc
*/
#include <avr/io.h>//REGISTER OF AVR
#include <avr/interrupt.h>//INTERRUPT SERVICE
ROUTINE
int main(void)
{
//T/C0
CONTROLL PRESCALER, IF CS00-3=0 T/C0 STOP
TCCR0 =
(0<<CS02)|(0<<CS01)|(1<<CS00);
TIMSK=1<<TOIE0;//T/C0
OVERFLOW INTERRUPT ENABLE
//TCNT0=0;//T/C0
REGISTER,IF NO SET=MAX 255
//sei();//GLOBAL
INTERRUPT ENABLE
SREG=(1<<7);//GLOBAL
INTERRUPT ENABLE
DDRA=255;//PORTA
ALL OUTPUT
while(1)
{
//PORTB=255;
}
}
ISR(TIMER0_OVF_vect)
{
TCNT0=5;//T/C0
REGISTER,IF NO SET=MAX 255
PORTA=~PORTA;
}
ไม่มีความคิดเห็น:
แสดงความคิดเห็น