اطلاعیه

Collapse
No announcement yet.

[گفتگو و تبادل نظر] سوالات برنامه نویسی در کامپایلر CCS

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

    پاسخ : سوالات برنامه نویسی در کامپایلر CCS

    نوشته اصلی توسط s_m_tabatabaee
    سلام کسی تا حالا با PIC12629 کار کرده
    چه جوری می توان این ای سی را در مود LOW POWER قرار دا و چه جوری می توانیم ر CCS حافظه EPROM را برنامه ریزی کرد
    برای EEPROM ، دستورات read_eeprom و write_eeprom رو تو help بررسی کنین.
    برای Low Power، دستور sleep(); باید اجرا بشه.

    دیدگاه


      پاسخ : سوالات برنامه نویسی در کامپایلر CCS

      سلام
      ممنون از پاسختون

      در مورد دستور sleep که فرمودید به نظرم این دستور کلا میکرو را غیر فعال می کنه در صورتیکه من می خوام میکرو کار خودش را انجام بده در دیتا شیت pic نوشته که مصرف این آی سی Picf12629 کمتر از یک میلی آمپر است ولی در عمل این موضوع حدود 2 میلی آمپر است من مجبورم برای کارم از کم مصرف ترین حالت استفاده کنم
      نکته دیگر اینکه منظورم از eprom حافظه داخلی eprom خود میکرو است آیا باز هم با همون دستورات امکان پذیر است
      سوال دیگری هم داشتم اینکه در کامپایکر ccs رجیستر های خود میکرو را چه جوری مستقیما ادرس دهی میکنن برای مثال من می خوام بیت ششم رجیستر OPTION دز میکرو PIC12f508 و یا PICf12629 را برنامه ریزی کنم این بیت برای فعال کردن مقاومت PULLUp پورت ها در نظر گرفته شده است.
      اگر ممکنه کمک کنید من تازه از AVR به PIC سوییچ کردم و با کامپایکر CCS مشکل دارم

      دیدگاه


        پاسخ : سوالات برنامه نویسی در کامپایلر CCS

        نوشته اصلی توسط s_m_tabatabaee
        سوال دیگری هم داشتم اینکه در کامپایکر ccs رجیستر های خود میکرو را چه جوری مستقیما ادرس دهی میکنن
        باید اول رجیستر یا بیت رو تعریف کنید.

        برای آدرس دهی SFR به اسم:
        کد:
        #byte PWMCON  = getenv("SFR:PWMCON")
        برای آدرس دهی SFR به آدرس:
        کد:
        #byte INTCON=0xB
        برای آدرس دهی بیت های SFR به اسم خودشان:
        کد:
        #bit CCP1ASE  = getenv("BIT:CCP1ASE")
        برای آدرس دهی بیت های SFR به شماره بیت در رجیستر:
        کد:
        #bit RBIF = INTCON.0
        استفاده:
        کد:
        INTCON = 0x80;
        GIE = 1;

        دیدگاه


          پاسخ : سوالات برنامه نویسی در کامپایلر CCS

          سلام دوستان. من حدود یک هفته ای هست که از avr به pic مهاجرت کردم و تازه دارم اونو یاد میگیرم.به یه مشکلی تو وقفه تایمر ها برخورد کردم و اون اینه که برنامه وارد وقفه نمیشه. اگه میشه راهنماییم کنید. اینم کد برنامه:
          کد:
          #include <16F877A.h> 
          #use delay(clock=1000000)
          #define use_portb_lcd TRUE 
          #include <lcd.c> 
          int8 i;
          #int_timer0 
          void Timer0_isr()  
          { 
          set_timer0(60);
            i++; 
          }
          void main() {  
            setup_timer_0 ( RTCC_INTERNAL | RTCC_DIV_128 ); 
            interrupt_active(INT_TIMER0);
            enable_interrupts(global);
            set_timer0(60); 
            lcd_init(); 
            while (true) {
             lcd_gotoxy( 1, 2); 
             printf(lcd_putc,"cnt=%u",i); 
             }   
          }
          سُبُّوحٌ قُدُّوسٌ رَبُّ الْمَلَائِکَةِ وَ الرُّوحِ

          (SMART DESIGN....(POWERFUL & QUICK

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

          دیدگاه


            پاسخ : سوالات برنامه نویسی در کامپایلر CCS

            interrupt_active بررسی میکنه که یک پرچم وقفه روشن هست یا نه. (به منوال کامپایلر مراجعه کنید)
            شما باید وقفه تایمر 0 رو اینجوری فعال کنید.
            کد:
              enable_interrupts(INT_TIMER0);

            دیدگاه


              پاسخ : سوالات برنامه نویسی در کامپایلر CCS

              سلام مجدد. ممنون که پاسخ دادید ولی هنوز برنامه وارد وقفه تایمر صفر نمیشود.
              کد:
              #include <16F877A.h> 
              #use delay(clock=1000000)
              #define use_portb_lcd TRUE 
              #include <lcd.c> 
              int8 i;
              #int_timer0 
              void Timer0_isr()  
              { 
              set_timer0(60);
                i++; 
              }
              void main() {  
                setup_timer_0 ( RTCC_INTERNAL | RTCC_DIV_128 ); 
                enable_interrupts(INT_TIMER0);
                enable_interrupts(global);
                set_timer0(60); 
                lcd_init(); 
                while (true) {
                 lcd_gotoxy( 1, 2); 
                 printf(lcd_putc,"cnt=%u",i); 
                 }   
              }
              سُبُّوحٌ قُدُّوسٌ رَبُّ الْمَلَائِکَةِ وَ الرُّوحِ

              (SMART DESIGN....(POWERFUL & QUICK

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

              دیدگاه


                پاسخ : سوالات برنامه نویسی در کامپایلر CCS

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

                دیدگاه


                  پاسخ : سوالات برنامه نویسی در کامپایلر CCS

                  سلام
                  من یه 18f6490 دارم که میخوام از lcd driver اون استفاده کنم . برای همین باید به صورت مستقیم به رجیسترهای میکرو دسترسی داشته باشم. چجوری باید اینکار را بکنم؟


                  کسی نظری نداره؟

                  دیدگاه


                    پاسخ : سوالات برنامه نویسی در کامپایلر CCS

                    سلام دوستان. بنده در ارتباط سریال با ماژول از وقفه تایمر صفر به این صورت استفاده کردم که هر یک ثانیه حدودا تایمر سر ریز شده و دستوری به ماژول از طریق ارتباط سریال بفرسته . برای اطمینان یک عدد led هم گذاشتم که هربار وارد روتین وقفه شد، روشن خاموش شه.
                    حالا وقتی تغذیه رو وصل میکنم دوبار بیشتر خاموش روشن نمیشه.
                    در ضمن خطاهای کامپایل و برنامه در زیر اورده شده است.
                    راستی اگه بخوایم از رروتین خود سریال استفاده کنیم، چه کنیم؟
                    متشکریم از جواب شما
                    عکس نمیدونم از کجا بذارم برای قرار دادن عکس خطاها.

                    [code=c]
                    #include <Uart2.h>
                    #INCLUDE <stdlib.h>
                    #use rs232(baud=9600,parity=N, xmit=PIN_C6,rcv=PIN_C7,bits=8,stream=PORT1)
                    #use delay(xtal=20Mhz)
                    #fuses HS,NOWDT
                    #define LCD_RS_PIN PIN_b0
                    #define LCD_RW_PIN PIN_b1
                    #define LCD_ENABLE_PIN PIN_b2
                    #define LCD_DATA4 PIN_b3
                    #define LCD_DATA5 PIN_b4
                    #define LCD_DATA6 PIN_b5
                    #define LCD_DATA7 PIN_b6
                    #include <LCD.c>
                    unsigned char snd,rcv;
                    #INT_TIMER0
                    void togle()
                    {
                    output_toggle(pin_a0);
                    set_timer0(15536);
                    snd='*';
                    putc(snd);
                    snd='P';
                    putc(snd);
                    rcv=getc();
                    printf(lcd_putc,"%c",rcv);
                    }
                    void main()
                    {
                    lcd_init();
                    set_tris_a(0x00);
                    Setup_timer_0(RTCC_INTERNAL|RTCC_DIV_128);
                    enable_interrupts(int_timer0);
                    enable_interrupts(global);
                    }
                    [/code]
                    رو به خودت نسبت هستی مده!**دل به چنین مستی و پستی مده! //زانچه نداری ز چه افسردهآ‌ای*و زغم و اندوه دل آزردهآ‌ای؟!//گر ببرد ور بدهد دست دوست*ور بِبَرد ور بنهد مُلک اوست//ور بِکِشی یا بکُشی دیو غم **کج نشود دست قضا را قلم//آنچه خدا خواست همان میآ‌شود**وآنچه دلت خواست نه آن میآ‌شود.
                    ....

                    دیدگاه


                      پاسخ : سوالات برنامه نویسی در کامپایلر CCS

                      سلام
                      من با اینکه از دستور byte# برای ادرس دهی مستقیم استفاده میکنم ولی هیچ اتفاقی نمیفته ، مثلا برای pic16f877 مینویسم:
                      byte PB=0x06 #
                      ولی با اینکه تو ()while برنامه مینویسم:
                      PB=0B11111111
                      ولی هیچ اتفاقی نمیفته !! :eek:
                      به نظرتون چی را دارم اشتباه انجام میدم؟

                      دیدگاه


                        پاسخ : سوالات برنامه نویسی در کامپایلر CCS

                        نوشته اصلی توسط amanver
                        سلام دوستان. بنده در ارتباط سریال با ماژول از وقفه تایمر صفر به این صورت استفاده کردم که هر یک ثانیه حدودا تایمر سر ریز شده و دستوری به ماژول از طریق ارتباط سریال بفرسته . برای اطمینان یک عدد led هم گذاشتم که هربار وارد روتین وقفه شد، روشن خاموش شه.
                        حالا وقتی تغذیه رو وصل میکنم دوبار بیشتر خاموش روشن نمیشه.
                        در ضمن خطاهای کامپایل و برنامه در زیر اورده شده است.
                        راستی اگه بخوایم از رروتین خود سریال استفاده کنیم، چه کنیم؟
                        متشکریم از جواب شما
                        عکس نمیدونم از کجا بذارم برای قرار دادن عکس خطاها.
                        اون <Uart2.h> چیه که اینکلود کردین؟
                        قبل از use delay نباید rs232 رو بنویسید

                        آخر void main باید حتما یه while (true) باشه

                        به صورت زیر برنامه رو تغییر دادم روتین وقفه درست اجرا میشه چک کردن دستورات سریال با خودتون :

                        [code=c]
                        #include <16f877a.h>
                        #use delay(xtal=20Mhz)
                        #use rs232(baud=9600,parity=N, xmit=PIN_C6,rcv=PIN_C7,bits=8,stream=PORT1)
                        #fuses HS,NOWDT
                        #define LCD_RS_PIN PIN_b0
                        #define LCD_RW_PIN PIN_b1
                        #define LCD_ENABLE_PIN PIN_b2
                        #define LCD_DATA4 PIN_b3
                        #define LCD_DATA5 PIN_b4
                        #define LCD_DATA6 PIN_b5
                        #define LCD_DATA7 PIN_b6
                        #include <LCD.c>
                        unsigned char snd,rcv;
                        #INT_TIMER0
                        void togle()
                        {
                        output_toggle(pin_a0);
                        set_timer0(15536);
                        /*snd='*';
                        putc(snd);
                        snd='P';
                        putc(snd);
                        rcv=getc();
                        printf(lcd_putc,"%c",rcv);
                        */
                        }
                        void main()
                        {
                        lcd_init();
                        set_tris_a(0x00);
                        Setup_timer_0(RTCC_INTERNAL|RTCC_DIV_128);
                        enable_interrupts(int_timer0);
                        enable_interrupts(global);

                        while(true);
                        }
                        [/code]

                        قبل از printf lcd هم باید gotoxy بزنید
                        AYRIC

                        دیدگاه


                          پاسخ : سوالات برنامه نویسی در کامپایلر CCS

                          نوشته اصلی توسط mkhpmkhp
                          سلام
                          من با اینکه از دستور byte# برای ادرس دهی مستقیم استفاده میکنم ولی هیچ اتفاقی نمیفته ، مثلا برای pic16f877 مینویسم:
                          byte PB=0x06 #
                          ولی با اینکه تو ()while برنامه مینویسم:
                          PB=0B11111111
                          ولی هیچ اتفاقی نمیفته !! :eek:
                          به نظرتون چی را دارم اشتباه انجام میدم؟
                          باید پورت b رو tris کنید میتونید با استفاده از تابع set_tris یا رجیستر TRISB که آدرسش 0x86 هست استفاده کنید
                          AYRIC

                          دیدگاه


                            پاسخ : سوالات برنامه نویسی در کامپایلر CCS

                            من به عنوان مثال دستور زیر را نوشتم:
                            [code=c]
                            <include <16F877.h#
                            (use delay(xtal=4Mhz#
                            byte b=0x06#
                            void main()
                            {

                            while(true
                            {
                            ( set_tris_b (0xff);

                            }
                            }[/code]

                            ولی بازم تو پرتئوس برای پورت b هیچ اتفاقی نمیفته . . .

                            دیدگاه


                              پاسخ : سوالات برنامه نویسی در کامپایلر CCS

                              توی رجیستر tris هر بیت 1 نشان دهنده یک ورودی و هر بیت 0 نشان دهنده یک خروجی است پس مقدار 0 رو به رجیستر بدید اگه میخواید همه پایه ها خروجی بشه

                              [code=c]
                              #byte PB=0x06
                              #byte TRISB=0x86

                              void main()
                              {
                              TRISB=0x00;
                              PB=0xAA;

                              while(true);
                              }
                              [/code]
                              AYRIC

                              دیدگاه


                                پاسخ : سوالات برنامه نویسی در کامپایلر CCS

                                [left][right][center]
                                کد:
                                #include <16F877.h>
                                #use delay(xtal=4Mhz)
                                #byte PB=0x06 
                                #byte TRISB=0x86
                                void main()
                                {
                                TRISB=0x00;
                                PB=0b00000001;
                                while(true);
                                }

                                من عین کد بالا را نوشتم ولی بازم توی پرتوئوس بیت0 از پورتb هیچ تغییری نمیکنه (همچنان صفر باقی میمونه) !!
                                oo:

                                فکر نمیکنم مشکل از پرتئوس یا ccs باشه

                                نمیدونم مشکل از کجاست؟؟؟
                                :question: :question: :question: :question: :question: :question: :question:



                                اضافه شده در تاریخ :
                                :smile:

                                http://www.rodfile.com/fvpcf7r1pqa1

                                دیدگاه

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