اطلاعیه

Collapse
No announcement yet.

مشکل با مد compare از واحد ccp-eccp

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

    مشکل با مد compare از واحد ccp-eccp

    سلام به همه ی دوستان عزیز :smile:

    توی یه پرژه می خوام یه سیگنال مربعی با دوره ی 50 درصد وفرکانس حدود 17khz درست کنم .رفتم سراغ واحد ccp و مد کامپیر رو با حالت toggle پایه ی خروجی انتخواب کردم . متسفانه اصلا با تغییر مقدار رجیستر های مقایسه (ccpr1l ,ccpr1h) فرکانس شکل موج خروجی تغییر نمیکنه وفرکانس خروجی هم خیلی پایینه. درصورتی
    که توی دیتاشیت نوشته که محتوای رجیستر شمازشی TMR و CCPR1 مدام باهم مقایسه میشن ودر صورت برابری بفرض پایه ی CCP1 تغییر وضعیت میده(toggle میشه)

    بعد رفتم سراغ خود کتابخونه های خود میکروچیپ و واحد CCP رو تنظیم کردم باز هم همون جوابی رو که با حالت دستی نوشته بودم رو داد :angry:
    لطفا کمک کنید چون دیگه چیزی به ذهنم نمیرسه و اصلا انتظار همچین جوابی رو نداشتم.
    من روی چند تا میکرو هم تست کردم وهمشون مثل هم جواب دادن(PIC18F1220-PIC18F452-PIC18F4550) .آیا اصلا PIC توان تولید این نوع شکل موج رو با واحد CCP ومد
    مقایسه در حالت toggle رو داره یانه. از همه ی اساتید تقاضا دارم که کمک کنند :biggrin:
    با تشکر.

    برنامه با کتابخونه ی میکروچیپ:

    کد:
    /* 
     * File:  P18F452_COMP.c
     * Author: SAEED RAZAZZADEH
     *
     * Created on June 23, 2013, 8:54 AM
     */
    
    #define _XTAL _FREQ 16000000
    #define USE_OR_MASKS
    
    #include <xc.h>
    #include <p18f452.h>
    #include <plib/timers.h>
    #include <plib/compare.h>
    
    //#pragma config CONFIG1H = 0x22
    __CONFIG(1, OSC_HS & OSCS_OFF);
    //#pragma config CONFIG2L = 0xF
    __CONFIG(2, PWRT_OFF & BOR_ON & BORV_20);
    //#pragma config CONFIG2H = 0xE
    __CONFIG(3, WDT_OFF & WDTPS_128);
    //#pragma config CONFIG3H = 0x0
    __CONFIG(4, CCP2MUX_OFF);
    //#pragma config CONFIG4L = 0x81
    __CONFIG(5, STVR_ON & LVP_OFF);
    //#pragma config CONFIG5L = 0xF
    __CONFIG(6, CP0_OFF & CP1_OFF & CP2_OFF & CP3_OFF);
    //#pragma config CONFIG5H = 0xC0
    __CONFIG(7, CPB_OFF & CPD_OFF);
    //#pragma config CONFIG6L = 0xF
    __CONFIG(8, WRT0_OFF & WRT1_OFF & WRT2_OFF & WRT3_OFF);
    //#pragma config CONFIG6H = 0xE0
    __CONFIG(9, WRTC_OFF & WRTB_OFF & WRTD_OFF);
    //#pragma config CONFIG7L = 0xF
    __CONFIG(10, EBTR0_OFF & EBTR1_OFF & EBTR2_OFF & EBTR3_OFF);
    //#pragma config CONFIG7H = 0x40
    __CONFIG(11, EBTRB_OFF);
    
    
    void main(void) {
    
      unsigned int period=0x0010;
      TRISDbits.TRISD1=0;
    
      //---Configure timer for corresponding timer module selection for capture module---
      SetTmrCCPSrc(T1_SOURCE_CCP);
      OpenTimer1(TIMER_INT_OFF | T1_16BIT_RW | T1_SOURCE_INT | T1_PS_1_1);
    
      //---Configure output compare ---
      period = 0x0101;
      OpenCompare1( COM_INT_OFF | COM_TOGG_MATCH , period);
    
      while(1){
    
        PORTDbits.RD1=~PORTDbits.RD1;
      }
    }
    حالت دستی (کامپایلر MICROC):

    کد:
    void main() {
    
      //MCU: PIC18F1220
      //CCP MODE-> COMPARE TOGGLE ON RB3
    
      TRISB.RB3=0;
      
      CCP1CON=0x02;
      T1CON=0x00;
      T3CON.T3CCP1=0;
      TMR1L=0;
      TMR1H=0;
      CCPR1L=0x40;
      CCPR1H=0x01;
      T1CON.TMR1ON=1;
      
      while(1);
    }
    در زندگيت به کسي اعتــــماد کن که به او ايمــــان داري نه احســاس . . .

    چه بسيار انسان ها ديدم تنشان لباس نبود؛و چه بسيار لباس ها ديدم که انساني درونش نبود ...!

    #2
    پاسخ : مشکل با مد compare از واحد ccp-eccp

    شما باید وقفه ccp رو فعال کنید و در داخل اون تایمر رو صفر کنید.
    وگرنه تایمر بعد از عبور از مقدار ccpr تا 65535 میره و خودش ریست میشه.
    مقدار ccpr هم برای فرکانس 17 کیلوهرتز باید 941 باشه.(کریستال 16 مگ)

    راه حل بهتری هم هست که نیاز به وقفه رو حذف میکنه و اون استفاده از مد pwm هست.
    در اون صورت تایمر 2 باید پریودش 234 باشه.









    دیدگاه


      #3
      پاسخ : مشکل با مد compare از واحد ccp-eccp

      بله دقیقا همین طور که شما میگید من هم به همین نتیجه رسیدم خیلی از تون ممنونم ولی امان از این دیتا شیتا خیلی بد توضیح میدن.

      برنامه برای فرکانس 500 کیلو روی پایه ی RC2 کریستال 16MHz:

      کد:
      /* 
       * File:  P18F452_COMP.c
       * Author: SAEED RAZAZZADEH
       *
       * Created on June 23, 2013, 8:54 AM
       */
      
      #define _XTAL_FREQ 16000000
      #define USE_OR_MASKS
      //=======================================================
      #include <xc.h>
      #include <plib/timers.h>
      #include <plib/compare.h>
      //=======================================================
      //#pragma config CONFIG1H = 0x22
      __CONFIG(1, OSC_HS & OSCS_OFF);
      //#pragma config CONFIG2L = 0xF
      __CONFIG(2, PWRT_OFF & BOR_ON & BORV_20);
      //#pragma config CONFIG2H = 0xE
      __CONFIG(3, WDT_OFF & WDTPS_128);
      //#pragma config CONFIG3H = 0x0
      __CONFIG(4, CCP2MUX_OFF);
      //#pragma config CONFIG4L = 0x81
      __CONFIG(5, STVR_ON & LVP_OFF);
      //#pragma config CONFIG5L = 0xF
      __CONFIG(6, CP0_OFF & CP1_OFF & CP2_OFF & CP3_OFF);
      //#pragma config CONFIG5H = 0xC0
      __CONFIG(7, CPB_OFF & CPD_OFF);
      //#pragma config CONFIG6L = 0xF
      __CONFIG(8, WRT0_OFF & WRT1_OFF & WRT2_OFF & WRT3_OFF);
      //#pragma config CONFIG6H = 0xE0
      __CONFIG(9, WRTC_OFF & WRTB_OFF & WRTD_OFF);
      //#pragma config CONFIG7L = 0xF
      __CONFIG(10, EBTR0_OFF & EBTR1_OFF & EBTR2_OFF & EBTR3_OFF);
      //#pragma config CONFIG7H = 0x40
      __CONFIG(11, EBTRB_OFF);
      //=======================================================
      void gl_interrupt_init(void);
      void ccp_comp_init(void);
      //=======================================================
      void interrupt comp_isr(void){
      
        TMR1=0x0000;
        PIR1bits.CCP1IF=0;
      }
      
      
      
      void main(void) {
      
        TRISDbits.TRISD1=0;
      
        ccp_comp_init();
        gl_interrupt_init();
       
        while(1){
      
          PORTDbits.RD1=~PORTDbits.RD1;
        }
      }
      
      //=======================================================
      void gl_interrupt_init(void){
      
        INTCONbits.GIE=1;
        INTCONbits.PEIE=1;
      }
      //=======================================================
      void ccp_comp_init(void){
      
        unsigned int period=0x0010;
        //---Configure timer for corresponding timer module selection for capture module---
        SetTmrCCPSrc(T1_SOURCE_CCP);
        OpenTimer1(TIMER_INT_OFF | T1_16BIT_RW | T1_SOURCE_INT | T1_PS_1_1);
      
        //---Configure output compare ---
        TMR1=0x0000;
        period = 0x0001;
        OpenCompare1( COM_INT_ON | COM_TOGG_MATCH , period);
        PIR1bits.CCP1IF=0;
      }
      در زندگيت به کسي اعتــــماد کن که به او ايمــــان داري نه احســاس . . .

      چه بسيار انسان ها ديدم تنشان لباس نبود؛و چه بسيار لباس ها ديدم که انساني درونش نبود ...!

      دیدگاه


        #4
        پاسخ : مشکل با مد compare از واحد ccp-eccp با سرس تایمر 3

        سلام به همه ی رفقا.

        بر حسب نیاز در پروزه لازم شد که تایمر رو برای واحد CCP (مد مقایسه ) بزارم روی تایمر 3 ولی متصفانه خروجی RB3 تاگل نمیشه وقفه ی خود تایمر3
        رو جداگانه امتحان کردم رخ میده ودرست کار میکنه ولی نمیدونم چرا توی واحد CCP پایه تاگل نمیشه دیتا شیت رو هم خیلی خوندم ولی علت رو نتونستم
        پیدا کنم .

        لطف کنید یه نگاهی به برنامه بندازیند ببینید مشکل از چیه.من فعلا دسترسی به XC هم ندارم که امتحان کنم. اما فکر کنم اونم همین جوابو بده احتمالا
        ایراد از برنامه هست.

        با تشکر از همه.


        //MCU: PIC18F1220

        void main() {

        TRISB.RB3=0;

        PIR1.CCP1IF=0;
        CCP1CON=0x02;// compare mod (toggle RB3)
        CCPR1=0x00EB;
        TMR3L=0x00;
        TMR3H=0x00;
        T3CON=0x09;// timer3 for ccp , pres 1:1 , start timer 3


        while(1){

        if(PIR1.CCP1IF==1){
        PIR1.CCP1IF=0;
        TMR3L=0;
        TMR3H=0;
        }

        }

        }
        در زندگيت به کسي اعتــــماد کن که به او ايمــــان داري نه احســاس . . .

        چه بسيار انسان ها ديدم تنشان لباس نبود؛و چه بسيار لباس ها ديدم که انساني درونش نبود ...!

        دیدگاه


          #5
          پاسخ : مشکل با مد compare از واحد ccp-eccp


          بنده تا حالا با 18F1220 کار نکردم ولی دیتاشیتش رو دانلود کردم و یک نگاهی بهش انداختم.
          برای اینکه منبع کلاک CCP1 تایمر3 باشد مقدار T3CON باید 0x41 باشد.
          توصیه میکنم دیتاشیت را با دقت بیشتری بخونید.
          کد:
          RD16  T3CCP2  T3CKPS1  T3CKPS0  T3CCP1  T3SYNC  TMR3CS  TMR3ON
           0    1     0      0     0     0     0     1

          دیدگاه


            #6
            پاسخ : مشکل با مد compare از واحد ccp-eccp

            سلام از اینکه پاسخ دادین ممنون. فقط فکر کنم دیتاشیت احتمالا از میکروی pic18f1220 نباشه چون بیت T3CCP2 توی رجیستر TIMER3 از این میکرو نیست و
            مربوط به میکرو هایی است که دو تا واحد CCP دارند مثل PIC18F4550.

            PIC18F1220
            1 0 0 1 0 0 U
            RD16 — T3CKPS1 T3CKPS0 T3CCP1 T3SYNC TMR3CS TMR3ON
            در زندگيت به کسي اعتــــماد کن که به او ايمــــان داري نه احســاس . . .

            چه بسيار انسان ها ديدم تنشان لباس نبود؛و چه بسيار لباس ها ديدم که انساني درونش نبود ...!

            دیدگاه


              #7
              پاسخ : مشکل با مد compare از واحد ccp-eccp

              متاسفانه دیتاشیت شما ایراد داره.
              سندی که لینکش رو در زیر گذاشتم errata ی این قطعه و دیتاشیت اون هست:
              http://ww1.microchip.com/downloads/en/DeviceDoc/80244d.pdf

              دیدگاه


                #8
                پاسخ : مشکل با مد compare از واحد ccp-eccp

                دوست عزیز واقعا ازتون کمال تشکر رو دارم :applause:

                ولی آخه یه همچین خطا های بزرگی هیچوقت نباید توی دیتاشیت رخ بده وگر یه نفر مثل من ممکن 3یا 4 روز وقت روش بزاره(آخه من از کجا بدونم باید
                ERETA این قطعه رو بگیرم. )

                بازم از کمکتون ممنون.
                در زندگيت به کسي اعتــــماد کن که به او ايمــــان داري نه احســاس . . .

                چه بسيار انسان ها ديدم تنشان لباس نبود؛و چه بسيار لباس ها ديدم که انساني درونش نبود ...!

                دیدگاه


                  #9
                  پاسخ : مشکل با مد compare از واحد ccp-eccp

                  حق با شماست. در واقع به نوعی بدشانسی آوردید در این مورد.
                  ولی کلاً وقتی تصمیم میگیرید با یک آیسی بیشتر کار کنید بهتره Errataش رو هم دانلود کنید.
                  موفق باشید

                  دیدگاه

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