EXTERNAL CLOCK SOURCE ขาT1 ตอน1ที่มาของCODE AVRSTUDIO
30/6/2558 SONGCHAI PRAPATRUNGSEE
EXTERNAL CLOCK SOURCE ขาT1 ตอน1ที่มาของCODE AVRSTUDIO
หาค่าการนับของCOUNTER
หรือEXTERNAL CLOCK SOURCE ที่ขาT1
สูตร =(ค่าสูงสุดของCOUNTER+1)
– จำนวนครั้งที่ต้องการให้เกิดการอินเทอร์รัพท์
เช้นถ้าต้องการให้เกิดCLOCK 5ลูกแล้วให้อินเทอร์รัพท์
ก็จะได้ดังนี้
TIMER1 ค่าสูงสุดคือ65535+1 =65536
=65536-5
=65531
=0XFFFB
=TCNT1H=0XFF
=TCNT1L=0XFB
TIMER1 มี 16บิท =0-65535
ค่าสูงสุดในการนับคือ 65535
นับเกินอีก1 คือครั้งที่65536 ก็จะเกิดการโอเวอร์โฟลว์
AVRก็จะทำการเซ็ทFLAGเป็น1
แล้วกระโดดเข้ามาที่ฟังค์ชันอินเทอร์รัพท์
จากนั้นAVRก็จะเคลียร์FLAGเป็น0
ทำให้เราไม่ต้องเคลียร์FLAGเอง
ซึ่งก็เป็นการสะดวกครับ
เมื่อเกิดการโอเวอร์โฟลว์
ก็จะละทิ้งงานทั้งหมด
กระโดดเข้ามาทำที่ฟังค์ชันอินเทอร์รัพท์ก่อน
เมื่อทำงานในฟังค์ชันอินเทอร์รัพท์เสร็จแล้ว
ก็จะกระโดดกลับไปทำงานที่ค้างไว้
การอินเทอร์รัพท์ของCOUNTERที่ขาT1
จะมีPRIORITYความสำคัญก่อน
ซึ่งจะมีความสำคัญกว่าTIMERนั่นเอง
TIMER
ก็คือการนับCLOCKจากคริสตัล
COUNTER
ก็คือการนับCLOCKจากภายนอกที่ขาT1,T0
เช่น เครื่องกำเนิดความถี่
หรือความถี่จากเพรสเชอร์
หรือเกิดจากการกดปุ่ม
เมื่อนับเกินก็จะกระโดดไปทำงานที่ฟังค์ชันINTERRUPT
SOURCE CODE
/*
* COUNTER_OVF_INTERRUPT
T1 PIN FALLING EDGE .C
*
* Created:
30/6/2558 12:35:45
* Author:
sc
*/
#include <avr/io.h>//REGISTER OF AVR
#include <avr/interrupt.h>//INTERRUPT SERVICE
ROUTINE
#define F_CPU 8000000//DEFINE CLOCK
SPEED
#include <util/delay.h>//FOR DELAY
int main(void)
{
//sei();//GLOBAL
INTERRUPT ENABLE
SREG
= 1<<7;//GLOBAL INTERRUPT ENABLE
//T/C2 CONTROLL REGISTER, IF CS20-3=0 T/C2 STOP
TCCR1B = 1<<CS12 | 1<<CS11 | 0<<CS10;
TIMSK
= 1<<TOIE1;//T/C1
OVERFLOW INTERRUPT ENABLE
TCNT1H=0XFF;//SET VALUE FOR TIME INTERRUPT
TCNT1L=0XFB;//SET VALUE FOR TIME INTERRUPT
DDRA=255;//PORTA ALL OUTPUT
DDRD=255;
while(1)//LOOP FOR EVER
{
PORTC=255;
_delay_ms(500);
PORTC=0;
_delay_ms(500);
}
}
ISR(TIMER1_OVF_vect)
{
TCNT1H=0XFF;//SET VALUE FOR TIME INTERRUPT
TCNT1L=0XFB;//SET VALUE FOR TIME INTERRUPT
PORTA=255;
_delay_ms(500);
PORTA=0;
_delay_ms(500);
PORTA=255;
_delay_ms(500);
PORTA=0;
_delay_ms(500);
PORTA=255;
_delay_ms(500);
PORTA=0;
_delay_ms(500);
PORTA=0;
_delay_ms(500);
PORTA=255;
_delay_ms(500);
PORTA=0;
_delay_ms(500);
}