اطلاعیه

Collapse
No announcement yet.

استفاده از تایمر یک و تایمر صفر به عنوان زمان کمکی ؟

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

    استفاده از تایمر یک و تایمر صفر به عنوان زمان کمکی ؟

    با سلام من یک برنامه نوشتم که هر یک دقیقه یکبار 3 ثانیه ال ای دی رو روشن میکنه و 3 ثانیه خاموش ، برنامه یک دقیققشو با تایمر یک نوشتم و برنامه 3 ثانیشو با delay نرم افزاری حالا اگر بخوام برنامه 3 ثانیشو با تایمر صفر بنویسم چه تغییری باید در برنامه زیر ایجاد کنم ، البته همانطور که در برنامه زیر مشاهده میکیند تا حدی تایمر صفر رو فعال کردم اما از اینجا به بعدشو نمیدونم باید چه کار کنم ممنون میشم راهنمایی بفرمایید .



    کد:
    #include <mega16.h>
    #include <delay.h>
    // Declare your global variables here
    
    // Timer 0 overflow interrupt service routine
    
    
    unsigned int i;
    
    interrupt [TIM0_OVF] void timer0_ovf_isr(void)
    {
    // Place your code here
    
    }
    
    //void led(void)
    //{
    //PORTA.0=1;
    //delay_ms(3000);
    //PORTA.0=0;
    //delay_ms(3000);
    
    //}
    
    
    // Timer1 overflow interrupt service routine
    interrupt [TIM1_OVF] void timer1_ovf_isr(void)
    {
    i++;
    if(i>=2)
    {
    i=0;
    PORTA.0=1;
    delay_ms(3000);
    PORTA.0=0;
    delay_ms(3000);
    }
    
    TCNT1H=0xF0;
    TCNT1L=0xBC;
    }
    
    void main(void)
    {
    DDRA.0=1;
    
    // Timer/Counter 0 initialization
    // Clock source: System Clock
    // Clock value: 0.977 kHz
    // Mode: Normal top=0xFF
    // OC0 output: Disconnected
    // Timer Period: 0.26214 s
    TCCR0=(0<<WGM00) | (0<<COM01) | (0<<COM00) | (0<<WGM01) | (1<<CS02) | (0<<CS01) | (1<<CS00);
    TCNT0=0x00;
    OCR0=0x00;
    
    // Timer/Counter 1 initialization
    // Clock source: System Clock
    // Clock value: 15.625 kHz
    // Timer Period: 4.1943 s
    // Timer1 Overflow Interrupt: On
    TCCR1A=0x00;
    TCCR1B=0x04; // scale 256
    TCNT1H=0xF0;
    TCNT1L=0xBC;
    
    
    // Timer(s)/Counter(s) Interrupt(s) initialization
    TIMSK=(0<<OCIE2) | (0<<TOIE2) | (0<<TICIE1) | (0<<OCIE1A) | (0<<OCIE1B) | (1<<TOIE1) | (0<<OCIE0) | (1<<TOIE0);
    
    
    
    
    
    
    // Global enable interrupts
    #asm("sei")
    
    while (1);
          
    }
    جدیدترین ویرایش توسط fmicro; ۱۵:۱۵ ۱۳۹۶/۱۱/۱۶.
    خدایا یکی بزرگترین آرزویهایم در این دنیا این است که همه مردم حالشان خوب باشد و احساس خوشبختی داشته باشند....

    #2
    پاسخ : استفاده از تایمر یک و تایمر صفر به عنوان زمان کمکی ؟

    سلام.
    دوست عزیز به عنوان نکته توصیه می*کنم توی روتین* سرویس وقفه از delay استفاده نکنید منظورم فقط اینجا نیست، کلا عرض میکنم.
    کاری که شما میخوای انجام بدی رو با یک تایمر هم میشه انجام داد. مثلا همون تایمر ۱ رو در نظر بگیر. دوره زمانی سرریز تایمر رو روی کوچکترین بازه زمانی که توی برنامه استفاده میکنی تنظیم کن. مثلا در نظر میگیریم ۱ ثانیه و بنابراین تمام تاخیرهای مورد استفاده باید مضربی از این ۱ ثانیه باشند یعنی نمیتونیم مثلا نیم ثانیه تاخیر ایجاد کرد. هر ۱ ثانیه تایمر سرریز میشه و برنامه به روتین سرویس وقفه تایمر ۱ پرش میکنه. حالا هرچندتا کار که بخوای میتونی با افزایش یه متغیر مثل همین i که خودت تعریف کردی انجام بدی. اینجوری میشه:
    کد:
    [LEFT]interrupt [TIM1_OVF] void timer1_ovf_isr(void)
    {
     t++;
    
     if(t>59)
      t=0;
    
     if((t>=0)&&(t<3))
      PORTA.0=1;
     else
      PORTA.0=0;
    
    TCNT1='some value to make 1 second interval for TIMER1 overflow'
    }[/LEFT]
    جدیدترین ویرایش توسط Mostafa.y; ۱۹:۴۴ ۱۳۹۶/۱۱/۱۷.

    دیدگاه


      #3
      پاسخ : استفاده از تایمر یک و تایمر صفر به عنوان زمان کمکی ؟

      متوجه نشدم !!!
      خدایا یکی بزرگترین آرزویهایم در این دنیا این است که همه مردم حالشان خوب باشد و احساس خوشبختی داشته باشند....

      دیدگاه


        #4
        پاسخ : استفاده از تایمر یک و تایمر صفر به عنوان زمان کمکی ؟

        نوشته اصلی توسط fmicro نمایش پست ها
        متوجه نشدم !!!
        ببینید ای ن مشابه همون کاریه که خودتون انجام دادین. شما گفتین که در طول ۱ دقیقه به مدت۳ ثانیه LED رو روشن میکنید و بعد خاموش. تو برنامه ای که شما نوشتین وقفه سرریز تایمر تو هر ۳۰ ثانیه اتفاق میفته و برای ایجاد زمان ۱ دقیقه یه متغیر i رو تا دو واحد افزایش دادین تا به زمان ۱ دقیقه برسین. حالا ما اینجا یه کاری میکنیم که وقفه سرریز تایمر هر ۱ ثانیه اتفاق بیفته. بنابراین باید برای داشتن بازه ۱ دقیقه ای متغیر t رو تا ۵۹ افزایش دادیم و بعد صفرش کردیم. حالا اگر tبین ۰ تا ۳ بود LED را روشن میکنیم و اگر t بزگتر از ۳ بود LED رو خاموش میکنیم. اینجوری هر ۱ دقیقه ۳ ثانیه LED روشن میشه و بعد از اون تا پایان ۱ دقیقه خاموش میمونه تا دوباره t صفر بشه و تکرار ماجرا...
        امیدوارم متوجه شده باشید اگر هم نشدید به صورت سوال مطرح کنید تا توضیح بدم.
        موفق باشید

        دیدگاه


          #5
          پاسخ : استفاده از تایمر یک و تایمر صفر به عنوان زمان کمکی ؟

          تا حدی متوجه شدم حالا باید رجیسترهای TCNT1 رو برای یک ثانیه بارگذاری کنم ؟ و در بالا هم گفتید(حالا هرچندتا کار که بخوای میتونی با افزایش یه متغیر مثل همین i که خودت تعریف کردی انجام بدی) این منظورتون از کارهای دیگه ای که میشه انجام داد چیه ؟ و اینکه لزومی نداره از تایمر صفر استفاده کنم ؟! ممنون
          خدایا یکی بزرگترین آرزویهایم در این دنیا این است که همه مردم حالشان خوب باشد و احساس خوشبختی داشته باشند....

          دیدگاه


            #6
            پاسخ : استفاده از تایمر یک و تایمر صفر به عنوان زمان کمکی ؟

            بله. باید TCNT1 رو طوری بارگذاری کنید که به زمان 1 ثانیه دست پیدا کنید. لازم نیست جداگانه با مقدار دهی TCNT1H و TCNT1L این کارو انجام بدید. فقط کافیه یه مقدار 16 بیتی به TCNT1 اختصاص بدید.
            منظورم از کارهای دیگه اینه که تنها با یک تایمر میتونی همزمان چندین زمان بندی مختلف انجام بدی. بدون اینکه نیاز باشه از یک تایمر دیگه استفاده کنی. برای مثال میخوای همزمان با این LED که از ثانیه 0 تا 3 روشن میکنی یه LED دیگه از ثانیه 2 تا 4 روشن کنی. و بازهم همزمان با اینها مثلا ورودی رو چک کنی ببینی اگر فلان پین برای 5 ثانیه 1 شد یه LED رو برای 2 ثانیه روشن کنی. خیلی کارها میشه کرد بدون اینکه نیاز به یه تایمر مجزا باشه.
            بنابراین لزومی نداره که تایمر 0 رو اشغال کنی. با همین تایمر 1 کلی کار مختلف رو میتونی زمان بندی کنی. کافیه یه بار اینی که میگم رو پیاده سازی کنی و با یکم تمرین کل قضیه میاد دستت.
            موفق باشید.

            دیدگاه


              #7
              پاسخ : استفاده از تایمر یک و تایمر صفر به عنوان زمان کمکی ؟

              ممنونم خوب پاسخ دادید.
              خدایا یکی بزرگترین آرزویهایم در این دنیا این است که همه مردم حالشان خوب باشد و احساس خوشبختی داشته باشند....

              دیدگاه


                #8
                پاسخ : استفاده از تایمر یک و تایمر صفر به عنوان زمان کمکی ؟

                نوشته اصلی توسط fmicro نمایش پست ها
                هر یک دقیقه یکبار 3 ثانیه ال ای دی رو روشن میکنه و 3 ثانیه خاموش
                سلام
                یک دقیقه خاموش، بعدش سه ثانیه روشن و بعد از اون سه ثانیه خاموش.. و تکرار چرخه... کلاک میکرو 1مگ درنظر گرفته شده.. تو پروتیوس هم تست کردم اوکیه...
                کد:
                #include <mega32.h>
                
                
                
                void init_io()
                    {
                    DDRA = (1<<DDA0);   //pin0 of portA output
                    TCCR1B = (1<<WGM12)|(1<<CS11)|(1<<CS10); //prescaling 64 for clock 1MHz , Mode CTC top OCR1A
                    OCR1A = 0X3D08;     //15624 puls for 1s 
                    TIMSK = (1<<OCIE1A);   //enable interrupt OCF1A
                    #asm("sei") 
                    } 
                    
                interrupt [TIM1_COMPA] void timer1_isr()
                    { 
                    static int i;
                    i++; 
                    if(i>59)
                        if(i<63)         PORTA |= (1<<PORTA0);
                        else if(i<66)   PORTA &= ~(1<<PORTA0); 
                             else i=0;  
                    }
                    
                void main(void)
                {
                init_io();
                while (1)
                    {
                
                
                    }
                }
                جدیدترین ویرایش توسط milad.mohammadi373; ۰۱:۰۵ ۱۳۹۶/۱۱/۲۱.

                دیدگاه

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