اطلاعیه

Collapse
No announcement yet.

یک مشکل ساده (!) در کار با تایمر0

Collapse
این موضوع بسته شده است.
X
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    یک مشکل ساده (!) در کار با تایمر0

    من هنگام کار با تایمر اصلا دستو ر()set_timer0را نمی نویسم ... ولی تایمرم قشنگ به وقفه میرود و هیچ مشکلی پیدا نمیکند . در واقع دستور ()set_timer0 برای دادن مقدار اولیه به رجیستر تایمر است ، که تایمر از آنجا شروع به شمارش میکند و وقتیکه سر ریز شد (یعنی به ffff رسید ) باید یک وقفه بدهد ... اما من وقتی از این دستور استفاده میکنم و یک عدد بزرگ (مثلا68000 ) به آن میدهم ، یا اینکه آن عدد بزرگ را مستقیما در رجیستر های TMR0L , TMR0H میریزم ، اصلا برنامه حساسیتی به این موضوع نشان نمیدهد ... و کار خودش را انجام میدهد ... اصلا بریزم ، نریزم ، بزرگ بریزم ، کوچک بریزم ، ... هیچکدومش برای میکرو فرقی نداره !!!
    من قصد داشتم ، با نوشتن در این رجیستر ها ، زمان مورد نظرم را کنترل کنم ... ولی اینطوری اصلا هیچ دسترسی به مقدار زمان ندارم . و فقط پری سکیلرش را میتونم کم و زیاد کنم ...
    لطفا کمکم کنید ، و بگید اشکال کار از کجاست که برنامه ام درست کار نمیکند؟
    تصور اینکه چنین اشکال ابلهانه ای یک روز وقتمو گرفته داره دیووووووووووونم میکنه!!!! :cry: :cry: :angry: :angry:


    اینم کد برناممه ..... ببینید ... توی روتین وقفه میره ها ... زمانش هم درسته ... فقط مقدار اولیش تنظیم نمیشه :angry:




    #INT_TIMER0


    void Timer0_isr()

    {
    output_toggle(PIN_d3);

    if(pulse==1)
    {

    pulse=0;
    output_low(PIN_D2);

    }
    else if(pulse==0)
    {

    pulse=1;
    output_high(PIN_D2);

    }





    }

    #byte T0CON =0xfd5
    #byte INTCON=0xff2


    main()
    {
    set_tris_d (0x0);


    T0CON=0x81;
    INTCON=0xA0;
    set_timer0(65536);
    while (true)
    {
    if (get_timer0()==0)
    {

    if (pulse==0)
    {

    set_timer0(68000);

    }

    if ( pulse==1)
    {

    set_timer0(38000);

    }


    }


    }

    میدونم که آقای محمد ایجی با یک نگاه میتونه بگه مشکلم کجاست.
    دلا خوبـــان دل خونيــــن پســـندند
    دلا خون شو که خوبان اين پسندند
    متاع کفر و دين بيآ‌مشتري نيست
    گروهــــي آن گروهي اين پســـندند

    #2
    پاسخ : یک مشکل ساده (!) در کار با تایمر0

    با اجازه از محمدخان :bye
    دوست عزیز من تا اونجایی که میدونم این تایمر شما 16 بیتی و شما نمیتونید عددی بیشتر از 65535 به این تایمر بدین!!!! از طرفی شما به تایمر عدد 65536 رو دادین! اصلا فرض کنیم که درست باشه تایمر شما میاد کار زیر رو انجام میده

    فرمول زمان:
    TIME=4*PRESCALER*1/OSC*(65535-VALUE)

    حالا با این مقداری که شما به VALUE دادین زمان شما منفی در میاد!! اگه امکانش هست این مقادیر رو عوض کنید و اگه باز به مشکلی بر خوردین حتما مطرح کنید

    موفق باشید

    دیدگاه


      #3
      پاسخ : یک مشکل ساده (!) در کار با تایمر0

      نوشته اصلی توسط SA3ID
      با اجازه از محمدخان :bye
      دوست عزیز من تا اونجایی که میدونم این تایمر شما 16 بیتی و شما نمیتونید عددی بیشتر از 65535 به این تایمر بدین!!!! از طرفی شما به تایمر عدد 65536 رو دادین! اصلا فرض کنیم که درست باشه تایمر شما میاد کار زیر رو انجام میده

      فرمول زمان:
      TIME=4*PRESCALER*1/OSC*(65535-VALUE)

      حالا با این مقداری که شما به VALUE دادین زمان شما منفی در میاد!! اگه امکانش هست این مقادیر رو عوض کنید و اگه باز به مشکلی بر خوردین حتما مطرح کنید

      موفق باشید
      سلام... ببین دوست عزیز ...ناین مقادیرو اول درست انتخاب کردم .... بعد هرچی عوضش کردم ، دیدم تغییری نمیکنه ... بعدش اصلا مقادیرشو پرت انتخاب کردم و انتظار داشتم اصلا کار نکنه و به روتین وقفه نره ... ولی وقتی دیدم به روتین وقفه رفته شاخ در آوردم که چرا اینطوری شده ... حرف شما درسته ... ولی ایراد از جایی دیگری است :cry2:
      دلا خوبـــان دل خونيــــن پســـندند
      دلا خون شو که خوبان اين پسندند
      متاع کفر و دين بيآ‌مشتري نيست
      گروهــــي آن گروهي اين پســـندند

      دیدگاه


        #4
        پاسخ : یک مشکل ساده (!) در کار با تایمر0

        دوست عزیز اگه اشتباه نکنم مشکل شما از پرسکالر باشه! شما تو برنامه از پرسکالر 4 استفاده کردین, حالا اونو به 256 تغییر بدین و مقادیر رو درست وارد کنید ببینید که چی میشه, اگه باز مشکلی پیش اومد حتما مطرح کنید

        موفق باشید

        دیدگاه


          #5
          پاسخ : یک مشکل ساده (!) در کار با تایمر0

          شما متغیر pulse رو کجا تعریف کردید؟ چون از این متغیر هم در سرویس وقفه و هم داخل main استفاده کرده اید پس حتما باید به صورت global (یا همون general) تعریف کنید. یعنی قبل از ‎#int_timer0 تعریفش رو بنویسید. همچنین بهتره که دستور IF رو به صورت زیر بنویسید if(!get_timer0())‎
          این موارد رو بررسی و نتیجه را گزارش کنید.

          دیدگاه


            #6
            پاسخ : یک مشکل ساده (!) در کار با تایمر0

            نوشته اصلی توسط محمد ایجی
            شما متغیر pulse رو کجا تعریف کردید؟ چون از این متغیر هم در سرویس وقفه و هم داخل main استفاده کرده اید پس حتما باید به صورت global (یا همون general) تعریف کنید. یعنی قبل از ‎#int_timer0 تعریفش رو بنویسید. همچنین بهتره که دستور IF رو به صورت زیر بنویسید if(!get_timer0())‎
            این موارد رو بررسی و نتیجه را گزارش کنید.
            با عرض سلام و تشکر فراوان بخاطر توجهتون ، اوامر شما اجرا شد . ... نتیجه مثل گذشته است ... یعنی به روتین وقفه میرود و led که به پایه d2 وصل کرده ام ، چشمک میزند ... اما وقتی تایمر را با 65000 یا 30000 یا حتی عدد 1 ، استارت میکنم ، فرکانس چشمک زدنش هیچ فرقی نمیکند . در صورتیکه وقتیکه با65000 استارت میکنم باید خیلی خیلی تند چشمک بزند ، آنقدر که چشمک زدنش معلوم نشود ... و وقتی با 1 استارت میکنم ، فرکانس چشمک زدنش خیلی خیلی کمتر بشود ... متغیر پالس را هم از قبل بصورت global تعریف کرده بودم ، ولی چون میخواستم شلوغ نشه ، اینجا قسمت اول برنامه را حذف کرده بودم ... الان همه برنامه را کپی میکنم :
            # include <18f452.h>
            # use delay ( clock = 16000000)
            int8 pulse=0;

            #INT_TIMER0

            void Timer0_isr()
            {
            if(pulse==1)
            {

            pulse=0;
            output_low(PIN_D2);

            }
            else if(pulse==0)
            {

            pulse=1;
            output_high(PIN_D2);

            }





            }

            #byte T0CON =0xfd5
            #byte INTCON=0xff2

            main()
            {
            set_tris_d (0x0);


            T0CON=0x81;
            INTCON=0xA0;
            set_timer0(65536);
            while (true)
            {
            if (!get_timer0())
            {

            if (pulse==0)
            {
            set_timer0(65000);
            }

            if ( pulse==1)
            {
            set_timer0(65000);
            }

            }
            }


            }

            خدمت دوستعزیزم جناب sa3id هم باید عرض کنم که پری اسکالر را چندین بار عوض کردم . ودر تمام موارد همین مشکل وجود داشت . :angry:
            دلا خوبـــان دل خونيــــن پســـندند
            دلا خون شو که خوبان اين پسندند
            متاع کفر و دين بيآ‌مشتري نيست
            گروهــــي آن گروهي اين پســـندند

            دیدگاه


              #7
              پاسخ : یک مشکل ساده (!) در کار با تایمر0

              اورگا ...........اورگا ...... :wow: فهمیدم مشکل از چیه :nice:... وقتی تایمر من سر ریز میشه میره توی روتین وقفه ، و اون رو اجرا میکنه . و وقتی که از روتین وقفه میاد بیرون ، چونکه مقدار تایمر دیگه صفر نیست ، وارد if نمیشه ، برای همین ، دوباره مقدار دهی نمیشه و همیشه از 0 تا 65535 را میشمره .... وقتی که مقدار دهی اولیه تایمر را بردم داخل روتین وقفه ، دیدم که نسبت به مقدار اولیه حساس شد و به این ترتیب تونستم فرکانسمو کنترل کنم . فقط یک مسئله بسیار نگران کننده بوجود اومده .. led هام با سرعت چشمک میزنن و مدار درست کار میکنه ... اما گاهی اوقات بعد از مثلا 3-4 دقیقه یا بیشتر یا کمتر ، میبینم که یکهو مدار وا میسته ، انگار خوابش میبره :surprised: :surprised: ... گاهی هم اینطوری نمیشه... میخوام بدونم باید تنظیم خاصی انجام بدم که مدار اینطوری بخواب فرو نره ؟ پایه ریست را با مقاومت یک کیلو به vcc وصل کرده بودم ... الان بجای یک کیلو ، صد اهم گذاشتم .... خود آی سی میکرو کنترلرم را هم عوض کردم ، با آی سی نو هم همین مشکل را داشت ... چرا اینقدر موقع کار با میکرو به ایرادهای غیرقابل پیش بینی میخورم ؟؟ :cry2:...روی هیچ چیش نمیشه حساب کرد
              در ضمن ببخشید که اینقدر اینجا سوال میکنم ... باور کنید یک روز داشتم باهاش سر و کله میزدم . وقتی دیدم به بن بست رسیدم ، سوالمو اینجا مطرح کردم ... وگرنه خودم هم میدونم نباید انجمن را با سوال های ساده و ابتدایی پرکنم :cry2:
              دلا خوبـــان دل خونيــــن پســـندند
              دلا خون شو که خوبان اين پسندند
              متاع کفر و دين بيآ‌مشتري نيست
              گروهــــي آن گروهي اين پســـندند

              دیدگاه


                #8
                پاسخ : یک مشکل ساده (!) در کار با تایمر0

                یک سوال دیگه وقتی متغیر را با این دستورا روی خانه ی خاصی از حافظه تعریف میکنیم :

                #bit PRESCALER1 = 0xfd5.0
                #bit PRESCALER2 = 0xfd5.1
                #bit PRESCALER3 = 0xfd5.2
                از این متغیر های تعریف شده در تابع ها نمیشه استفاده کرد ؟ من وقتی این ها را در روتین وقفه مینویسم ، نمشناسشون ...
                دلا خوبـــان دل خونيــــن پســـندند
                دلا خون شو که خوبان اين پسندند
                متاع کفر و دين بيآ‌مشتري نيست
                گروهــــي آن گروهي اين پســـندند

                دیدگاه

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