اطلاعیه

Collapse
No announcement yet.

مشکل در ساخت زمان با تایمر

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    مشکل در ساخت زمان با تایمر

    با سلام
    من تو اتمل استودیو یه برنامه کوچک نوشتم که با تایمر0یه زمان 1ثانیرو درست کنم و یه ال ای دی رو روشن خاموش کنه اما اون زمان درست نمی گه مشکلش کجاست این برنامه؟؟؟؟
    کد:
    #include <avr/io.h>
    #define sbi(sfr,pin) (sfr |= _BV(pin))
    void delay_1s();
    int main (void)
    
    {
    		DDRD=0xff;
    	  PORTD=0x00;
    	
    	
    	while (1)
    	{
    		PORTD=(1<<PD0);
    		delay_1s();
    		PORTD=(0<<PD0);
    		delay_1s();
    		
    	}
    	
    }
    void delay_1s ()
    {
    	TCNT0=6;
    	TCCR0=0X03;
    	while((TIFR & 0X01)==0);
    	TCCR0=6;
    	TIFR|=0x01;
    	
    }
    به جای اینکه جای کسی را بگیرید سعی کنید جای واقعیه خود را بیابید

    TABRIZ

    #2
    پاسخ : مشکل در ساخت زمان با تایمر

    نوشته اصلی توسط TABASOOMTZ
    با سلام
    من تو اتمل استودیو یه برنامه کوچک نوشتم که با تایمر0یه زمان 1ثانیرو درست کنم و یه ال ای دی رو روشن خاموش کنه اما اون زمان درست نمی گه مشکلش کجاست این برنامه؟؟؟؟
    سلام دوست عزیز
    فکر میکنم بهتر باشه از وقفه سرریز تایمر دو استفاده کنی ،البته تایمر دو رو در مد اسنکرون و با استفاده از کریستال ساعت راه اندازی کنی اینم نمونه کدی که من نوشتم
    [code=c]
    #include <avr/io.h>
    #define F_CPU 1000000
    #include <util/delay.h>
    #include <avr/interrupt.h>

    int main(void)
    {
    TIMSK=(1<<TOIE2);
    TCCR2=(1<<COM20)|(1<<CS22)|(1<<C S20);
    ASSR=(1<< AS2);
    TCNT2=0x00;
    sei();
    DDRA=(1<<DDA0);
    while(1)
    {
    //TODO:: Please write your application code
    }
    }


    ISR(TIMER2_OVF_vect)
    {
    PORTA ^=(1<<PA0);
    }
    [/code]

    دوستان کسی میدونه چرا تو کد بالا پایه OC2 فقط یکبار تاگل میشه ؟
    تنها دو روز در سال هست که نمیتونی هیچ کاری بکنیآ‌! یکیآ‌ دیروز و یکیآ‌ فردا . . .

    دیدگاه


      #3
      پاسخ : مشکل در ساخت زمان با تایمر

      جواب سوال خودمو پیدا کردم . باید پین D.7 خروجی تعریف بشه که در این صورت میتونی ال ای دی رو روی این پین قرار بدی و از پورت A استفاده نکنی :nice:
      تنها دو روز در سال هست که نمیتونی هیچ کاری بکنیآ‌! یکیآ‌ دیروز و یکیآ‌ فردا . . .

      دیدگاه


        #4
        پاسخ : مشکل در ساخت زمان با تایمر

        نوشته اصلی توسط masoud salimi
        سلام دوست عزیز
        فکر میکنم بهتر باشه از وقفه سرریز تایمر دو استفاده کنی ،البته تایمر دو رو در مد اسنکرون و با استفاده از کریستال ساعت راه اندازی کنی اینم نمونه کدی که من نوشتم
        [code=c]
        #include <avr/io.h>
        #define F_CPU 1000000
        #include <util/delay.h>
        #include <avr/interrupt.h>

        int main(void)
        {
        TIMSK=(1<<TOIE2);
        TCCR2=(1<<COM20)|(1<<CS22)|(1<<C S20);
        ASSR=(1<< AS2);
        TCNT2=0x00;
        sei();
        DDRA=(1<<DDA0);
        while(1)
        {
        //TODO:: Please write your application code
        }
        }


        ISR(TIMER2_OVF_vect)
        {
        PORTA ^=(1<<PA0);
        }
        [/code]

        دوستان کسی میدونه چرا تو کد بالا پایه OC2 فقط یکبار تاگل میشه ؟
        سلام
        و ممنون به خاطر کدی که قرار دادین
        اما مشکل این برنامه است ,اخه چرا درست کار نمی کنه؟؟
        به جای اینکه جای کسی را بگیرید سعی کنید جای واقعیه خود را بیابید

        TABRIZ

        دیدگاه


          #5
          پاسخ : مشکل در ساخت زمان با تایمر

          سلام مجدد
          فکر میکنم تو محاسباتتون یه اشتباه انجام دادین چون پرسکالر روی 64 تنظیم شده و با فرض کلاک 1 مگاهرتز زمان قابل محاسبه عدد کوچیکیه
          من با 1024و کلاک 1 مگا امتحان کردم بعد از 4 بار سرریز تایمر 1ثانیه میشه البته خطا داره دیگه
          امیدوارم مفید باشه
          [code=c]
          #include <avr/io.h>
          #define F_CPU 1000000
          #include <util/delay.h>

          int main(void)
          {

          DDRA=(1<<DDA7);
          while(1)
          {
          PORTA^=(1<<PA7);
          delay_1s();

          //TODO:: Please write your application code
          }
          }

          void delay_1s ()
          {
          unsigned char i=1;
          TCCR0=(1<<CS02)|(1<<CS00);
          TCNT0=0x05;
          for (i=0;i<=3;i++)
          {
          while((TIFR & 0x01)==0);
          TCNT0=0x05;
          TIFR|=(1<<TOV0);
          }
          return;
          }
          [/code]
          تنها دو روز در سال هست که نمیتونی هیچ کاری بکنیآ‌! یکیآ‌ دیروز و یکیآ‌ فردا . . .

          دیدگاه

          لطفا صبر کنید...
          X