اطلاعیه

Collapse
No announcement yet.

مشکل با timer0 18f در c18

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

    مشکل با timer0 18f در c18

    با سلام :wow:

    من یه برنامه نوشتم که با timer0 کار کنم :mrgreen:

    خود timer رو به صورت 16bit راه انداختم ولی خروجی که میخوام به من نمیده تایماش درست در نمیاد :sad: کل برنامه رو گذاشتم

    یه سوال

    من اومدم از flag تایمر 0 برای چک کردن استفاده کردم از طرفی چون این بیت داخل ریجیستر وقفه هست نمیخواد که وقفه رو روشن کنم ؟


    #include<p18f4550.h>
    #pragma config WDT=OFF,LVP=OFF,FOSC=HS

    void wait(void);
    #define mybit PORTBbits.RB4
    void main(){

    TRISBbits.TRISB4=0;
    while(1){
    mybit=0;
    wait();
    mybit=1;
    wait();


    }
    }
    void wait(void){
    T0CON=0x7; // timer0 is off ,16bit mod,prescaler=256
    TMR0H=0;
    TMR0L=0;
    T0CONbits.TMR0ON=1;
    while(INTCONbits.TMR0IF==0);
    T0CONbits.TMR0ON=0;
    INTCONbits.TMR0IF==0;
    }
    عامل کليدي تمام موفقيتها " عمل کردن" است

    #2
    پاسخ : مشکل با timer0 18f در c18

    سلام

    من با C18 کار نکردم،چیزایی که به نظرم میرسه ایناست:

    بهتره برای مقدار دادن به خروجی درحالت دیجیتال از رجیستر LAT مربوط به هر پورت استفاده کنید.

    در صفحه 129 دیتا شیت یه قسمت با زمینه خاکستری با عنوان Note هست که میگه نوشتن در رجیستر TMR0 باعث پاک شدن مقدار تنظیم شده در Prescaler میشه.پس توی تابع wait،بهتره اول رجیسترهای TMR0 رو مقداردهی کنید,بعد Prescaler رو تنظیم کنید.

    من اومدم از flag تایمر 0 برای چک کردن استفاده کردم از طرفی چون این بیت داخل ریجیستر وقفه هست نمیخواد که وقفه رو روشن کنم ؟
    نه لزومی نداره حتما وقفه فعال باشه

    INTCONbits.TMR0IF==0
    باید از تک مساوی(=)استفاده کنید.

    موفق باشید.

    دیدگاه


      #3
      پاسخ : مشکل با timer0 18f در c18

      اقا ممنون


      من TMR0 رو هم اول مقداردهی کردم ولی بازم نشد حتی DEBUG هم کردم مقدار رجیسترها درست بود
      عامل کليدي تمام موفقيتها " عمل کردن" است

      دیدگاه


        #4
        پاسخ : مشکل با timer0 18f در c18

        نوشته اصلی توسط میلاد.م
        در صفحه 129 دیتا شیت یه قسمت با زمینه خاکستری با عنوان Note هست که میگه نوشتن در رجیستر TMR0 باعث پاک شدن مقدار تنظیم شده در Prescaler میشه.پس توی تابع wait،بهتره اول رجیسترهای TMR0 رو مقداردهی کنید,بعد Prescaler رو تنظیم کنید.
        توجه داشته باشید که با نوشتن یک مقدار در تایمر تنظیمات پیش تقسیم کننده پاک یا عوض نمیشه بلکه مقدار شمارنده مربوط به Prescaler (که قابل خواندن و نوشتن به صورت مستقیم هم نیست) صفر میشه.

        دیدگاه


          #5
          پاسخ : مشکل با timer0 18f در c18

          سلام دوستان


          مشکل راه اندازیش حل شد فقط یه مشکل دیگه داره اونم اینکه زمان حساب شده با زمان تایمر یکی نیست ( دقیق نیست)

          میتونه از کدهایی که کامپایلر تولید میکنه باشه ؟؟
          عامل کليدي تمام موفقيتها " عمل کردن" است

          دیدگاه


            #6
            پاسخ : مشکل با timer0 18f در c18

            اقا مشکل حل شد :applause:

            مشکل از CPUDIV بود که مقدارش برابر با دو بود اون رو به یک تغییر دادم حل شد
            عامل کليدي تمام موفقيتها " عمل کردن" است

            دیدگاه

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