تایمرهای میکروکنترلر

saalek110

Well-Known Member
کد اون تاپیک اینه:
PHP:
 #include <avr/io.h>
 #include <avr/interrupt.h>

 // global variable to count the number of overflows
 volatile uint8_t tot_overflow;

 // initialize timer, interrupt and variable
 void timer0_init()
 {
 // set up timer with prescaler = 256
 TCCR0 |= (1 << CS02);

 // initialize counter
 TCNT0 = 0;

 // enable overflow interrupt
 TIMSK |= (1 << TOIE0);

 // enable global interrupts
 sei();

 // initialize overflow counter variable
 tot_overflow = 0;
 }

 // TIMER0 overflow interrupt service routine
 // called whenever TCNT0 overflows
 ISR(TIMER0_OVF_vect)
 {
 // keep a track of number of overflows
 tot_overflow++;
 }

 int main(void)
 {
 // connect led to pin PC0
 DDRC |= (1 << 0);

 // initialize timer
 timer0_init();

 // loop forever
 while(1)
 {
 // check if no. of overflows = 12
 if (tot_overflow >= 12) // NOTE: '>=' is used
 {
 // check if the timer count reaches 53
 if (TCNT0 >= 53)
 {
 PORTC ^= (1 << 0); // toggles the led
 TCNT0 = 0; // reset counter
 tot_overflow = 0; // reset overflow counter
 }
 }
 }
 }
 

saalek110

Well-Known Member
شرح کد پست قبل:
البته کد پست قبل برای کدویژن نیست و برای اتمل استودیو است.

یک متغیر گلوبال با کلمه volatile ساخته ، ولی شاید کدویژن این کلمه را نداشته باشه و شاید کلمه ای مشابه اش داشته باشه یا اصلا مشابه اش را هم نداشته باشه.
تابع ئی به نام ISR در کد هست ، ولی در کد فراخوانی نشده ، پس اجرا شدنش به چیز دیگر بستگی داره....
ورودی این تابع همون طور که می بینید اینه TIMER0_OVF_vect ، احتمالامعنی اش اینه وقتی تایمر صفر سر ریز کند اجرا می شود... بعدا خوبه در مورد تابع ISR تحقیق کنیم....
داخل تابع ISR ، اون متغیر گلوبال یک واحد افزوده میشه ، و این جوری می توانیم در کدمان ، در مورد سر ریز شدن تایمر صفر حرف بزنیم.
در while هم که می بینید اون متغیر گلوبال بررسی و صفر شده و tcnt هم بررسی و صفر شده.

در همین تاپیک ، قبلا چنین برنامه ای داشتیم:
PHP:
 #include <mega16a.h>
#include <delay.h>        /* Include Delay header file */

 
 
void main(void){
int timerOverflowCount=0;
     DDRD=0xff;         //configure PORTD as output
     TCNT0=0x00;
     TCCR0 = (1<<CS00) | (1<<CS02);
 
    while(1)
    {       
         while ((TIFR & 0x01) == 0);
          TCNT0 = 0x00;
          TIFR=0x01; //clear timer1 overflow flag                 
         timerOverflowCount++;     
         if (timerOverflowCount>=6)
         {
             PORTD ^= (0x01 << PORTD4);         
             timerOverflowCount=0;
         }     
    }
}

میشه گفت همون برنامه است ، فقط کمی طرز نوشتنش فرق داره.
 

جدیدترین ارسال ها

بالا