วันอังคารที่ 30 มิถุนายน พ.ศ. 2558

EXTERNAL CLOCK SOURCE ขาT1 ตอน1ที่มาของCODE AVRSTUDIO



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);
}


วันจันทร์ที่ 29 มิถุนายน พ.ศ. 2558

PRESCALERยืดเวลาการนับในTIMER2 ตอน2คิดเวลาและจำลองการอินเทอร์รัพท์AVRSTRUDIO



PRESCALERยืดเวลาการนับในTIMER2 ตอน2คิดเวลาและจำลองการอินเทอร์รัพท์AVRSTRUDIO
29/6/2558 SONGCHAI PRAPATRUNGSEE
PRESCALERยืดเวลาการนับในTIMER2 ตอน2คิดเวลาและจำลองการอินเทอร์รัพท์AVRSTRUDIO

สูตรหาค่านับของ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/COUNTER2 มี8บิท คือ256ค่า(0-255)
ดังนั้นการโอเวอร์โฟลว์สูงสุด
ของ TIMER/COUNTER2 คือ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
TIMER2ค่าสูงสุดที่จะโอเวอร์โฟลว์คือ256
=256-256 =0
=0X00
=TCNT2 =0X00

SOURCE CODE
/*
 * TIMER2_OVF_INTERRUPT+PRESCALER .C
 *
 * Created: 29/6/2558 12:35:45
 *  Author: sc
 */


#include <avr/io.h>//REGISTER OF AVR
#include <avr/interrupt.h>//INTERRUPT SERVICE ROUTINE

int main(void)
      //sei();//GLOBAL INTERRUPT ENABLE
      SREG=1<<7;//GLOBAL INTERRUPT ENABLE
     
    //T/C2 CONTROLL PRESCALER, IF CS20-3=0 T/C2 STOP
    TCCR2 = 1<<CS22 | 1<<CS21 | 0<<CS20;
   
    TIMSK = 1<<TOIE2;//T/C2 OVERFLOW INTERRUPT ENABLE
   
      TCNT2=0;//SET VALUE FOR TIME INTERRUPT
     
    DDRA=255;//PORTA ALL OUTPUT
    DDRB=255;
     
    while(1)//LOOP FOR EVER
    {
      PORTB=255;
        PORTB=0;
        PORTB=255;
        PORTB=0;
    } 
}

ISR(TIMER2_OVF_vect)
{
    TCNT2=99;
     
    PORTA=~PORTA;//TOGGLE PORTA
}



TIMER2 OVF INTERRUPT ตอน6คิดเวลาและจำลองINTERRUPTในAVRSTUDIO6_2



TIMER2 OVF INTERRUPT ตอน6คิดเวลาและจำลองINTERRUPTในAVRSTUDIO6_2
29/6/2558 SONGCHAI PRAPATRUNGSEE
TIMER2 OVF INTERRUPT ตอน6คิดเวลาและจำลองINTERRUPTในAVRSTUDIO6_2

สูตรหาค่านับของ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/COUNTER2 มี8บิท คือ256ค่า(0-255)
ดังนั้นการโอเวอร์โฟลว์สูงสุด
ของ TIMER/COUNTER2 คือ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
TIMER2ค่าสูงสุดที่จะโอเวอร์โฟลว์คือ256
=256-256 =0
=0X00
=TCNT2 =0X00

SOURCE CODE
/*
 * TIMER2_OVF_INTERRUPT+PRESCALER .C
 *
 * Created: 29/6/2558 12:35:45
 *  Author: sc
 */


#include <avr/io.h>//REGISTER OF AVR
#include <avr/interrupt.h>//INTERRUPT SERVICE ROUTINE

int main(void)
      //sei();//GLOBAL INTERRUPT ENABLE
      SREG=1<<7;//GLOBAL INTERRUPT ENABLE
     
    //T/C2 CONTROLL PRESCALER, IF CS20-3=0 T/C2 STOP
    TCCR2 = 1<<CS22 | 1<<CS21 | 0<<CS20;
   
    TIMSK = 1<<TOIE2;//T/C2 OVERFLOW INTERRUPT ENABLE
   
      TCNT2=0;//SET VALUE FOR TIME INTERRUPT
     
    DDRA=255;//PORTA ALL OUTPUT
    DDRB=255;
     
    while(1)//LOOP FOR EVER
    {
      PORTB=255;
        PORTB=0;
        PORTB=255;
        PORTB=0;
    } 
}

ISR(TIMER2_OVF_vect)
{
    TCNT2=99;
     
    PORTA=~PORTA;//TOGGLE PORTA
}



PRESCALERยืดเวลาการนับในTIMER2 ตอน1ที่มาของCODE AVRSTRUDIO



PRESCALERยืดเวลาการนับในTIMER2 ตอน1ที่มาของCODE AVRSTRUDIO
29/6/2558 SONGCHAI PRAPATRUNGSEE
PRESCALERยืดเวลาการนับในTIMER2 ตอน1ที่มาของCODE AVRSTRUDIO

สูตรหาค่านับของ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/COUNTER2 มี8บิท คือ256ค่า(0-255)
ดังนั้นการโอเวอร์โฟลว์สูงสุด
ของ TIMER/COUNTER2 คือ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
TIMER2ค่าสูงสุดที่จะโอเวอร์โฟลว์คือ256
=256-256 =0
=0X00
=TCNT2 =0X00

SOURCE CODE
/*
 * TIMER2_OVF_INTERRUPT+PRESCALER .C
 *
 * Created: 29/6/2558 12:35:45
 *  Author: sc
 */


#include <avr/io.h>//REGISTER OF AVR
#include <avr/interrupt.h>//INTERRUPT SERVICE ROUTINE

int main(void)
      //sei();//GLOBAL INTERRUPT ENABLE
      SREG=1<<7;//GLOBAL INTERRUPT ENABLE
     
    //T/C2 CONTROLL PRESCALER, IF CS20-3=0 T/C2 STOP
    TCCR2 = 1<<CS22 | 1<<CS21 | 0<<CS20;
   
    TIMSK = 1<<TOIE2;//T/C2 OVERFLOW INTERRUPT ENABLE
   
      TCNT2=0;//SET VALUE FOR TIME INTERRUPT
     
    DDRA=255;//PORTA ALL OUTPUT
    DDRB=255;
     
    while(1)//LOOP FOR EVER
    {
      PORTB=255;
        PORTB=0;
        PORTB=255;
        PORTB=0;
    } 
}

ISR(TIMER2_OVF_vect)
{
    TCNT2=99;
     
    PORTA=~PORTA;//TOGGLE PORTA
}