TIMER3 OVF INTERRUPT ตอน3จำลองการขัดจังหวะINTERRUPT XC8
29/6/2558 SONGCHAI PRAPATRUNGSEE
TIMER3 OVF INTERRUPT ตอน3จำลองการขัดจังหวะINTERRUPT XC8
สูตรหาค่านับของTIMER/COUNTER
OVERFLOW
จำนวนครั้งการนับ =
เวลาที่ต้องการอินเทอร์รัพท์ /
((1/F)*4)
ไมโครคอนโทรลเลอร์ตระกูลPIC
4CLOCK = 1INSTRUCTION
ความถี่ขึ้น1ครั้งลง1ครั้งเรียกว่า 1CLOCKหรือ1CYCLE
1INSTRUCTION =การทำงานของไมโครคอนโทรลเลอร์1ครั้ง
TIMER3 มี16บิท
คือ65536ค่า(0-65535)
ดังนั้นการโอเวอร์โฟลว์สูงสุด
ของ TIMER3 คือ65536ครั้ง
ค่าสูงสุดของ16บิท คือ65535
พอนับครั้งที่65536 ก็จะเป็นการนับโอเวอร์โฟลว์
โอเวอร์โฟลว์ หมายถึงการนับเกินนั่นเอง
เมื่อเกิดการโอเวอร์โฟลว์
ไมโครคอนโทรลเลอร์ก็จะเซ็ทบิทFLAGเป็น1
หรือยกธงขึ้นนั่นเอง
หลังจากยกธงขึ้นแล้ว
ก็จะกระโดดทันทีจากฟังค์ชันหลักหรือฟังค์ชันmain
มาเข้าที่ฟังชันอินเทอร์รัพท์
เมื่อเข้ามาที่ฟังชันอินเทอร์รัพท์แล้ว
เราก็จะต้องเขียนเคลียร์FLAGเป็น0
หรือยกธงลงโดยเราเป็นผู้กำหนด
การยกธงลงเพื่อให้สามารถทำงานอินเทอร์รัพท์
ในรอบต่อไปได้
เขียนดังนี้ TMR3IF=0;
หลังจากทำงานในฟังชันค์อินเทอร์รัพท์เสร็จแล้ว
ก็จะกลับเข้าไปที่ฟังค์ชันหลักหรือฟังค์ชันmain
เพื่อทำงานที่ค้างไว้ในฟังชันหลักต่อไป
เวลาสูงสุดที่จะโอเวอร์โฟลว์ ถ้าใช้คริสตัล4MHZ
คือ 65536 X 1US
=65536US(ไมโครวินาที)
ถ้าต้องการให้เวลายาวนานกว่านี้
ก็สามารถใช้ปรีสเกลเลอร์เพิ่มเวลาการนับขึ้นมาได้
ปรีสเกลเลอร์คือการเพิ่มเวลาการนับในTIMERนั่นเอง
สมมุติว่าใช้CRYSTAL 4MHZ
ก็หมายความว่า
คริสตัล4MHZ / 4 =1MHZ
=ทำงานที่1MHZต่อ1ครั้ง
=ทำงานที่1USต่อ1ครั้งนั่นเอง
ยิ่งความถี่สูงก็ยิ่งทำงานเร็วนั่นเอง
สูตรหาเวลา T
=1/HZ
เวลา =1/ความถี่
1/4MHZ = 0.25US (ไมโครวินาที)
การทำงาน1ครั้งของPICคือ4CLOCKต่อ1INSTRUCTION
=0.25*4 =1US
หมายความว่าการทำงาน1ครั้งของPIC คือ 1US
ถ้าต้องการให้โอเวอร์โฟลว์ทุกๆ5MS(มิลลิวินาที)
ก็เอา5MS ตั้ง
แล้วเอา 1US หาร
ก็จะได้เท่ากับ 5000ครั้ง
เอาค่าสูงสุด16บิท คือ 65536 - 5000ครั้ง
ก็จะได้ค่าเริ่มต้นการนับดังนี้
= 60536
= 0XEC78
= TMR3H=0XEC;
= TMR3L=0X78;
SOURCE CODE
/*
* File: EE.C
* Author: sc
* TIMER3 OVF
INTERRUPT USE PIC18F45K20
* Created on 28 ,มิย 2558, 12:00
*/
#include <xc.h>
#pragma config FOSC = HS//External Crystal 4MHZ-20MHZ
#define _XTAL_FREQ 4000000//4MHZ FOR __delay
void interrupt T3(void){
TMR3IF=0;//IF NO
NOT WORK
TMR3H=0XEC;
TMR3L=0X9C;
PORTA=~PORTA;
}
void main(void)
{
GIE=1;//GLOBAL
INTERRUPT ENABLE
TMR3IE=1;//TIMER3
OVF INTERRUPT ENABLE
IPEN=1;//PRIORITY
0=DISABLE INTERRUPT
TMR3ON=1;//TIMER3
ON
TRISA=0;//0=OUTPUT,1=INPUT
TRISC=0;//0=OUTPUT,1=INPUT
while(1) {
PORTC=255;
__delay_ms(197);//197 MAX IN XC8 V3.00
PORTC=0;
__delay_ms(197);//197 MAX IN XC8 V3.00
}
}
ไม่มีความคิดเห็น:
แสดงความคิดเห็น