اطلاعیه

Collapse
No announcement yet.

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

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

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

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

    دیدگاه


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

      سلام

      void memory_W(int16 ADDRES ,int16 dat)
      {
      WRITE_EXT_EEPROM(ADDRES,hi(dat));
      ADDRES++;
      WRITE_EXT_EEPROM(ADDRES,(BYTE)dat);
      }

      من یه تابع پیدا کردم که dataهای 16 بیتی رو از طریق Spi سخت افزاری میکرو ارسال میکنه اما قبلش ظاهرا و قاعدتا Data رو دو تا 8بیتی میکنه !
      با توجه به این تابع و اینکه
      #define hi(x) (*((int8 *)&x+1))
      و اینکه شما قبلا گفته بودید
      نوشته اصلی توسط محمد ایجی
      یعنی 8بیت اول رو جدا و ارسال میکنه و 8 بیت دوم دور ریخته می شود .
      الان گیج شدم (BYTE)dat چه بلایی سر data میاره !!!
      زمان تنها واحد حقیقی اندازه گیریه
      زمان وجود ماده رو اثبات میکنه
      بدون زمان هیچکدوم ما وجود نخواهیم داشت
      زمان یکتاست

      دیدگاه


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

        خیلی راحته . ببین این تابع میاد یک آدرس میگیره و یک مقدار 16 بیتی که باید در اون آدرس نوشته بشه
        چون spi دیتای 8 بیتی فقط میتونه ارسال کنه پس مجبوریم که دیتای 16 بیتی رو به 2تا دیتای 8 بیتی تقسیم کنیم و ارسال کنیم . خط دوم میاد با استفاده از اون ماکرو 8بیت باارزش متغیر Dat رو جدا میکنه (یعنی بیت های شماره 8 تا 15) و در همون آدرس مینویسه . در خط بعد آدرس خونه بعدی حافظه انتخاب میشود و در نهایت نیز در خط چهارم 8بیت پایینی (بیت های 0 تا 7) ارسال میشوند

        دیدگاه


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

          سلام
          میشه بگید دستور( output_float (pin دقیقا چیکار میکنه ؟ تو Help گفته پین مورد نظر رو ورودی می کنه !!!
          پسس با ُSet_Tris_X چه فرقی داره ؟
          ممنون

          زمان تنها واحد حقیقی اندازه گیریه
          زمان وجود ماده رو اثبات میکنه
          بدون زمان هیچکدوم ما وجود نخواهیم داشت
          زمان یکتاست

          دیدگاه


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

            دستور output_float پین مورد نظر را در حالت امپدانس بالا (HI-Z) قرار میدهد(مثل این هستش که اون پایه به هیچ کجا وصل نیست) و فقط برروی پین هایی کار میکنه که توسط دستور set_tris به عنوان خروجی تعیین شده باشند.

            دیدگاه


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

              سلام
              تابع ( shift_left(address,byte,value چیکار میکنه ؟
              میشه تو مثال زیر توضیح بدید ؟


              BYTE cmd[2];
              cmd[0]=0xc0;
              cmd[1]=0x4;

              for(i=1;i<=12;++i) {
              output_bit(PIN_B5, shift_left(cmd,2,0) );
              }

              ممنون
              زمان تنها واحد حقیقی اندازه گیریه
              زمان وجود ماده رو اثبات میکنه
              بدون زمان هیچکدوم ما وجود نخواهیم داشت
              زمان یکتاست

              دیدگاه


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

                دستور های shift_left و shift_right مقدار بیت ها را در یک آرایه جا به جا می کنند . به جای پارامتر address نام یک آرایه می بایست قرار بگیرد و برای پارامتر byte نیز باید تعداد المان هایی از آرایه که میخواهیم فرآیند شیفت بر روی آن ها انجام گیر ، مشخص گردند و در نهایت به جای پارامتر value باید یا 0 بگذارید یا 1 که این مقدار به جای بیت های جدید اضافه شده به آرایه تحت تاثیر فرآیند شیفت ، قرار خواهد گرفت . این دستورات همچنین یک مقدار 0 یا 1 را به عنوان نتیجه بر میگردانند که عبارت است از آخرین بیت شیفت داده شده که در واقع از محدوده byte خارج شده است .
                در همان مثال شما : ابتدا یک آرایه با نام cmd با تعداد المان 2 تعریف شده است که بر هرکدام از المان ها (یا درایه ها) یک مقدار اولیه نسبت داده شده است . و عمل شیفت به سمت چپ بر روی هر دوی این درایه ها انجام میگیرد (به تعداد دفعات 12 بار) و هر بار اخرین بیت شیفت داده شده (یعنی بیت شماره 7 از درایه cmd[1] ) بر روی پین B5 به نمایش در خواهد آمد . [یه توصیه : همین برنامه رو در پروتئوس اجرا کنید و نتیجه را مشاهده فرمایید ]

                دیدگاه


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

                  کار این دستور تو css چیه؟ :nerd:
                  #int_timer0
                  مواظب افكارت باش كه گفتارت مي شود
                  مواظب گفتارت باش كه رفتارت مي شود
                  مواظب رفتارت باش كه عادتت مي شود
                  مواظب عادتت باش كه شخصيتت مي شود
                  مواظب شخصيتت باش كه سر نوشتت مي شود

                  دیدگاه


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

                    نوشته اصلی توسط omidi2008
                    کار این دستور تو css چیه؟ :nerd:
                    #int_timer0
                    این دستور به عنوان پیش معرفی کننده سرویس وقفه تایمر0 می باشد . تابعی که بعد از این خط نوشته می شود ، در زمان بروز وقفه تایمر0 اجرا خواهد شد .

                    دیدگاه


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

                      سلام
                      من تو برنامم با مشکل کمبود فضای ROM روبه رو شدم :angry: همه متغیر هام رو هم به صورت int1وint8و . . استفاده کردم همچنین توی مقداری که تابع هام میخوان بگیرن و برگردونن اما باز :angry:
                      کسی راه حلی یا اصولی برای برنامه نویسی بهینه و کم حجم داره ؟
                      تو برنامم از کتابخانه 2402 خود CCS استفاده کردم . Wizard خود CCS دستور setup_spi(SPI_SS_DISABLED) رو تو main اضافه کرد ! وجود این دستور با توجه به اینکه من از SPI هم نمیخوام استفاده کنم ضروریه ؟ آخه وقتی این دستور رو حذف می کنم ROM اندازه ی 1% خالی میشه !
                      پر بودنROM اونم (100%) احتمال هنگ کردن رو بالا نمیبره ؟(ببخشید اگه سئوالم مسخرس :biggrin:یهو زد به کلم آخه)
                      زمان تنها واحد حقیقی اندازه گیریه
                      زمان وجود ماده رو اثبات میکنه
                      بدون زمان هیچکدوم ما وجود نخواهیم داشت
                      زمان یکتاست

                      دیدگاه


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


                        سلام :smile:

                        با اجازتون منم چند تا سوال پیش پا افتاده در مورد کامپایلر ccs دارم ممنون میشم اگه راهنماییم کنین

                        سوال اول من اینه که اینجوری که من (با توجه به سواد و تجربه کمم) متوجه شدم در ccs بر خلاف codevision فیوز بیتهای میکرو از داخل کامپایلر config میشه یعنی تنظیم فیوز بیتها قسمتی از کد برنامه مون هستش نمیدونم درست میگم یا نه؟

                        2- در ارتباط سریال کدوم بیت نشون میده که داده جدید دریافت شده و کدوم بیت نشون میده ارسال انجام شده؟ (بدون استفاده از وقفه)

                        3- وقتی تو حالت سریال از وقفه استفاده میکنیم آیا مثل codevision خودش برامون یه بافر دریافت درست میکنه یا خودمون باید کدش رو تو روتین وقفه سریال بنویسیم؟

                        امیدوارم سوالام گنگ نباشه oo:

                        دیدگاه


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

                          سلام
                          1- مگه در کدویژن شما فیوزبیت ها را در کجا تنظیم میکنید؟؟ فیوز بیت ها را می توانید از بخش general از پنجره PIC Wizard به سادگی تنطیم کنید
                          2- با استفاده از دستور kbhit(); می توانید از ورود کاراکتر جدید مطلع شوید . همچنین وقفه INT_RDA# مربوط به ورودی دیتا و همچنین وقفه INT_TBE# مربوط به اتمام فرآیند ارسال دیتا می باشد
                          3- چنین چیزی به صورت نرم افزاری ایجاد نمی شود . چون خود میکروکنترلر های pic به صورت سخت افزاری دارای یک بافر ورودی (1 بایتی) می باشند

                          دیدگاه


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

                            با تشکر از جوابتون :read:
                            بازم چند تا سوال: :redface:
                            1- تو ccs چطوری میشه به رجیسترهای میکرو دسترسی پیدا کرد مثلا رجیسترهای تایمر (خوندن و نوشتن)؟
                            2- هنگام استفاده از وقفه خارجی چطور میتونیم لبه بالا رونده یا پایین رونده رو تعیین کنیم چیپ مورد استفاده من 16F877 هستش ولی تو wizard چیزی برا تعیین لبه وقفه خارجی پیدا نکردم
                            3- تو پیکربندی درگاه سریال: (use rs232(baud=9600, xmit=PIN_B2, rcv=PIN_B1, stream=PC)
                            stream چیه و چه مقادیری قبول میکنه
                            4- امیدوارم به این سوالم نخندین ولی این ccs چه جور کامپایلر c هستش که حروف کوچک و بزرگ براش فرق نداره!؟ oo:

                            دیدگاه


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

                              درود
                              1- برای اکثر رجیستر ها که خوب دستورات بخصوصی وجود داره . مثلا برای رجیستر تایمر 1 دستور get_timer1(); وجود داره . یا برای تایمر 2 نیز دستور get_timer2(); و ...
                              ولی اگر احیانا خواسته باشید به رجیستری دسترسی پیدا کنید که برای آن دستور خاصی تعریف نشده باشد می توانید از دستورات پیش پردازنده byte# و bit# برای تعریف یک نام (alias) برای آدرس رجیستر هاتون استفاده کنید . مثلا دستور زیر عبارت RB رو به آدرس 06h (که آدرس رجیستر پورتb می باشد) اختصاص می دهد .
                              کد:
                              #byte RB=0x06
                              و از این خط به بعد شما خیلی راحت می توانید با مقدار دهی به مقدار RB ، محتویات پورتb را دستکاری کنید . (به راحتی یک متغیر) . مثلا :
                              [tt]RB=0xFF;[/tt]
                              دستور فوق مقدار 0xff رو در رجیستر پورتb قرار می دهد .
                              لازم به ذکر است که شما میتوانید به سادگی هرچه تمام تر آدرس تمام رجیستر ها را در یک فایل هدر بدست بیارید!(که به فایل SFR معروف می باشد) به این منظور به مسیر زیر بروید :
                              از منو tools گزینه Device selector را انتخاب کنید . در پنجره باز شده به بخش registers بروید و در قسمت سمت چپ مدل میکروکنترلر خود را انتخاب کنید سپس گزینه make include file رو بزنید . در قسمت جدید باز شده ، ابتدا آدرس ذخیره شدن فایل هدر را مشخص کنید و سپس حتما هر دوقسمت مربوط به byte prefix و bit prefix را پاک کنید . حال بر روی generate کلیک کنید...


                              2- برای تعیین لبه پالس مورد نظر برای بروز وقفه می توانید از دستور EXT_INT_EDGE() استفاده کنید که دو عبارت را می توانید در آن قرار دهید :
                              الف : L_TO_H که برای تعیین لبه بالارونده
                              ب : H_TO_L برای تعیین لبه پایین رونده

                              3- عبارت stream در پیکربندی پورت سریال یک بخش اختیاری است و برای ایجاد وجه تمایز بین پیکربنید های متفاوت می باشد . به طور مثال شما میخواهید که دو نوع ارتباط سریال متفاوت در پروژه خود داشته باشید .یکی بر روی پین های ra1 , ra0 و دیگری بر روی پین های rb5,rb4 . در برنامه نویسی ccs شما باید به نوعی بین این دو کانکشن تفاوت ایجاد کنید تا برای استفاده از دستورات getc و putc و.. به مشکلی بر نخورید . این تفاوت توسط عبارت stream تعیین می شود :
                              کد:
                              #use rs232(baud=9600, xmit=PIN_A0,rcv=PIN_A1,stream=uart1)
                              #use rs232(baud=9600, xmit=PIN_B4,rcv=PIN_B5,stream=uart2)
                              حال اگر خواسته باشم که توسط کانکشن uart1 یک کاراکتر را ارسال کنم به این شکل عمل میکنم :
                              کد:
                              fputc(44,uart1);
                              (دستور فوق مقدار عددی 44 را توسط ارتباط سریال پین های ra1,ra0 ارسال میکند .)
                              و برای دریافت از کانکشن uart2 نیز به این شکل مینویسم :
                              کد:
                              k=fgetc(uart2);
                              4- دوست گرامی در این انجمن هیچ کسی حق خندیدن به دیگری برای سوال کردن ندارد!! شما آزادید که سوال های خود را در هر سطحی که باشد بپرسید.
                              کامپایلر ccs به طورت پیش فرض case sensitive نیست ولی با نوشتن دستور پیش پردازنده case# می توانید ان را Case sensitive کنید

                              دیدگاه


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

                                سلام
                                من میخوام Watch Dog Timer یه PIC16F883 رو فعال کنم اما تو قسمت Setup اون علاوه بر زمان مورد نظر یه مقدار دیگه هم میگیره .


                                setup_wdt(WDT_18MS|???);

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


                                WDT_ON
                                WDT_OFF
                                WDT_DIV_16
                                WDT_DIV_8
                                WDT_DIV_4
                                WDT_DIV_2
                                WDT_TIMES_1
                                WDT_TIMES_2
                                WDT_TIMES_4
                                WDT_TIMES_8
                                WDT_TIMES_16
                                WDT_TIMES_32
                                WDT_TIMES_64
                                WDT_TIMES_128

                                این مقادیر چیه؟

                                اضافه شده در تاریخ :
                                نوشته اصلی توسط Robo-amir
                                سلام
                                من تو برنامم با مشکل کمبود فضای ROM روبه رو شدم :angry: همه متغیر هام رو هم به صورت int1وint8و . . استفاده کردم همچنین توی مقداری که تابع هام میخوان بگیرن و برگردونن اما باز :angry:
                                کسی راه حلی یا اصولی برای برنامه نویسی بهینه و کم حجم داره ؟
                                تو برنامم از کتابخانه 2402 خود CCS استفاده کردم . Wizard خود CCS دستور setup_spi(SPI_SS_DISABLED) رو تو main اضافه کرد ! وجود این دستور با توجه به اینکه من از SPI هم نمیخوام استفاده کنم ضروریه ؟ آخه وقتی این دستور رو حذف می کنم ROM اندازه ی 1% خالی میشه !
                                پر بودنROM اونم (100%) احتمال هنگ کردن رو بالا نمیبره ؟(ببخشید اگه سئوالم مسخرس :biggrin:یهو زد به کلم آخه)
                                سئوالم خیلی پیش پا افتادست یا کسی دوست نداره جواب بده !
                                زمان تنها واحد حقیقی اندازه گیریه
                                زمان وجود ماده رو اثبات میکنه
                                بدون زمان هیچکدوم ما وجود نخواهیم داشت
                                زمان یکتاست

                                دیدگاه

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