اطلاعیه

Collapse
No announcement yet.

مشکل در خصوص استفاده از وقفه تغییر وضعیت پورت B در میکروکنترلر PIC16F877A

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

    مشکل در خصوص استفاده از وقفه تغییر وضعیت پورت B در میکروکنترلر PIC16F877A

    سلام به همه اساتید
    خیلی خیلی نیاز به کمک دارم چون حسابی گیر کردم . من وقتی برای وقفه تغییر پورت B برنامه می نویسم و روی میکرو پرگرام میکنم بدون اینکه پورت B رو هیچ گونه تغییر وضعیتی بدم مدام وقفه خودش اجرا میشه و باز به برنامه برمیگرده (تو حلقه میفته) البته تو نرم افزار پروتئوس این مشکل زمانی ایجاد میشه که دکمه P.B متصل به یکی از پورت های B4 تا B7 رو میزنم (یعنی باز تو حلقه میفته) پیشاپیش از راهنمایی هاتون ممنونم.
    اینم برناممک
    DEFINE OSC 4
    on interrupt goto ISR
    TRISB=%11110000

    TRISC.2=0
    INTCON=%10001000
    MAIN:
    PAUSE 5
    PORTC.2=1
    PAUSE 1000
    GOTO MAIN
    DISABLE
    ISR:
    PAUSE 50
    PORTC.2=0
    PAUSE 1000
    INTCON.0=0
    PAUSE 50

    RESUME
    ENABLE
    END

    #2
    پاسخ : مشکل در خصوص استفاده از وقفه تغییر وضعیت پورت B در میکروکنترلر PIC16F877A

    احتمالا تغییرات ناخواسته مانند نویز بر روی چار پین RB4 الی RB7 دارید. میتونیدPullup رو برای این چهار پین فعال کنید یا با مقاومت های خارجی Pull Down کنید.

    دیدگاه


      #3
      پاسخ : مشکل در خصوص استفاده از وقفه تغییر وضعیت پورت B در میکروکنترلر PIC16F877A

      از توجه شما خیلی ممنون
      اما PULL UP رو فعال کردم ولی نشد علاوه بر این تو نرم افزار پروتئوس که نویز ناخواسته نداریم مشکل اینجاست که با نرم افزار هم همین مشکل هست. علاوه بر این برای امتحان کلید فشاری رو تو مدارم از پورت B اساسا قطع کردم و هیچ ورودی و خروجی رو هم به پورت B وصل نکردم ولی باز LED هم تو نرم افزار و هم در حالت عملی مدام چشمک میزنه. یعنی وقفه داره مدام اجرا میشه.

      دیدگاه


        #4
        پاسخ : مشکل در خصوص استفاده از وقفه تغییر وضعیت پورت B در میکروکنترلر PIC16F877A

        سلام دوست عزیز
        این وقفه وضعیت کنونی چهار بیت بالای پورت B را با وضعیت قبلی مقایسه کرده و اگر تفاوتی بوجود آمده باشد باعث ایجاد وقفه می¬شود. این وقفه با بیت RBIE از ثبات INTCON.3 فعال می¬شود و هنگامیکه این وقفه رخ داد بیت پرچم آن RBIF یک می¬شود در وقفه تغییر پورت B پس از بازگشت از برنامه سرویس وقفه هنوز امکان عدم تطابق مقدار Latch شده با مقدار جدید پایه¬های PORTB وجود دارد، در نتیجه مجددا پرچم RBIF یک شده و برنامه سرویس وقفه دوباره اجرا می¬شود. برای جلوگیری از این شرایط باید در برنامه سرویس وقفه علاوه بر اینکه پرچم RBIF صفر شود عملیات خواندن یا نوشتن بر روی PORTB نیز انجام شود در این صورت دیگر امکان تحریک وقفه بدون تغییر در مقدار PORTB وجود نخواهد داشت.
        نوشته شده از کتاب میکروکنترلر PIC مهندس حسین چهرقانی

        دیدگاه


          #5
          پاسخ : مشکل در خصوص استفاده از وقفه تغییر وضعیت پورت B در میکروکنترلر PIC16F877A

          با تشکر از شما
          همانطور که گفته بودید مجددا پورت B را هم خواندم هم روش نوشتم به صورت زیر (در زیر وقفه تغییر پورت B). مشکل در نرم افزار شبیه ساز حل شد ولی در حالت عملی باز بدون هیچ اعمال تحریکی در پورت B وقفه اجرا می گردد آیا عمل خواندن و نوشتن پورت B را درست انجام داده ام یا نه ؟ :question:

          ON INTERRUPT GOTO VAGHFE
          OPTION_REG=%10100100
          INTCON=%10001000
          : MAIN
          A=PORTB
          Goto MAIN
          DISABLE
          :VAGHFE
          I=I+1

          pause 1000
          PORTB=PORTB
          INTCON.0=0
          PORTB=PORTB
          RESUME
          ENABLE
          END
          البته لازمه بگم بخش های مربوط به تعریف متغییر ها را برای کم شدن حجم در بالا نیاوردم

          دیدگاه


            #6
            پاسخ : مشکل در خصوص استفاده از وقفه تغییر وضعیت پورت B در میکروکنترلر PIC16F877A

            سلام
            نه متاسفانه عمل خواندن و نوشتن را درست انجام ندادید شما پورت بی را خواندید و روی خود ذخیره کردید و این اصلا درست نیست و عمل خواندن و نوشتن را باید در زیر برنامه وقفه انجام دهید مقاومت بالا کش هم فراموش نشود و فقط خواندن هم کفایت می کند

            C=PORTB
            C یک متغیر می باشد این را در آخرین خط برنامه وقفه بنویسید

            دیدگاه


              #7
              پاسخ : مشکل در خصوص استفاده از وقفه تغییر وضعیت پورت B در میکروکنترلر PIC16F877A

              منظور از آخرین خط برنامه وقفه قبل از resume و یا بعد از enable ؟

              دیدگاه


                #8
                پاسخ : مشکل در خصوص استفاده از وقفه تغییر وضعیت پورت B در میکروکنترلر PIC16F877A

                یکم تلاش کنی پیداش می کنی کار سختی نیست
                موفق باشید

                دیدگاه


                  #9
                  پاسخ : مشکل در خصوص استفاده از وقفه تغییر وضعیت پورت B در میکروکنترلر PIC16F877A

                  با تشکر فراوان از کاربر PICC :applause:
                  مشکل حل شد و برنامه زیر رو به همه تقدیم می کنم این برنامه یک تایمر هست که با فشرده شدن دکمه فشاری متصل به پورت B7 وقفه تغییر وضعیت پورت B باعث فعال شدنش شده و ثانیه و دقیقه و ساعت سپری شده رو نشان می دهد برای میکرو 16F877A نوشته شده کامپایلر PICBASICPRO هست و برای محاسبه زمان سپری شده از تایمر 1 این میکرو بهره می بره و کاملا دقیق است اوسیلاتور میکرو را 4 MHZ انتخاب کردم :nice:

                  TRISB=%10000001
                  I VAR BYTE
                  SEC VAR BYTE
                  TEMP VAR BYTE
                  C VAR BYTE
                  TMPW VAR WORD
                  MINT VAR BYTE
                  HOUR VAR BYTE
                  TMPW=64286
                  HOUR=0
                  MINT=0
                  SEC=0
                  I=0
                  TEMP=0

                  DEFINE LCD_DREG PORTD
                  DEFINE LCD_DBIT 4
                  DEFINE LCD_RSREG PORTD
                  DEFINE LCD_RSBIT 3
                  DEFINE LCD_EREG PORTD
                  DEFINE LCD_EBIT 2
                  DEFINE LCD_BITS 4
                  DEFINE LCD_LINES 2
                  DEFINE LCD_COMMANUS 100
                  DEFINE LCD_DATAUS 50
                  DEFINE LCD_INITMS=100
                  LCDINIT
                  FLAGS=0

                  ON INTERRUPT GOTO VAGH
                  OPTION_REG=%00000100
                  INTCON=%11001000
                  T1CON=%00100000
                  PIE1=%00000001
                  TMR1H=TMPW.Byte1
                  TMR1L=TMPW.BYTE0
                  TRISB=%10000000



                  :MAIN
                  LCDOUT $FE,2
                  LCDOUT $FE,$0E


                  IF T1CON.0=1 THEN
                  LOW PORTC.3
                  LCDOUT #HOUR,",",#MINT,",",#SEC

                  IF TEMP>200 THEN
                  SEC=SEC+1
                  TEMP=0
                  ENDIF

                  IF SEC=60 THEN
                  SEC=0
                  LCDOUT $FE,1
                  MINT=MINT+1
                  HIGH PORTC.3
                  PAUSE 500
                  ENDIF

                  IF MINT=60 THEN
                  HOUR=HOUR+1
                  MINT=0
                  LCDOUT $FE,1
                  ENDIF

                  LOW PORTC.3
                  ENDIF

                  Goto MAIN


                  DISABLE
                  :VAGH
                  IF T1CON.0=1 THEN
                  TEMP=TEMP+1
                  TMR1H=TMPW.Byte1
                  TMR1L=TMPW.BYTE0
                  PIR1.0=0
                  ENDIF

                  IF INTCON.0=1 THEN
                  T1CON.0=1
                  PAUSE 50
                  HIGH PORTC.3
                  INTCON.0=0
                  C=PORTB
                  ENDIF



                  RESUME
                  ENABLE
                  END



                  کاملا تست شده اگر باهاش مشکل داشتید با من تماس بگیرید:
                  sana.link@gmail.com
                  :bye

                  دیدگاه

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