اطلاعیه

Collapse
No announcement yet.

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

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

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

    آقا من فهمیدم مشکل از if نیستش و مشکل از تابع خواندن از رم خارجی هستش. اینم برنامه ای که برای تستش نوشتم.
    کد:
    BYTE read_ext_eeprom(long int address) {
      BYTE data;
    
      while(!ext_eeprom_ready());
      i2c_start();
      i2c_write((0xa0|(BYTE)(address>>7))&0xfe);
      i2c_write(address);
      i2c_start();
      i2c_write((0xa0|(BYTE)(address>>7))|1);
      data=i2c_read(0);
      i2c_stop();
      return(data);
    }
    شما اگر برنامه زیر روی یه eeprom خالی , یعنی همه بیتاش 255 باشن تست کنید میبینید که هر از چند گاهی به جای اینکه بخونه از eeprom اشتباه توش مینویسه!! اینم بگم که وقتی وقفه تایمر ایجاد میشه این مشکل پیش میادش و در غیر این صورت مشکلی نداره
    طب اسلامی

    دیدگاه


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

      من تا حالا با رم خارجی و i2c کار نکردم .
      با این حال چند تا احتمال می دم شاید به درد بخوره:
      1- شاید مشکل از زمان باشه - خواندن و نوشتن روی eeprom خیلی زمان بر هستش و می تونه مشکل ایجاد کنه . توضیح اینکه هنگام کار روی ایپیرام ها باید یک تاخیری برای هر عمل نوشتن و خواندن در نظر گرفت
      2- شاید مشکل از تابع ext_eeprom_ready باشه . توضیح اینکه اگر وقفه ای بیاد و زمانی ببره دیگه ext_eeprom در حالت ready نباشه . برای اینکه این حالت چک بشه باید بجای یک بار نوشتن while(!ext_eeprom_ready()); مدام قبل از هر دستور دیگه این عبارت تکرار بشه
      3- تو دستوراتی که نوشتید دو تا start هست و یک stop . این مسئله ساز نیست؟
      متاسفانه چون من با i2c کار نکردم ، بیشتر از این چیزی به ذهنم نمیرسه.
      موفق باشید
      دوستان عزیزم تصمیم گرفتم تا یه مدت کمتر به تالار سر بزنم . اگر دیر جواب دادم ببخشید.

      دیدگاه


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

        نوشته اصلی توسط محمدحسـین
        من تا حالا با رم خارجی و i2c کار نکردم .
        با این حال چند تا احتمال می دم شاید به درد بخوره:
        1- شاید مشکل از زمان باشه - خواندن و نوشتن روی eeprom خیلی زمان بر هستش و می تونه مشکل ایجاد کنه . توضیح اینکه هنگام کار روی ایپیرام ها باید یک تاخیری برای هر عمل نوشتن و خواندن در نظر گرفت
        2- شاید مشکل از تابع ext_eeprom_ready باشه . توضیح اینکه اگر وقفه ای بیاد و زمانی ببره دیگه ext_eeprom در حالت ready نباشه . برای اینکه این حالت چک بشه باید بجای یک بار نوشتن while(!ext_eeprom_ready()); مدام قبل از هر دستور دیگه این عبارت تکرار بشه
        3- تو دستوراتی که نوشتید دو تا start هست و یک stop . این مسئله ساز نیست؟
        متاسفانه چون من با i2c کار نکردم ، بیشتر از این چیزی به ذهنم نمیرسه.
        موفق باشید
        نه والا. من فکر میکنم زمانی که داره خاندن از eeprom انجام میشه و وقفه روی میده بعد از اتمام وقفه حافظه پشته خراب میشه و جای اینکه بره از ادامه شروع به خوندن تابع بکنه میره دوباره از اول تابع خاندن شروع به کار میکنه و همین باعث نوشت توی eeprom میشه
        طب اسلامی

        دیدگاه


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

          نوشته اصلی توسط mahdifaheca
          انگار بعضی وقتا توی اجرای دستور if اشتباه میکنه. شما برنامه ساده زیر بنویسید و هیچوقت دست به کلید نزنید . بعضی وقتا بعد از 2 یا 3 ساعت led روشن میشه و بعضی وقته بعد از چند روز
          کد:
          #define led pin_c5
          #define shasy pin_b2
          
          #int_timer1
            void Timer1_isr()
            {
             
            tmr1on=1; set_timer1(65216);/// har 64us vaghfe roy nidahad
           }
           
           void main(){int8 i; output_b(0b0);
           setup_timer_1 ( T1_internal | T1_DIV_BY_1 );
           enable_interrupts(INT_TIMER1);
           enable_interrupts(GLOBAL);
           set_tris_b(0b00000101);set_tris_a(0b0000011);
           
            while(true){output_low(led);
            if (input(shasy)){while(true){output_high(led);}}}
          دوست عزیز شما گفتین که مشکلی که قبلا مطرح کردین و ظاهرا جواب نگرفتین مربوط به ایپرام میشه
          ولی تو پستی که قبلا گذاشتین من اثری از تابع خوندن از ایپرام نمیبینم oo:
          فکر میکنم که ما با با کف بینی از وجود تابع خوندن ایپرام تو برنامه شما مطلع میشدیم

          موردی که درباره حافظه پشته عنوان کردین درست نیست قطعا این قضیه ربطی به پشته نداره اگه پشته به هم بریزه کل برنامتون بهم میریزه و میکرو معمولا هنگ میکنه. تازه این بدبخت مادر مرده ( CCS رو میگم!) اینقدر هم که شما بهش شک داری اوضاعش بد نیست.

          من پیشنهاد میکنم اول روتین ایپرام , وقفه تایمر رو با disable_interrupts(INT_TIMER1) خاموش کنین و در انتهای تابع دوباره وقفه تایمر رو روشن کنین. اگه مشکل از وقفه تایمر باشه برنامتون درست میشه

          دیدگاه


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

            عجیبه!! فکنم اشتب گذاشم. من برنامه زیر برای تستش امتحان کردم که آیا میخونه یا نه. من نمیخوام وقفم غیر فعال کنم آخه زمانی که نیاز دارم خیلی دقیق باید باشه. اینجوری زمانم خراب میشه.
            کد:
            #include <16f72.h>
            
            #use delay (crystal=20Mhz)
            #fuses hs,NOWDT,BROWNOUT,PROTECT
            #define EEPROM_SDA PIN_C4
            #define EEPROM_SCL PIN_C3
            #define led pin_c5
            #use i2c(master,SDA=PIN_C4,SCL=PIN_C3)
            #include <2408.c>
            
            
            int8 tick;
            
             
             #int_timer2
             void timer2_isr() { 
             if(++tick>=50){
             tick=0;
             output_toggle(led);
             }
             }
             
              void main(){output_b(0b0);
              setup_timer_2 ( T2_DIV_BY_16,55,16);
              enable_interrupts(INT_timer2);
              enable_interrupts(GLOBAL);
              set_tris_b(0b00000101);
              set_tris_a(0b0000011);
              int16 i;
              int8 r3,r2,r1,byte1,byte2,byte3;
              int1 gg=0;
              
              while(true){
             
             for (i=0;i<1023;i+=2){
             i++;
             r3=read_ext_eeprom(i);
             r2=read_ext_eeprom(i+1);
             r1=read_ext_eeprom(i+2);
             if (byte3==r3&&byte2==r2&&byte1==r1){i=1024;gg=1;}}
             }}
            طب اسلامی

            دیدگاه


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


              قرار نیست غیر فعال کردن وقفه همیشه تو برنامه بمونه که!

              حالا شما بذار و برنامتون تست کن ببین مشکلت حل میشه یا نه

              دیدگاه


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

                بزارم صد در صد حل میشه عزیز. فقط وقتی از وقفه استفاده میکنم مشکل داره. آخه توی برنامه من همیشه از حافظه خارجی میخونه و اگر بخام وقفر غیر فعال کنم زمانم به هم میریزه
                طب اسلامی

                دیدگاه


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

                  سلام بر دوستان و اساتید
                  من الان 3 ساعت میشه که از AVR به PIC مهاجرت کردم... چقدر PIC عالیه تاپیکی درباره این موضوع کوچ کردن بود ولی دیدم آخربن ارسالش برای چند ماه پیشه احساس کردم اینجا بپرسم بهتره
                  من از صحبتهای دوستان به این نتیجه رسیدم که کامپایلر PIC C رو به خاطر نزدیک بودن به کد ویژن انتخاب کنم من این برنامه رو دانلود کردم ولی متوجه شدم هم تو کتابی که از روش میخونم و هم در هلپ برنامه اصلا به رجیستر ها به صورت مستقیم دسترسی نداره مثلا از تابع
                  output_high ..
                  برای 1 کردن رجیستر های خروجی استفاده کرده و برای 0 کردن از low و .... و اینا دستوراتی نبودن که از کتابخونه ای include بشن وبشه داخل تابعشون رو دید واسه خوده کامپایلر بودن :|
                  حالا سوال
                  نمیشه مثل کدویژن مستقیم بگیم PORTA = 0x01 ؟
                  همیچنین واسه بقیه رجیستر ها؟

                  head<=
                  ...تشکر خدا...
                  [img width=97 height=100]http://mahdi3d.persiangig.com/image/5280543_t.jpg[/img]

                  دیدگاه


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

                    سلام
                    چه کاری خوب ! همون AVR ادامه میدادید فقط با این کار دردسر برای خودتون خریدید برید جلوتر متوجه میشید .

                    اما سوال اصلی
                    اسم اصلی کامپایلر PIC C هست ؟ ( محصول Fored )

                    اگه همین اسم اصلیش FED PIC C
                    و باید 2 تا Include حتما صدا بزنید تا بتونید شروع به کار کنید
                    کد:
                    #include <pic.h>
                    #include <datalib.h>
                    
                    void main(void) {
                    PORTA=0x01;
                    TRIS=0x0;
                    }
                    به هر حال در ایران 2 تا کامپایلر جامعیت دارن CCS PIC , Mikro C
                    MPLAB C به طور محدود چون یکم ریزه کاری داره و .....

                    Mikro C خیلی کامپایلر قوی هست ولی رو کرک بعضی مواقع مشکل پیش میاره و همچنین هیچ کدوم از توابع کتابخانه ای شو نمی تونید ببینید ولی Help جامعی داره مخصوصا برای کار با کتابخانه های خودش .
                    CCS خیلی کامپایلر خوبی هست از نظر کتابخانه ای به کاملی Mikro نیست ولی یکی از مزایای خیلی خوبش باز بودن کتابخانه هاش هست ( البته الان نمی دونم ولی تا 2 سال پیش باز بودن )

                    تو این 2 تا ; PORTA=0x01 کار می کنه و پیشنهاد میدم اگه می خواید مشکلی پیش نیاد و سوالی می پرسید بتونن راه نمایتون کنن از CCS استفاده کنید
                    بقیه رجیستر ها هم قانونا باید هم اسم رجیستر داخل Datasheet باشن و تا حالا من خلافشو ندیدم اگه کار نمی کنه باید ببینید تو فایل هدر چه نامگزاری رو کرده البته شک دارم اسمشو عوض کرده باشه
                    موفق باشید .

                    دیدگاه


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

                      سلام ممنون که جواب دادید
                      احساس کردم خوبه یکم تو میکرو های مختلف تجربه داشته باشم بد نباشه چون میخواستم از PIC به dsPIC برسم چون امکانات خفنی داره (از xmega ها خوشم نیومد نتونستم باهاشون خوب رابطه برقرار کنم)

                      اشتباها اسم فایل اجرایی رو نوشتم باید میگفتم CCS شرمنده
                      برای این کامپایلر روشی سراغ دارید؟

                      head<=
                      ...تشکر خدا...
                      [img width=97 height=100]http://mahdi3d.persiangig.com/image/5280543_t.jpg[/img]

                      دیدگاه


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

                        روش برای چه کاری ؟ تغییر دادن پورت ؟
                        پورت رو که گفتم دستور ; PORTA=0x1 کار می کنه فقط باید TRIS تنظیم کنید (همون DDR تو AVR هستش ) تا اونجا که یادم تو CCS برای ست کردن یکی از 2 کار زیرو می تونید بکنید
                        کد:
                        set_tris_a(0);
                        porta=0x1;
                        
                        //یا 
                        
                        set_tris_a(0);
                        output_a(1);
                        هر 2 تا کد باید یک کارو انجام بده ولی تو CCS دستور دوم جا افتاده تر

                        همینو می خواستید دیگه ؟

                        دیدگاه


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

                          متاسفانه نمیشه مستقیم بهشون دسترسی داشت با سرچ هایی که کردم باید همچین چیزی بنویسم
                          کد:
                          #byte portb = 6
                          که 6 /ادرسه اون رجیستره و میکرو به میکرو فرق داره :(

                          فکر کنم MicroC بیشتر به گروه خونی م بخوره ممنون که معرفیش کردید

                          head<=
                          ...تشکر خدا...
                          [img width=97 height=100]http://mahdi3d.persiangig.com/image/5280543_t.jpg[/img]

                          دیدگاه


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

                            سلام دوستان.
                            یه چشمک زن نوشتم و جواب گرفتم ..
                            حالا این مشکل ، مساله ساز شده :
                            کد:
                            #include <16F877A.h>
                            #FUSES HS
                            #use delay(clock = 4000000)
                            #define LCD_ENABLE_PIN PIN_D1
                            #define LCD_RS_PIN PIN_D2
                            #define LCD_RW_PIN PIN_D3
                            #define LCD_DATA4 PIN_D4
                            #define LCD_DATA5 PIN_D5
                            #define LCD_DATA6 PIN_D6
                            #define LCD_DATA7 PIN_D7
                            
                            #include <lcd.c>
                            
                            void main()
                            {
                            lcd_init();
                            lcd_gotoxy(1,1);
                             while(true)
                             {
                              output_high(PIN_B7);
                              output_high(PIN_B0);
                              delay_ms(500);
                              output_low(PIN_B7);
                              output_low(PIN_B0);
                              delay_ms(500);
                             };
                            }
                            این برنامه ظاهرا تو پروتیوس کار میکنه ولی تو عمل نه ..
                            وقتی دستور lcd_init() اضافه میشه به کل کار نمیکنه .. حتی چشمک هم نمیزنه ..
                            تیم کاوش در مسابقات بین المللی ایران اپن 2016.نمایشی.مین یاب.
                            علم را باید در آزمایشگاه یاد گرفت نه در دانشگاه!

                            دیدگاه


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

                              سلام.
                              بعد از علامت آکولاد( { )مربوط به دستور while، سمیکولن رو پاک کنین احتیاطا.

                              این کد که برنامه ی شمارنده 0تا 60000 هست، از یه فایل آموزشی که آقای محمد ایجی درست کرده بودن کپی کردم.تست کنین ببینین نتیجه میگیرین یا نه؟

                              کد:
                              #include <16F877A.h>
                              #device adc=8
                              #FUSES NOWDT //No Watch Dog Timer
                              #FUSES XT //Crystal osc <= 4mhz
                              #FUSES NOPUT //No Power Up Timer
                              #FUSES NOPROTECT //Code not protected from reading
                              #FUSES NODEBUG //No Debug mode for ICD
                              #FUSES NOBROWNOUT //No brownout reset
                              #FUSES NOLVP //No low voltage prgming
                              #FUSES NOCPD //No EE protection
                              #FUSES NOWRT //Program memory not write protected
                              #use delay(clock=4000000,RESTART_WDT)
                              #include <LCD.C>
                              void main()
                              {
                              unsigned int16 i=0;
                              lcd_init();
                              delay_ms(10);
                              while(true)
                              {
                              lcd_gotoxy(1,1);
                              printf(lcd_putc,"\fTHIS IS COUNTER");
                              for(i=0;i<=60000;i++)
                              {
                              lcd_gotoxy(1,2);
                              printf(lcd_putc,"%lu",i);
                              delay_ms(90);
                              }
                              delay_ms(130);
                              }
                              }

                              دیدگاه


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

                                سلام کسی روی rom سری 24 نوشته این سری eeprom نداره مجبوریم از rom استفاده کنیم ولی من نتونستم تا الان کاری کنم مطمئنم میشه چون حافظه اینا فلش میشه روش نوشت
                                فهبنی صبرت علی عذابک فکیف اصبرعلی فراقک
                                گیرم که برعذاب توصبر کنم ،چگونه بر جدایی ات شکیبایی ورزم

                                دیدگاه

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