วันพุธที่ 1 กรกฎาคม พ.ศ. 2558

พิสูจน์PRIORITYระดับความสำคัญก่อนระหว่างTIMERกับCOUNTERที่ขาT1ในAVRSTUDIOด้วยPROTEUS



พิสูจน์PRIORITYระดับความสำคัญก่อนระหว่างTIMERกับCOUNTERที่ขาT1ในAVRSTUDIOด้วยPROTEUS
31/7/2558 SONGCHAI PRAPATRUNGSEE
พิสูจน์PRIORITYระดับความสำคัญก่อนระหว่างTIMERกับCOUNTERที่ขาT1ในAVRSTUDIOด้วยPROTEUS

หาค่าการนับของ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
/*
 * TEST PRIORITY T1 PIN AND TIMER2 .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
     
    TCCR1B = 1<<CS12 | 1<<CS11 | 1<<CS10;//T1 PIN FALLING EDGE
    TCCR2 = 1<<CS22 | 1<<CS21 | 1<<CS20;//TIMER2 PRESCALER 1024
    TIMSK = 1<<TOIE1 | 1<<TOIE2;//T/C1&2 OVERFLOW INTERRUPT ENABLE
   
      TCNT1H=0XFF;//SET VALUE FOR TIME INTERRUPT
      TCNT1L=0XFB;//SET VALUE FOR TIME INTERRUPT
     
    DDRA=255;//PORTA ALL OUTPUT
    DDRC=255;//PORTA ALL OUTPUT
      DDRD=255;//PORTA ALL OUTPUT
     
    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=255;
      _delay_ms(500);
      PORTA=0;
      _delay_ms(500);
      PORTA=255;
      _delay_ms(500);
      PORTA=0;
      _delay_ms(500);
}

ISR(TIMER2_OVF_vect)
{
    TCNT2=0X00;//SET VALUE FOR TIME INTERRUPT
     
      PORTD=~PORTD;
     
}



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