اطلاعیه

Collapse
No announcement yet.

آموزش زبان سی

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

    پاسخ : آموزش زبان سی

    وقتی بجای
    کد:
    DDRB|=(1<<4) | (1<<5);
    مثلآ
    کد:
    DDRB=0xff;
    این کد رو میزارم موج Spwm روی OCR1a دارم.

    اگر شاد بودی آرام بخند تا غم بیدار نشود

    دیدگاه


      پاسخ : آموزش زبان سی

      راستی این سوالتون رو داخل تاپیک ساخت اینورتر سه فاز... دیدم، مناسب تر دیدم این جا جواب بدم.
      سوال:



      از دوستانی هم که C کار میکنن خواهش میکنم در مورد دستورات کمی راهنمایی کنن مثلآ
      کد:
      TCCR3B&=~(1<<CS00)
      CS00 یک شده بعد نات شده بعد با TCCR3B اند شده و در نهایت در TCCR3B قرار گرفته
      معنی این عبارت چیه؟آیا هدف صفر کردنCS30 بوده.
      TCCR1B=(1<<CS00)
      در اینجا همCS00 جز بیتهای TCCR1B نیست
      در برنامه هایی که بررسی کردم معمولآ رجیسترها عدد نویسی میشن
      ممنون
      اول اینو توضیح میدم:
      TCCR3B&=~(1<<CS00);

      این هم دقیقا مشابه همون نکته ایه که چندپست بالاتر مطرح کردم اما اینجا در مورد پورت هستش.
      ممکن هست قبلا بیت های دیگری از پورت مقدار دهی شده باشن و ما نباید اونارو دستکاری کنیم، برای این کار میاییم و از شیوه بالا استفاده می کنیم.
      توضیح:
      اول این که اون CS00 یک تعریف هست که برنامه نویس احتمالا اول کدش حدس میزنم اینطوری تعریف کرده باشدش:
      کد:
      [ltr]
      # define CS00   0
      [/ltr]
      نمیدونم شما چقدر با این مارکو-دیفاین- آشنایی دارید، اما به طور مختصر کارش یه جور تعریفه، زین پس داخل برنامه به جای این که بنویسیم 0 می نویسیم CS00 دقیقا معادل هم میشن، یه جور ساده سازی
      فکر میکنم معادل بسکامش اینه:
      CS00 Alias 0

      پس ااین کد:
      TCCR3B&=~(1<<CS00);
      میشه:
      کد:
      [ltr]
      TCCR3B&=~(1<<0);
      [/ltr]
      خب اینو حالا راحت میشه تحلیل کرد، TCCR3B هم که رجیستر مربوط به ذخیره اطلاعات تایمر کانتر 3 هستش(مگا64و... تایمر شماره 3 دارند، مثلا مگا32 نداره!)
      نکته ارزشمند این کد اینه که:
      فقط بیت شماره صفر TCCR3B رو صفر میکنه و به الباقی بیت ها کاری نداره(خب طبیعتا این خیلی مهمه که ما بقیه بیت ها رو نا به جا مقدار دهی نکنیم)
      آهان، دقیقا همین که خودتون فرمودید:
      معنی این عبارت چیه؟آیا هدف صفر کردنCS30 بوده.
      اما با در نظر گرفته نکته بالا
      (شما خودتون ماشاالله استادید، من این نکات رو عمومی عرض میکنم و هدفم اینه که برای بقیه بچه ها که بعدا مراجعه می کنند بلکه مفید باشه)
      اونچیزی که در دانشگاه یاد میگیرید، "الفبایی" هست برای نوشتن یک "رمان" !!

      دیدگاه


        پاسخ : آموزش زبان سی

        بله ممنون تعریف ماکرو رو چند روز پیش تمرین کردم
        البته CS00 بیت صفر TCCR0 هست با توضیحاتتون کاملآ متوجه شدم ممنون.
        در اینجا با یک تیر دو نشون رو زده هم CS00 مقدار دهی کرده وهم بیت صفر
        TCCR3B رو.
        درسته؟

        اگر شاد بودی آرام بخند تا غم بیدار نشود

        دیدگاه


          پاسخ : آموزش زبان سی

          نوشته اصلی توسط Ghasede del
          وقتی بجای
          کد:
          DDRB|=(1<<4) | (1<<5);
          مثلآ
          کد:
          DDRB=0xff;
          این کد رو میزارم موج Spwm روی OCR1a دارم.
          شما دارید از تایمر 1 در مد PWM استفاده می کنید که خروجی OC1A اون روی پایه D.5 میفته، بنابراین نیازی به تعیین جهت پورت B نیست، اما من متوجه نمیشم چرا وقتی پورت B رو دستکاری می کنید جواب نمی گیرید؟! (من باب امتحان اینبار B.3 رو هم خروجی کنید-مثلا DDRB|=(1<<3) |(1<<4) | (1<<5); ببینید چه جوابی میگیرید!؟ نکته خاصی نداره، فقط کنجکاوی خودمه!!)
          اونچیزی که در دانشگاه یاد میگیرید، "الفبایی" هست برای نوشتن یک "رمان" !!

          دیدگاه


            پاسخ : آموزش زبان سی

            نوشته اصلی توسط Ghasede del
            بله ممنون تعریف ماکرو رو چند روز پیش تمرین کردم
            البته CS00 بیت صفر TCCR0 هست با توضیحاتتون کاملآ متوجه شدم ممنون.
            در اینجا با یک تیر دو نشون رو زده هم CS00 مقدار دهی کرده وهم بیت صفر
            TCCR3B رو.
            درسته؟
            در واقع نه!
            فقط CS30 رو صفر کرده، ببینید در واقه در کدویژن CS00 تعریف نشده است(یعنی اگر شما بنویسی CD00 =1 ارور میده و اصلا اون رو نمیشناسه)
            کاربر برای راحتی کار میاد و اونو دیفاین میکنه، و چون کمی هم راحت طلب بوده احتمالا :mrgreen: دیگه CS30 تعریف نکرده و از همون CS00 استفاده کرده که در دیفاین برابر(احتمالا) صفر گذاشتش:agree:
            اونچیزی که در دانشگاه یاد میگیرید، "الفبایی" هست برای نوشتن یک "رمان" !!

            دیدگاه


              پاسخ : آموزش زبان سی

              بابا ، چه سرعت عملی (Wowza!!!!!!)
              یه دو ساعت نبودیما!

              ببخشید ، امدم فقط یه چیز بگم، میون عرایضتون؛

              اول یه چیزی آقا این هیچ مشکلی نداره :

              کد:
              DDRB|=(1<<DDB0)|(1<<DDB2)|(1<<DDB3);


              احتمالا شما تیک مربوط به کار به صورت بیتی بر روی رجیستر ها که در ادامه گفتم نزدید !مصداق درست کامپایل شدندش هم ، کد اسمبلی خروجی کامپایلر هست ، ببنید :


              کد:
              ; 0000 006C DDRB|=(1<<DDB0)|(1<<DDB2)|(1<<DDB3);
              	IN  R30,0x17
              	ORI R30,LOW(0xD)
              	OUT 0x17,R30


              آقا این ماکرو ها که بهشون اشاره کردید داخل یه فایل هدر تعریف شدند و بهتره که از همون ها استفاده کنید تا طبق روال باشه .
              این تعاریف داخل کدویژن داخل یه فایل هدر هستند مثلا برای مگا128 توی فایل mega128_bits.h نوشته شدند (میتونید تغییرشون بدید ولی بنظرم اینکار رو نکنید بهتره!)
              حالا این فایل هدره با تیک زدن گزینه Include I/O Registers Bits Definitions تو بخش تنظیمات نرم افزار اینکلود میشه و موقع کامپایل برنامه هر جا که این ماکروها نوشته شده باشن معادل عددیشون جایگزین میشه.
              محتوای فایل ، ماکروهای مربوط به اسم رجیستر ها و بیت هاشون مشابه با اونچه داخل دیتاشیت نوشته شده هست.

              یه فایل هدر دیگه هم هست که توش چند تا ماکرو برای کار به صورت بیتی با رجیستر ها داخلش نوشته شده پیشنهاد میکنم ماکرو های اون رو هم یه نگاهی بندازید ، فایل هدر iobits.h .


              در انتها پیشنهاد میکنم، یه نیم نگاهی هم به این تاپیک بندازید :
              http://www.eca.ir/forum2/index.php?topic=53745.0

              دیدگاه


                پاسخ : آموزش زبان سی

                این کد جواب میده.
                DDRD|=(1<<4) | (1<<5)|(1<<3);
                احتمالا شما تیک مربوط به کار به صورت بیتی بر روی رجیستر ها که در ادامه گفتم نزدید !مصداق درست کامپایل شدندش هم ، کد اسمبلی خروجی کامپایلر هست
                حق با شماست حالا این تیک کجاست :biggrin:
                ممنونم



                اگر شاد بودی آرام بخند تا غم بیدار نشود

                دیدگاه


                  پاسخ : آموزش زبان سی

                  در انتها پیشنهاد میکنم، یه نیم نگاهی هم به این تاپیک بندازید :
                  http://www.eca.ir/forum2/index.php?topic=53745.0
                  به pdf تبدیلش کردم در اولین فرصت مطالعه میکنم
                  ممنون.

                  اگر شاد بودی آرام بخند تا غم بیدار نشود

                  دیدگاه


                    پاسخ : آموزش زبان سی

                    اینجا :

                    دیدگاه


                      پاسخ : آموزش زبان سی

                      خیلی ممنون ممنون ممنون :applause:
                      لذت بردم عالی بود :applause:

                      اگر شاد بودی آرام بخند تا غم بیدار نشود

                      دیدگاه


                        پاسخ : آموزش زبان سی

                        سلام دوستان
                        میخواستم در مورد عملگر (~) کمی توضیح بدید یک برنامه در بورلند اجرا
                        کردم تا کار کرد این عملگر رو ببینم وقتی عدد 25 رو بهش میدم 230
                        برمی گردونه کاکردش چگونس.

                        #include <conio.h>
                        #include<stdio.h>
                        unsigned char sine1;
                        unsigned char sine;
                        int average;
                        int main()
                        {
                        scanf("%d",&sine);
                        sine1=~sine;
                        printf("sine1=""%d.",sine1);
                        getch();
                        return 0;
                        }

                        اگر شاد بودی آرام بخند تا غم بیدار نشود

                        دیدگاه


                          پاسخ : آموزش زبان سی

                          نوشته اصلی توسط Ghasede del
                          سلام دوستان
                          میخواستم در مورد عملگر (~) کمی توضیح بدید یک برنامه در بورلند اجرا
                          کردم تا کار کرد این عملگر رو ببینم وقتی عدد 25 رو بهش میدم 230
                          برمی گردونه کاکردش چگونس.

                          #include <conio.h>
                          #include<stdio.h>
                          unsigned char sine1;
                          unsigned char sine;
                          int average;
                          int main()
                          {
                          scanf("%d",&sine);
                          sine1=~sine;
                          printf("sine1=""%d.",sine1);
                          getch();
                          return 0;
                          }
                          این عملگر NOT بیتی هستش، یعنی هرچی صفر رو یک می کنه و هرچی یک رو صفر، یا به عبارت دیگه عدد داده شده رو منهای 255 میکنه(255=0b11111111)
                          25=0b00011001
                          230=0b11100110
                          اونچیزی که در دانشگاه یاد میگیرید، "الفبایی" هست برای نوشتن یک "رمان" !!

                          دیدگاه


                            پاسخ : آموزش زبان سی

                            این عملگر NOT بیتی هستش، یعنی هرچی صفر رو یک می کنه و هرچی یک رو صفر، یا به عبارت دیگه عدد داده شده رو منهای 255 میکنه(255=0b11111111)
                            25=0b00011001
                            230=0b11100110
                            سلام دست شما درد نکنه
                            تو این یکی دو هفته خیلی به خودم فشار اوردم تا C یاد بگیرم بعضی نکات رو نمی بینممن با ماشین حساب عدد 25 رو
                            به باینری تبدیل میکردم و در این حالت پنج بیت رو بیشتر نداشتم بعد رو کاغذ نات میکردم باز با ماشین حساب به دسیمال
                            تبدیل میکردم واقعآ گیجم کرده بود از راهنمایتون ممنونم. :smile:

                            اگر شاد بودی آرام بخند تا غم بیدار نشود

                            دیدگاه


                              پاسخ : آموزش زبان سی

                              نوشته اصلی توسط Ghasede del
                              سلام دست شما درد نکنه
                              تو این یکی دو هفته خیلی به خودم فشار اوردم تا C یاد بگیرم بعضی نکات رو نمی بینممن با ماشین حساب عدد 25 رو
                              به باینری تبدیل میکردم و در این حالت پنج بیت رو بیشتر نداشتم بعد رو کاغذ نات میکردم باز با ماشین حساب به دسیمال
                              تبدیل میکردم واقعآ گیجم کرده بود از راهنمایتون ممنونم. :smile:
                              دوست عزیز شما اگه یه مقدار بیشتر در مورد مساله فکر می کردید حتماً به جواب می رسیدید. البته نمی خوام بگم که اینجا مطرح نمی کردید. اما آخه با 5 بیت چطور میشه عدد 230 رو تولید کرد؟؟؟؟
                              دانش فنی تا به عمل تبدیل نشده، ذره ای ارزش نداره. اما بعضی وقت ها باید از دانش برای باز کردن مرزهای جدیدی در علم استفاده کرد، نه اینکه اونها رو صرفاً فقط به عمل تبدیل کرد.

                              دیدگاه


                                پاسخ : آموزش زبان سی

                                نوشته اصلی توسط حامد پور آزاد
                                دوست عزیز شما اگه یه مقدار بیشتر در مورد مساله فکر می کردید حتماً به جواب می رسیدید. البته نمی خوام بگم که اینجا مطرح نمی کردید. اما آخه با 5 بیت چطور میشه عدد 230 رو تولید کرد؟؟؟؟
                                .
                                البته این دوستمون حق دارن
                                ماشین حساب ویندوز 5بیت نشون میده، بعد اگه حواست نباشه قاطی می کنی
                                البته گاهی پیش میاد که آدمی جواب جلوی چشمشه نگاه می کنش، اما نمی بینتدش-متوجهش نمی شه، برای خودم زیاد پیش اومده و معمولا اوقاتی بوده که روی چیزی زیاد وقت میذاشتم و تمرکز می کردم oo:
                                اونچیزی که در دانشگاه یاد میگیرید، "الفبایی" هست برای نوشتن یک "رمان" !!

                                دیدگاه

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