اطلاعیه

Collapse
No announcement yet.

مشکل با رجیستر تایمر0

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

    مشکل با رجیستر تایمر0

    با سلام خدمت دوستان
    برنامه ای که در زیر نوشتم یه تایمر با pic16f8777 هست،که جواب میده.مشکل من با راه اندازی وقفه صفر هستش.تنها تغییری که باید در برنامه زیر داده بشه در خط ششم هستش که باید بیت T0IE از رجیستر INTCON ست بشه.یعنی خط ششم باید بصورت INTCON=0x20; تغییر کنه.(البته اگه اشتباه میکنم دوستان راهنمایی کنن).ولی با این حال به زیر برنامه(که اینجا قرارش ندادم)نمیره.اگه راهنماییم کنید ممنون میشم.

    void main() {
    int m,n
    OPTION_REG=0x87;
    lcd_init();
    TMR0=60;
    INTCON=0x00;
    while (1) {
    if (INTCON==0x04){
    TMR0=60;
    m++;
    }
    INTCON=0x00;
    if (m==10){
    n++;
    lcd_gotoxy( 1, 1);
    printf(lcd_putc,"%u",n);
    m=0;
    }
    }
    }

    آنکس که تو را شناخت جان را چه کند
    فرزنـــد و عيـــال و خـــانمان را چه کند

    #2
    پاسخ : مشکل با رجیستر تایمر0

    با سلام.
    کاشکی زیر برنامرو هم میزاشتی. oo:
    به هر حال.
    به نظر من در خط ششم باید به جای INTCON=0XA0، INTCON=0X20 بزاری.چون وقتی INTCON رو مساوی 20(00100000) قرار میدی اصلا اینتراپتو فعال نمیکنی.
    بعدش وقتی پرچم وقفه تایمر 0 فعال بشه خودش به زیر برنامه مربوطه میره و لازم نیست در برنامه رجیستر INTCON رو چک کنید.
    if (INTCON==0x04){
    TMR0=60;
    m++;

    سوما وقتی برنامه به زیر برنامه رفت،توی اونجا باید
    1- اینتراپت رو غیر فعال کنید تا از اجرای وقفه های دیگه جلو گیری کنه(با استفاده از بیتGIE در رجیسترINTCON )
    2-دوباره باید وقفه تایمر0 رو فعال کنید یعنی بیت TMR0IE از رجیسترINTCON رو یک کنی
    3- بیت پرچم وقفه TMR0 یعنی بیت TMR0IF از رجیستر INTCON رو حتما توسط برنامه پاک کنید تا دوباره در هنگام سرریزی تایمر0 بشه اونو چک کرد
    4-مقدار مورد نیاز رو در رجیستر TMR0 بریزید(در صورت نیاز)
    در کل وقتی زیر برنامه اجرا میشه باید رجیستر INTCON به این صورت باشه.
    INTCON=00100000 (یعنی اولا اینتراپت خاموش دوما وقفه تایمر فعال ،سوما بیت پرچم وقفه تایمر 0 رو پاک می کنیم)

    دیدگاه

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