اطلاعیه

Collapse
No announcement yet.

مقداردهی در mikroc

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

    مقداردهی در mikroc

    با سلام
    من تازه دارم با mikroc کار میکنم. یک سوال دارم. نحوه مقداردهی به رجیسترها به صورت کلی یا به صورت بیتی در mikroc چگونه است
    مثلا رجیستر QEI1CON یک رجیستر 16 بیتی مربوط به قسمت Quadrature Encoder Interface است
    چگونه میتوان این رجیستر 16 بیتی را مقداردهی کرد
    چگونه میتوان به بیت خاص آن مثلا بیت 11 آن که UPDN نام دارد مقدارداد
    لازم به ذکر است که کتابخانه QEI در mikroc هنوز تعریف نشده است.
    با تشکر

    #2
    پاسخ : مقداردهی در mikroc

    با سلام
    کد:
    void main()
    {
    ...
    QEI1CON=0x00ff;
    ...
    QEI1CON.UPDN=0;
    ...
    }
    یا علی
    هر وقت خواستید کاری بکنید، چهل سال عقب و چهل سال جلو را در نظر بگیرید. "بابابزرگ"

    دیدگاه


      #3
      پاسخ : مقداردهی در mikroc

      نوشته اصلی توسط abolfazlk873
      با سلام
      کد:
      void main()
      {
      ...
      QEI1CON=0x00ff;
      ...
      QEI1CON.UPDN=0;
      ...
      }
      ارور گرفت جان برادر
      خط برنامه:
      QEI2CON.QEIM = 0; // Disable QEI Module
      ارور:
      29 317 Operator '.' is not applicable to these operands 'QEI2CON' lcd1.c

      دیدگاه


        #4
        پاسخ : مقداردهی در mikroc

        با سلام
        دوست عزیز شما با چه میکرویی کار می کنید؟ ببینید طریقه مقدار دهی رجیسترها در نرم افزار MIKROC چه به صورت بیت و چه به صورت word به همان صورتی است که گفته شد.
        اما من یه نمونه از مقداردهی با میکروکنترلر dspic33ep256mu806 را مربوط به کوادریچر انکودر به شما نمایش میدهم . 100% تست شده است.

        کد:
        void main()
        {
        ...
        QEI2CON=0x000f;
        ...
        QEI2CON.QEIEN=0;
        ...
        }
        یا علی
        هر وقت خواستید کاری بکنید، چهل سال عقب و چهل سال جلو را در نظر بگیرید. "بابابزرگ"

        دیدگاه


          #5
          پاسخ : مقداردهی در mikroc

          یه روش دیگه هم هست، مثلا بیت فعال/غیر فعال کردن اینتراپت GIE هست که تو رجیستر INTCON قرار داره.لازم نیست بنویسین مثلا INTCON.b0=1 فقط نوشته بشه GIE_bit=1 کافیه و کار هم میکنه و ساده تر هم هست که موقع خوندن برنامه قابل فهم تره.
          حالا این QEI چه ماژولی هست؟ شماره ی میکرو چی هست؟

          دیدگاه


            #6
            پاسخ : مقداردهی در mikroc

            نوشته اصلی توسط شاهرخ
            حالا این QEI چه ماژولی هست؟ شماره ی میکرو چی هست؟
            QEI ماژولی برای خواندن خروجی شفت انکدر است که برای تعیین جهت و سرعت موتور استفاده میشود.
            شماره میکرو dspic33fj64gs606 است

            دیدگاه


              #7
              پاسخ : مقداردهی در mikroc

              نوشته اصلی توسط abolfazlk873
              با سلام
              دوست عزیز شما با چه میکرویی کار می کنید؟ ببینید طریقه مقدار دهی رجیسترها در نرم افزار MIKROC چه به صورت بیت و چه به صورت word به همان صورتی است که گفته شد.
              اما من یه نمونه از مقداردهی با میکروکنترلر dspic33ep256mu806 را مربوط به کوادریچر انکودر به شما نمایش میدهم . 100% تست شده است.

              کد:
              void main()
              {
              ...
              QEI2CON=0x000f;
              ...
              QEI2CON.QEIEN=0;
              ...
              }
              یا علی
              سلام
              روشی که شما فرمودید درست کار میکند
              روش شما برای بیتهای تکی جواب میدهد اما وقتی QEIM بیت شماره 8- 10 رجیستر QEI2CON رو شامل میشود و به آن بدین صورت مقدار میدهیم به مشکل میخورد

              دیدگاه


                #8
                پاسخ : مقداردهی در mikroc

                با سلام

                کد:
                void main()
                {
                ...
                QEI2CON=0x000f;
                ...
                QEI2CON.QEIM_0=0;
                 QEI2CON.QEIM_1=0;
                 QEI2CON.QEIM_2=0;
                .....
                }
                یا علی
                هر وقت خواستید کاری بکنید، چهل سال عقب و چهل سال جلو را در نظر بگیرید. "بابابزرگ"

                دیدگاه


                  #9
                  پاسخ : مقداردهی در mikroc

                  بچه ها یه سوال نسبتا نا مربوط!

                  میکروهایی که اینجا اسم برده شده اکثرا سری dsPIC هستن. این ها رو با چی پروگرم میکنین؟ PICkit2 ساپورتشون میکنه؟ یا...

                  دیدگاه


                    #10
                    پاسخ : مقداردهی در mikroc

                    نوشته اصلی توسط شاهرخ
                    بچه ها یه سوال نسبتا نا مربوط!

                    میکروهایی که اینجا اسم برده شده اکثرا سری dsPIC هستن. این ها رو با چی پروگرم میکنین؟ PICkit2 ساپورتشون میکنه؟ یا...
                    من از pickit3 استفاده می کنم

                    دیدگاه


                      #11
                      پاسخ : مقداردهی در mikroc

                      pickit3
                      هر وقت خواستید کاری بکنید، چهل سال عقب و چهل سال جلو را در نظر بگیرید. "بابابزرگ"

                      دیدگاه


                        #12
                        پاسخ : مقداردهی در mikroc

                        نوشته اصلی توسط yadegari
                        سلام
                        روشی که شما فرمودید درست کار میکند
                        روش شما برای بیتهای تکی جواب میدهد اما وقتی QEIM بیت شماره 8- 10 رجیستر QEI2CON رو شامل میشود و به آن بدین صورت مقدار میدهیم به مشکل میخورد
                        همونطور که دوست عزیزمون گفتن برای تک بیتی استفاده میشه . دستورات سخت افزاری تمامشون تو کامپایلرها همشون مشترک هستن . مثل دستورات اسمبلی که همه کامپایلرها باید ساپورت کنن .
                        اما برای مقدار دهی های خواص در PIC ها دستورهای جدایی وجود داره که استاندارد هستن و در کامپایلرها استفاده میشن . البته همه ی میکروها ساپورت نمیشن . اما اغلب DS ها دارنش .
                        کد:
                            ADSTAT = 0; // Clear the ADSTAT register */
                            IFS0bits.ADIF = 0; /* Clear ADC Interrupt Flag*/
                        
                          ADCPC0bits.SWTRG1 = 1;  //Start conversion of channels AN3 and AN2.
                            ADON_bit = 0;
                        
                            ADCONbits.ADSIDL  = 0;// Operate in Idle Mode */
                            ADCONbits.GSWTRG  = 0;// Global Software Trigger bit
                            ADCONbits.FORM   = 0;// Output in Integer Format - (DOUT = 0000 00dd dddd dddd)*/
                        وقتی کلمه بیت تکی استفاده میشود مثل ADON_bit = 0 .
                        اما وقتی چندین بیت از یک رجیستر خواص رو میخوایم باهم یکجا تغییر بدیم ، میشود ADCONbits.ADCS = 5 . اینجا چند بیت باهم در یک دستور تغییر داده شدن . بای






                        if all men are the same
                        then
                        why do women take so long to choose one ?

                        دیدگاه


                          #13
                          پاسخ : مقداردهی در mikroc

                          نوشته اصلی توسط abolfazlk873
                          اما من یه نمونه از مقداردهی با میکروکنترلر dspic33ep256mu806 را مربوط به کوادریچر انکودر به شما نمایش میدهم . 100% تست شده است.
                          سلام مهندس abolfazlk873
                          به نظرم شما با قسمت QEI میکرو کار کردید،دوستان دیگه ای که با این قسمت کار کردند ممنون میشم کمک کنند
                          من همونطور که گفتم با dspic33fj64gs606 دارم کار میکنم
                          این میکرو دو ماژول QEI دارد. همانگونه که اطلاع دارید از این ماژولها هم در مد quadrature میشود استفاده کرد هم در مد تایمر کانتر
                          من از ماژول QEI2 برای خواندن سیگنال خروجی شفت انکدر که به صورت A/B Phase هستند استفاده کردم که خیلی خوب جواب میدهد و تعداد پالسهای خروجی را به درستی میشمارد
                          از ماژول QEI1 به عنوان کانتر استفاده کردم تا بتواند نوع دیگری از سیگنال خروجی انکدر به نام pulse direction را بخوانم،همانگونه که مستحضرید در سیگنال pulse direction دو سیگنال وجود دارد یکی جهت حرکت را نشان میدهد و دیگری سرعت حرکت را نشان میدهد
                          اگر سیگنال direction صفر باشد کانتر تعداد پالسها را به صورت کاهشی میشمارد اما اگر اگر سیگنال direction صفر باشد کانتر تعداد پالسها را به صورت افزایشی میشمارد.
                          من قسمت کاهشی را به خوبی جواب میگیرم اما قسمت افزایشی را درست جواب نمی گیرم
                          دوستانی که اطلاع دارند لطفا نظر بدهند
                          کد:
                             // LCD module connections
                          sbit LCD_RS at LATD10_bit;
                          sbit LCD_EN at LATD8_bit;
                          sbit LCD_D4 at LATD4_bit;
                          sbit LCD_D5 at LATD5_bit;
                          sbit LCD_D6 at LATD6_bit;
                          sbit LCD_D7 at LATD3_bit;
                          
                          sbit LCD_RS_Direction at TRISD10_bit;
                          sbit LCD_EN_Direction at TRISD8_bit;
                          sbit LCD_D4_Direction at TRISD4_bit;
                          sbit LCD_D5_Direction at TRISD5_bit;
                          sbit LCD_D6_Direction at TRISD6_bit;
                          sbit LCD_D7_Direction at TRISD3_bit;
                          // End LCD module connections
                          
                          
                          char txt1[] = "Pulse:";
                          char txt2[] = "A/B:";
                          
                          unsigned int i=0,j=0;
                          char buffer1[16],buffer2[16];
                                         // Loop variable
                          
                          void main(){
                           ADPCFG = 0xFFFF;          // Configure AN pins as digital I/O
                           
                           //QEI1 module
                           QEI1CON.QEIM_0 = 0; // Disable QEI Module
                           QEI1CON.QEIM_1 = 0;
                           QEI1CON.QEIM_2 = 0;
                           QEI1CON.CNTERR = 0; // Clear any count errors
                           QEI1CON.QEISIDL = 0; // Continue operation during sleep
                           QEI1CON.SWPAB = 0; // QEA and QEB not swapped
                           QEI1CON.PCDOUT = 1; // Normal I/O pin operation
                           QEI1CON.POSRES = 1; // Index pulse resets position counter
                           DFLT1CON.CEID = 1; // Count error interrupts disabled
                           DFLT1CON.QEOUT = 0; // Digital filters output Disable for QEn pins
                           //DFLT1CON.QECK = 5; // 1:64 clock divide for digital filter for QEn
                           //DFLT1CONbits. = 1; // Digital filter output enabled for Index pin
                           //DFLT1CONbits.INDCK = 5; // 1:64 clock divide for digital filter for Index
                           POS1CNT = 0; // Reset position counter
                           //QEI1CON.QEIM = 6; // X4 mode with position counter reset by Index
                           QEI1CON.QEIM_0 = 1; // Enable QEI Module in Pulse Direction mode
                           QEI1CON.QEIM_1 = 0;
                           QEI1CON.QEIM_2 = 0;
                           QEI1CON.TQGATE = 0;
                           QEI1CON.TQCS = 1;
                           QEI1CON.UPDN = 1;
                           QEI1CON.b0 = 0; //UDSRC Position Counter Direction Selection Control bit
                           QEI1CON.b3 = 0; //TQCKPS Timer Input Clock Prescale Select bits
                           QEI1CON.b4 = 0;
                           
                           
                           //QEI2 module
                           QEI2CON.QEIM_0 = 0; // Disable QEI Module
                           QEI2CON.QEIM_1 = 0;
                           QEI2CON.QEIM_2 = 0;
                           QEI2CON.CNTERR = 0; // Clear any count errors
                           QEI2CON.QEISIDL = 0; // Continue operation during sleep
                           QEI2CON.SWPAB = 0; // QEA and QEB not swapped
                           QEI2CON.PCDOUT = 0; // Normal I/O pin operation
                           QEI2CON.POSRES = 1; // Index pulse resets position counter
                           DFLT2CON.CEID = 1; // Count error interrupts disabled
                           DFLT2CON.QEOUT = 0; // Digital filters output enabled for QEn pins
                           //DFLT2CON.QECK = 5; // 1:64 clock divide for digital filter for QEn
                           //DFLT1CONbits. = 1; // Digital filter output enabled for Index pin
                           //DFLT1CONbits.INDCK = 5; // 1:64 clock divide for digital filter for Index
                           POS2CNT = 0; // Reset position counter
                           //QEI2CON.QEIM = 6; // X4 mode with position counter reset by Index
                           QEI2CON.QEIM_0 = 0; // Enable QEI Module in A/B phase mode
                           QEI2CON.QEIM_1 = 1;
                           QEI2CON.QEIM_2 = 1;
                           
                           MAX1CNT = 0b10000000;
                           Lcd_Init();            // Initialize LCD
                          
                           Lcd_Cmd(_LCD_CLEAR);        // Clear display
                           Lcd_Cmd(_LCD_CURSOR_OFF);     // Cursor off
                           Lcd_Out(1,1,txt1);         // Write text in first row
                          
                           Lcd_Out(2,1,txt2);
                          
                          
                           while(1) { 
                          
                            Lcd_Cmd(_LCD_CLEAR);        // Clear display
                            Lcd_Cmd(_LCD_CURSOR_OFF);     // Cursor off
                            Lcd_Out(1,1,txt1);         // Write text in first row
                            Lcd_Out(2,1,txt2);
                            i= POS1CNT;
                            sprintf(buffer1, "%u", i);
                            Lcd_Out(1,7,buffer1);
                            j= POS2CNT;
                            sprintf(buffer2, "%u", j);
                            Lcd_Out(2,7,buffer2);
                            Delay_ms(300);
                           }
                          }

                          دیدگاه

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