วันอาทิตย์ที่ 28 มิถุนายน พ.ศ. 2558

TIMER3 OVF INTERRUPT ตอน1ทีมาของCODEในXC8



TIMER3 OVF INTERRUPT ตอน1ทีมาของCODEในXC8
28/6/2558 SONGCHAI PRAPATRUNGSEE
TIMER3 OVF INTERRUPT ตอน1ทีมาของCODEใน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
 }
}



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