اطلاعیه

Collapse
No announcement yet.

اینتراپت ساده در PIC18F

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

    اینتراپت ساده در PIC18F

    سلام
    من میخوام یه اینتراپت ساده روی پایه INT0 تولید کنم که با زدن این دکمه روی لبه پایین رونده وارد سرویس روتین بشه
    اما اصلا نمیدونم چی به چی باید باشه :sad:
    میشه اگر کسی برنامه ای داره یا کسی که وارده اینتراپت رو برام توضیح بده
    من با MPLAM X کار میکنم
    ممنون
    درایور شبکه و nRF24L01
    کاتالوگ محصولات
    کنترلر CNC شش محوره براي پرينتر 3D و Pick n Place
    شبيه ساز تک تيرانداز و سيبل ديجيتال با پردازش تصوير
    فروش اسيلوسکوپ GWinstek GOS-630FC

    #2
    پاسخ : اینتراپت ساده در PIC18F

    نوشته اصلی توسط بسطام بیرامی
    سلام
    من میخوام یه اینتراپت ساده روی پایه INT0 تولید کنم که با زدن این دکمه روی لبه پایین رونده وارد سرویس روتین بشه
    اما اصلا نمیدونم چی به چی باید باشه :sad:
    میشه اگر کسی برنامه ای داره یا کسی که وارده اینتراپت رو برام توضیح بده
    من با MPLAM X کار میکنم
    ممنون
    من با زبان برنامه نویسی MPLAM اصلا آشنا نیستم ولی توی همه زبانهایی که دیدم یه پروسیجر اینتراپت که اسم خاصی داره رو توی برنامه اضافه میکنن و توی ان هر کاری که بخای رو انجام میدی. البته باید قبلش توی برنامه اصلی بیت های فعال کردن این اینتراپت رو فعال کنی.
    برای پیدا کردن اسم اینتراپت توی help خود نرم افزار MPLAM یه سرچی بزن.
    میدونی بیت اینتراپت رو چطوری باید فعال کنی؟

    دیدگاه


      #3
      پاسخ : اینتراپت ساده در PIC18F

      نوشته اصلی توسط arvinfx
      من با زبان برنامه نویسی MPLAM اصلا آشنا نیستم ولی توی همه زبانهایی که دیدم یه پروسیجر اینتراپت که اسم خاصی داره رو توی برنامه اضافه میکنن و توی ان هر کاری که بخای رو انجام میدی. البته باید قبلش توی برنامه اصلی بیت های فعال کردن این اینتراپت رو فعال کنی.
      برای پیدا کردن اسم اینتراپت توی help خود نرم افزار MPLAM یه سرچی بزن.
      میدونی بیت اینتراپت رو چطوری باید فعال کنی؟
      مرسی
      بله بلدم اینم نوشتم نمیدونم مشکلش چییه؟ :sad:

      کد:
      /* 
       * File:  Interrupt.c
       * Author: 12
       *
       * Created on October 23, 2012, 10:51 AM
       */
      
      #include <stdio.h>
      #include <stdlib.h>
      #include <p18f26k22.h>
      #include <delays.h>
      
      
      //#define My_LED PORTCbits.RC0
      void chk_isr (void);
      void INT0_ISR(void);
      #pragma code My_int = 0x0008
      void My_int (void)
      {
        _asm
            goto chk_isr
        _endasm
      }
      #pragma code
      #pragma interrupt chk_isr
      
      void chk_isr (void)
      
      {
        if ( INTCONbits.INT0IF == 1)
          INT0_ISR();
      }
      
      
      
      void main (void)
      {
        TRISCbits.TRISC3 = 0;  //RC3 output
        TRISCbits.TRISC0 = 0;  // RC0 output
        PORTCbits.RC0 = 1;   // LED on
        TRISBbits.TRISB0 = 1;  // INT0 Input
        INTCONbits.INT0IF = 0; // clear INT0 Flag
        INTCONbits.INT0IE = 1; // enable INT0 Interrupt
        INTCON2bits.INTEDG0 = 0;  // make in neg edge
        INTCONbits.GIE = 1; //enable all int
      
        while (1)
        {
          PORTCbits.RC3 = 0;
          Delay10KTCYx(10);
          PORTCbits.RC3 = 1;
          Delay10KTCYx(10);
        }
      
      }
      
      
      void INT0_ISR (void)
      {
        
        PORTCbits.RC0 = 0;
        Delay10KTCYx(10);
        PORTCbits.RC0 = 1;
        Delay10KTCYx(10);
        INTCONbits.INT0IF = 0; // clear INT0 Flag
      }
      از کتاب دکتر مزیدی هم کمک گرفتم توی اینتراپت نمیره :sad:
      درایور شبکه و nRF24L01
      کاتالوگ محصولات
      کنترلر CNC شش محوره براي پرينتر 3D و Pick n Place
      شبيه ساز تک تيرانداز و سيبل ديجيتال با پردازش تصوير
      فروش اسيلوسکوپ GWinstek GOS-630FC

      دیدگاه


        #4
        پاسخ : اینتراپت ساده در PIC18F

        با سلام

        ایتراپت در این کامپایلر یک سری قلق خاص داره که اگر کتاب " میکروکنترلرهای pic برنامه نویسی اسمبلی و c " را مطالعه نکنید مشکل میتوانید در این کامپایلر از اینتراپت استفاده کنید

        در هر صورت من کد ها را برای شما قرار میدم


        کد:
        /*============================*/
        
        #pragma code high_vector = 0x08
        void interrupt_at_high_vector(void)
        {
        _asm GOTO high_isr _endasm
        }
        #pragma code /* return to the default code section */
        
        
        #pragma code low_vector=0x18
        void interrupt_at_low_vector(void)
        {
        _asm GOTO low_isr _endasm
        }
        #pragma code /* return to the default code section */
        
        /*============================*/
        
        
        #pragma interrupt high_isr
        void high_isr (void)
        {
         
        کد های شما برای روتین وقفه اولویت بالا
        
        }
        
        
        
        #pragma interruptlow low_isr
        void low_isr (void)
        {
         
        کد های شما برای روتین وقفه اولویت پایین
        
        }

        حال در برنامتون بعد از main باید وقفه ها و وقفه مورد نظرتون رو فعال کنید

        با INTCONbits.GIEH = 1 همه وقفه های اولویت بالا میتوانند فعال شوند و
        با INTCONbits.GIEL = 1 همه وقفه های اولویت پایین میتوانند فعال شوند

        با INTCONbits.INT0IE = 1 وقفه INT0 فعال میشود
        دقت منید وقفه INT0 فقط اولویت بالا دارد :arrow:

        با INTCON2bits.INTEDG0 = 0 وقفه INT0 حساس به لیه پایین رونده میشود


        موفق باشید
        نا اميدي يه دروغ بزرگه که آدما به خودشون ميگن
        تلاش يه حقيقت بزرگه که با صبر به ثمر ميرسه

        دیدگاه


          #5
          پاسخ : اینتراپت ساده در PIC18F

          مرسی ولی بازم کار نمیکنه
          کد منو چک میکنی ببینی چه مشکلی داره؟!
          هم کتاب رو خوندم هم کل datasheet رو و همه قسمت های Interrupt رو دقیق بررسی کردم ولی میخوام وقتی کلید که به INT0 وصله میزنم LED روی پایه RC0 تغییر کنه نمیشه
          مشکل از کجاست؟!

          کد:
          /* 
           * File:  Interrupt.c
           * Author: 12
           *
           * Created on October 23, 2012, 10:51 AM
           */
          
          #include <stdio.h>
          #include <stdlib.h>
          #include <p18f26k22.h>
          #include <delays.h>
          
          
          void high_isr (void);
          void low_isr (void);
          
          /*============================*/
          
          #pragma code high_vector = 0x08
          void interrupt_at_high_vector(void)
          {
          _asm GOTO high_isr _endasm
          }
          #pragma code /* return to the default code section */
          
          
          #pragma code low_vector=0x18
          void interrupt_at_low_vector(void)
          {
          _asm GOTO low_isr _endasm
          }
          #pragma code /* return to the default code section */
          
          /*============================*/
          
          
          void main (void)
          {
            INTCON = 0xD0;
            TRISCbits.TRISC3 = 0;  //RC3 output
            TRISCbits.TRISC0 = 0;  // RC0 output
            PORTCbits.RC0 = 1;   // LED on
            TRISBbits.RB0 = 1;  // INT0 Input
            INTCONbits.INT0IF = 0; // clear INT0 Flag
            INTCONbits.INT0IE = 1; // enable INT0 Interrupt
            INTCON2bits.INTEDG0 = 0;  // make in neg edge
            INTCONbits.GIEH = 1; //enable all int
            RCONbits.IPEN = 1;   //enable priority levels
            TRISCbits.RC1 = 0 ;
            PORTCbits.RC1 = 1 ;
          
            while (1)
            {
              PORTCbits.RC3 = 0;
              Delay10KTCYx(10);
              PORTCbits.RC3 = 1;
              Delay10KTCYx(10);
            }
          
          }
          
          
          #pragma interrupt high_isr
          void high_isr (void)
          {
          
          //کد های شما برای روتین وقفه اولویت بالا
           PORTCbits.RC0 = 0;
           Delay10KTCYx(10);
           PORTCbits.RC0 = 1;
           Delay10KTCYx(10);
           INTCONbits.INT0IF = 0; // clear INT0 Flag
          
          }
          
          
          
          #pragma interruptlow low_isr
          void low_isr (void)
          {
          
          //کد های شما برای روتین وقفه اولویت پایین
           PORTCbits.RC1 = 0;
           Delay10KTCYx(10);
           PORTCbits.RC1 = 1;
           Delay10KTCYx(10);
           INTCONbits.INT0IF = 0; // clear INT0 Flag
          
          }
          درایور شبکه و nRF24L01
          کاتالوگ محصولات
          کنترلر CNC شش محوره براي پرينتر 3D و Pick n Place
          شبيه ساز تک تيرانداز و سيبل ديجيتال با پردازش تصوير
          فروش اسيلوسکوپ GWinstek GOS-630FC

          دیدگاه


            #6
            پاسخ : اینتراپت ساده در PIC18F

            من حتی فایل COF رو هم توی Proteus شبیه سازی کردم
            مشکلی نداره همه چی درست ست میشه ولی وقتی دکمه رو فشار میدم فلگINTCONbits.INT0IF ست نمیشه و توی اینتراپت نمیره
            چرا؟!
            من به صورت دستی توی برنامه INTCONbits.INT0IF رو یک میکنم برنامه میره توی سرویس روتین اینتراپت و درست میشه
            ولی وقتی دکمه فشار داده میشه فلگ ست نمیشه و توی سرویس روتین نمیره مشکل از کجاست؟!
            درایور شبکه و nRF24L01
            کاتالوگ محصولات
            کنترلر CNC شش محوره براي پرينتر 3D و Pick n Place
            شبيه ساز تک تيرانداز و سيبل ديجيتال با پردازش تصوير
            فروش اسيلوسکوپ GWinstek GOS-630FC

            دیدگاه


              #7
              پاسخ : اینتراپت ساده در PIC18F

              نوشته اصلی توسط بسطام بیرامی
              من حتی فایل COF رو هم توی Proteus شبیه سازی کردم
              مشکلی نداره همه چی درست ست میشه ولی وقتی دکمه رو فشار میدم فلگINTCONbits.INT0IF ست نمیشه و توی اینتراپت نمیره
              چرا؟!
              من به صورت دستی توی برنامه INTCONbits.INT0IF رو یک میکنم برنامه میره توی سرویس روتین اینتراپت و درست میشه
              ولی وقتی دکمه فشار داده میشه فلگ ست نمیشه و توی سرویس روتین نمیره مشکل از کجاست؟!
              فایل پروتئوستو + هگز بده

              دیدگاه


                #8
                پاسخ : اینتراپت ساده در PIC18F

                نوشته اصلی توسط arvinfx
                فایل پروتئوستو + هگز بده
                همه چی هست با MPlab و Proteus فایل C ، Hex و COF

                http://vip.eca.ir/sharing/uploads/13510665591.rar
                درایور شبکه و nRF24L01
                کاتالوگ محصولات
                کنترلر CNC شش محوره براي پرينتر 3D و Pick n Place
                شبيه ساز تک تيرانداز و سيبل ديجيتال با پردازش تصوير
                فروش اسيلوسکوپ GWinstek GOS-630FC

                دیدگاه


                  #9
                  پاسخ : اینتراپت ساده در PIC18F

                  نوشته اصلی توسط بسطام بیرامی
                  همه چی هست با MPlab و Proteus فایل C ، Hex و COF

                  http://vip.eca.ir/sharing/uploads/13510665591.rar
                  تنضیمات اسیلاتور و من ندیدم. از اسیلاتور داخلی 4Mhz استفاده کردی؟ اگر اینطوره تنظیماتشم باید انجام بدی.

                  دیدگاه


                    #10
                    پاسخ : اینتراپت ساده در PIC18F

                    بلی اسیلاتور داخلی استفاده کردم
                    کار میکنه مشکلی نداره ADC رو هم راه انداختم
                    فقط اینتراپت نمیگیره
                    گفتم اگر فلگ رو هم دستی توی برنامه ست کنم میره توی سرویس روتین و برنامه اینتراپت رو اجرا میکنه
                    ولی وقتی دکمه فشار داده میشه این فلگ ست نمیشه که بره توی روتین اینتراپت :sad:
                    درایور شبکه و nRF24L01
                    کاتالوگ محصولات
                    کنترلر CNC شش محوره براي پرينتر 3D و Pick n Place
                    شبيه ساز تک تيرانداز و سيبل ديجيتال با پردازش تصوير
                    فروش اسيلوسکوپ GWinstek GOS-630FC

                    دیدگاه


                      #11
                      پاسخ : اینتراپت ساده در PIC18F

                      سلام
                      برنامتون به صورت زیر تصحیح شد


                      کد:
                      
                      /*
                       * File:  Interrupt.c
                       * Author: 12
                       *
                       * Created on October 23, 2012, 10:51 AM
                       */
                      
                      #include <stdio.h>
                      #include <stdlib.h>
                      #include <p18f2620.h>
                      #include <delays.h>
                      
                      #pragma config OSC=HS
                      #pragma config LVP=OFF
                      #pragma config WDT=OFF
                      
                      
                      void high_isr (void);
                      
                      /*============================*/
                      
                      #pragma code baby= 0x08
                      void baby(void)
                      {
                      _asm GOTO high_isr _endasm
                      }
                      #pragma code /* return to the default code section */
                      #pragma interrupt high_isr
                      void high_isr (void)
                      {
                        if(INTCONbits.INT0IF==1) {
                       PORTCbits.RC0 = 0;
                       Delay10KTCYx(10);
                       PORTCbits.RC0 = 1;
                       Delay10KTCYx(10);
                       PORTCbits.RC0 = 0;
                       Delay10KTCYx(10);
                       PORTCbits.RC0 = 1;
                       Delay10KTCYx(10);
                       PORTCbits.RC0 = 0;
                       Delay10KTCYx(10);
                       PORTCbits.RC0 = 1;
                       Delay10KTCYx(10);
                       INTCONbits.INT0IF = 0; // clear INT0 Flag
                        }
                      }
                      
                      
                      
                      void main (void)
                      {
                        //INTCON = 0xFD;
                        TRISCbits.TRISC3 = 0;  //RC3 output
                        TRISCbits.TRISC0 = 0;  // RC0 output
                        PORTCbits.RC0 = 1;   // LED on
                        TRISBbits.TRISB0 = 1;  // INT0 Input
                        ADCON0bits.ADON=0;
                        ADCON1=0x0f;
                        //INTCONbits.INT0IF = 0; // clear INT0 Flag
                        INTCONbits.INT0IE = 1; // enable INT0 Interrupt
                        INTCON2bits.INTEDG0 = 1;  // make in neg edge
                        INTCONbits.GIEH = 1; //enable all int
                        INTCONbits.PEIE = 1;
                      
                        
                        TRISCbits.RC1 = 0 ;
                        PORTCbits.RC1 = 1 ;
                        PORTCbits.RC0 = 0;
                      
                        while (1)
                        {
                          PORTCbits.RC3 = 1;
                          Delay10KTCYx(10);
                          PORTCbits.RC3 = 0;
                          Delay10KTCYx(10);
                          PORTCbits.RC3 = 1;
                          Delay10KTCYx(10);
                          PORTCbits.RC3 = 0;
                          Delay10KTCYx(10);
                          PORTCbits.RC3 = 1;
                          Delay10KTCYx(10);
                          PORTCbits.RC3 = 0;
                          Delay10KTCYx(10);
                          //INTCONbits.INT0IF = 1;  // agar in khat ro faal ****d toye proteus va roy board vagheyi javab mide va dastorate toye high_isr ejra mishe
                        }
                      
                      }


                      نکات:
                      1-در قسمت خانه وقفه سعی کنین اسم تابع وقفه و نام بردار آن یکی باشد که در این مثال baby
                      2-سعی کنین تمامی #pragma ها رو در ابتدای برنامه قرار بدین تا وضوح و سادگی برنامه بیشتر شود
                      3-در وقفه تمامی کارها رو قرار نداین فلگی یا متغییری را تعریف کنین که هنگام برگشت به برنامه آن کار را انجام دهد یا کمترین قسمت کد را در قسمت وقفه قرار بدین

                      4-در ابتدای برنامه باید در صورت عدم استفاده از روش پروگرمینگ با ولتاژ کم LVP را خاموش و همچنین در صورت عدم استفاده از watchdog ان را حتما غیر فعال کنین و در برنامه منبع نوسان را مشخص کنین

                      5-پینهای مربوط به ADC در هنگام راه اندازی به صورت خودکار به آنالوگ که حالت دیفالت آنها هست تغییر وضعیت می دهند پس از هر پینی که احتیاج دارین به صورت دیجیتال استفاده کنین ابتدا قسمت آنالوگ مربوط به آن را خاموش کنین

                      هیچ دانش آموزی نیست که به در خانۀ دانشمندی آمد و شد کند, مگر این که خداوند برای هر گامی که برمی دارد عبادت یک سال را برایش رقم زند.

                      دیدگاه


                        #12
                        پاسخ : اینتراپت ساده در PIC18F

                        مرسی تست میکنم خبرشو میدم بهتون
                        و این که توی این پروژه ممکنه خیلی بهتون نیاز داشته باشم بازم مزاحمتون میشم
                        من میخوام از کریستال داخلی استفاده کنم همون HS بذارم مشکلی نداره؟!
                        برای کریستال داخلی حداکثر چه مقداری وجود داره؟! و چطور میشه کریستال داخلی رو روی حداکثر تنظیم کرد
                        و کلا چه فرقی مثلا بین استفاده از کریستال داخلی 8مگ با کریستال 8مگ خارجی داره؟!
                        ممنون
                        درایور شبکه و nRF24L01
                        کاتالوگ محصولات
                        کنترلر CNC شش محوره براي پرينتر 3D و Pick n Place
                        شبيه ساز تک تيرانداز و سيبل ديجيتال با پردازش تصوير
                        فروش اسيلوسکوپ GWinstek GOS-630FC

                        دیدگاه


                          #13
                          پاسخ : اینتراپت ساده در PIC18F

                          فدات درست شد
                          مرسی :wow:
                          درایور شبکه و nRF24L01
                          کاتالوگ محصولات
                          کنترلر CNC شش محوره براي پرينتر 3D و Pick n Place
                          شبيه ساز تک تيرانداز و سيبل ديجيتال با پردازش تصوير
                          فروش اسيلوسکوپ GWinstek GOS-630FC

                          دیدگاه


                            #14
                            پاسخ : اینتراپت ساده در PIC18F

                            نوشته اصلی توسط بسطام بیرامی
                            فدات درست شد
                            مرسی :wow:
                            تبریک. مشکل چی بود حالا؟

                            دیدگاه


                              #15
                              پاسخ : اینتراپت ساده در PIC18F

                              نوشته اصلی توسط arvinfx
                              تبریک. مشکل چی بود حالا؟
                              مرسی
                              5-پینهای مربوط به ADC در هنگام راه اندازی به صورت خودکار به آنالوگ که حالت دیفالت آنها هست تغییر وضعیت می دهند پس از هر پینی که احتیاج دارین به صورت دیجیتال استفاده کنین ابتدا قسمت آنالوگ مربوط به آن را خاموش کنین

                              که با اضافه کردن این دو خط برطرف شد
                              ADCON0bits.ADON=0;
                              ADCON1=0x0f;
                              درایور شبکه و nRF24L01
                              کاتالوگ محصولات
                              کنترلر CNC شش محوره براي پرينتر 3D و Pick n Place
                              شبيه ساز تک تيرانداز و سيبل ديجيتال با پردازش تصوير
                              فروش اسيلوسکوپ GWinstek GOS-630FC

                              دیدگاه

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