اطلاعیه

Collapse
No announcement yet.

آموزش winavr و avrlib

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

    پاسخ : آموزش winavr و avrlib

    در ضمن ، راه نداره تصویر اینا نشون بدیم ؟
    چیزی واسه کار کردن نداره ! یدونه مربع ، یدونه دایره !
    کتابخونه ای ، چیزی واسش نیست ؟

    دیدگاه


      پاسخ : آموزش winavr و avrlib

      شاید مشکل جریان دهی روی پورت C داره. ضمنا اگه مشکل رسم اشکال اولیه مثل خط و دایره هست که میتونین از روالهای Bresenham استفاده کنین.

      دیدگاه


        پاسخ : آموزش winavr و avrlib

        نه آقا رضا ! مشکل سخت افزاری نبود !
        وقتی روی پورت c تنظیم می کردم ، موقع کامپایل خطا میداد ! به هتسه های کنترل کننده ال سی دی
        چون توش 4 تا هسته معرفی کرده بود ، شماره چهارمی به پورت 7 میکرو باید وصل بشه ، ولی اتمگا 8 پورت c پین 7 نداره ! امکان داره واسه اون خطا میداد ؟
        این روال Bresenham میشه یه توضیح بدین ؟ من چیزی نفهمیدم !
        خط و دایره و میکشم ، می خوام یک تصویر رو نشون بدم !
        کتابخونه دیگه ای برای این lcd هست که کاملتر باشه ؟
        ممنون

        دیدگاه


          پاسخ : آموزش winavr و avrlib

          سلام.
          تعطیلات بین دو ترم شروع شده و گفتم بیکار نشینم و برم winavr کار کنم.
          معادل دستور IF PINB.1=0 تو WINAVR چی هست؟؟
          کلا چطور میتونم تغییرات یک بیت رو کنترل کنم.
          سوال بعدی:
          کتابخونه های winavr رو از کجا دانلود کنم؟؟ غیر از avrlib
          مثلا برای lcd 4bit از کجا میتونم دانلود کنم؟؟

          دیدگاه


            پاسخ : آموزش winavr و avrlib

            فرم کار کردن با بیت ها رو بایستی با عملیات بیتی انجام بدین. به عنوان نمونه میشه از ماکروهای زیر کمک گرفت:


            #ifndef BV
            #define BV(n) (1<<(n))
            #endif

            #define IsBitSet(port,n) ((port) & BV(n))
            #define IsBitNotReset(port,n) (!IsBitSet(port,bit))
            #define SetBit(port,n) (port) |= BV(n)
            #define ClearBit(port,n) (port) &= ~BV(n)
            #define InvertBit(port,n) (port) ^= BV(n)
            #define SetBits(port,mask) (port) |= (mask)
            #define ClearBits(port,mask) (port) &=~(mask)
            #define InvertBits(port,mask) (port) ^= (mask)
            #define CheckBits(port,mask,value) (((port) & (mask)) == (value))


            اگر مشکل فقط lcd چهار بیتی هست که این خودش جزئی از avrlib هستش. فقط بایستی در هدر های مربوطه مشخص کنین که میخوایین چهار بیتی کار کنین و سورس رو مجددا کامپایل کنین.

            دیدگاه


              پاسخ : آموزش winavr و avrlib

              نوشته اصلی توسط reza_agha
              فرم کار کردن با بیت ها رو بایستی با عملیات بیتی انجام بدین. به عنوان نمونه میشه از ماکروهای زیر کمک گرفت:


              #ifndef BV
              #define BV(n) (1<<(n))
              #endif

              #define IsBitSet(port,n) ((port) & BV(n))
              #define IsBitNotReset(port,n) (!IsBitSet(port,bit))
              #define SetBit(port,n) (port) |= BV(n)
              #define ClearBit(port,n) (port) &= ~BV(n)
              #define InvertBit(port,n) (port) ^= BV(n)
              #define SetBits(port,mask) (port) |= (mask)
              #define ClearBits(port,mask) (port) &=~(mask)
              #define InvertBits(port,mask) (port) ^= (mask)
              #define CheckBits(port,mask,value) (((port) & (mask)) == (value))


              اگر مشکل فقط lcd چهار بیتی هست که این خودش جزئی از avrlib هستش. فقط بایستی در هدر های مربوطه مشخص کنین که میخوایین چهار بیتی کار کنین و سورس رو مجددا کامپایل کنین.
              سلام.
              اگه میشه یه توضیحی در مورد این کدها بدید من از بیسکام اومدم به سمت winavr !!!
              در ضمن منظورم کتابخونه های دیگه هست غیر از avrlib .

              دیدگاه


                پاسخ : آموزش winavr و avrlib

                این کد ها رو من همینجوری و ابتدا به ساکن نوشتم. چیز مهمی هم نیست. در C اونطوری که در کد ویژن ممکنه ببینید چیزهایی مثل PORTC.0 وجود خارجی نداره. باید با عملیات بیتی کار بشه. یعنی اگه خواستین این دستور رو بنویسین:

                PORTA.0 = 1

                باید معادلش رو بنویسین:

                PORTA |= BV(0)

                یعنی بیت شماره صفر رو در محتوای فعلی PORTA ست کن.
                BV یک عدد معادل با عددی که تمام بیتهایش بجز بیت مشخص شده صفر باشه برمیگردونه.

                بقیه موارد هم همینطوره. برای ست و ریست و مکمل کردن یک بیت یا چند بیت.
                اینا رو در هدر فایل پروژه تون قرار بدین و هر جا خواستین include کنین. البته در پستهای قبلی همین تاپیک هم دوستان با استفاده از bit field کار های دیگه ای هم کردن که بد نیست یک نگاهی به اونها هم بندازین شاید چون با C کار نکردین اونا براتون راحتتر باشن.

                دیدگاه


                  پاسخ : آموزش winavr و avrlib

                  سلام.
                  من امروز مثالهای winavr رو نگاه میکردم با دستورات زیر تونستم یک بیت رو بخونم اما نمیدونم چطوری کار میکنه!!!
                  کد:
                  x=~PINB
                   if (x=~1){
                  }
                  در این دستور اگر پورت B.0 صفر بشه شرط رو انجام میده.
                  راستی تو دستوری که شما گفتین اگر جلوی BV بزارم 1 بیت شماره1 رو ست میکنه؟؟
                  حالا برای ریست چی؟؟
                  کتابخونه برای کار با این بیتها وجود داره؟؟

                  دیدگاه


                    پاسخ : آموزش winavr و avrlib

                    جسارتا مجبورم مقداری توضیح واضحات بدم.
                    هر بایت از هشت بیت تشکیل شده. شما نمیتونین بدون دسترسی به کل یک بایت از محتوای یک بیت اطلاعی حاصل کنین یا مقدار اونو تغییر بدین. بنابراین وقتی میخواییم یک بیت رو از کل یک بایت مورد سنجش قرار بدیم بایستی شرایطی رو فراهم کنیم که بشه فقط با اون بیت کار کرد. یکی از راههای موجود اینه که مقدار اون بایت رو با عددی and کنیم که در اون عدد؛ تنها بیت یا بیت هایی رو که میخواییم نگهداریم و بقیه بیت های غیر مهم صفر باشه یا به تعبیری دیگه مقدار غیر صفر نداشته باشه. مثلا اگه بخواییم با بیت شماره 2 یک بایت کار کنیم این عدد برابر هست با:
                    0x04 یا "یک که به اندازه 2 تا به سمت چپ شیفت داده شده". ماکروی BV اینکارو برای شما انجام میده.
                    بعد از این بایستی این عدد رو با بایت مورد نظرمون and کنیم تا بتونیم مطمئن باشیم که فقط بیت 2 از بایت مورد نظر بدون تغییر باقی میمونه و بقیه بیت ها صفر میشن. (البته برای مقایسه و نه در بایت اصلی).

                    مثل اینه که بگیم:


                    1- BASIC: IF PORTB.2 = 1 THEN

                    2- BASIC: A = PORTB AND &H04
                    IF A = 4 THEN

                    3- C: a = PORTB & 0x04;
                    if( a == 4 )

                    4- C: if((PORTB & 0x04) == 4)

                    5- C: if(PORTB & 0x04)

                    6- C: if(PORTB & BV(2))


                    که تمام موارد فوق عینا مثل هم هستن. فقط این نکته رو بایستی در نظر داشت که در زبان C یک عبارت عددی غیر صفر میتونه به عنوان True در یک شرط تلقی بشه. (مورد های 4 و 5)

                    در زمان مقایسه میشه از اپراتور ~ هم برای این مورد استفاده کرد که با اجرای این عمل تمامی بیت ها عکس (invert) میشن. مثل اینکه عکس رو نگاتیو کنین و سپس بهش نگاه کنین.

                    حالا کد شما:
                    x میشه مکمل مقدار پورت B. یعنی اگر هر بیتی در PORTB یک باشه در x صفره و بالعکس.
                    بنا براین شرط پشت سر این دستور یعنی x=~1 اولا همواره اجرا میشه. چون دستور مقایسه در زبان C دو تا = هست نه یکی!! (چرائیش رو قبلا اشاره کردم. x مساوی با یک عدد غیر صفر قرار داده شده و سپس چک میشه. بنابراین همیشه درسته!) و ثانیا اگر فرض کنیم شما در تایپش اشتباه لپی کردین یعنی کد درست )x==~1) بوده باشه؛ بایستی کل بیت های PORTB صفر باشه ولی بیت شماره صفر؛ صفر باشه.
                    این بنده خدا لقمه رو دور سر پیچونده. میتونست بگه if(PORTB == 1) که خودتون میبینین این کد فقط با بیت صفر از پورت B کار نمیکنه (اونطوری که شما قید کردین) بلکه با تمام PORTB کار داره.

                    دیدگاه


                      پاسخ : آموزش winavr و avrlib

                      نوشته اصلی توسط reza_agha
                      جسارتا مجبورم مقداری توضیح واضحات بدم.
                      هر بایت از هشت بیت تشکیل شده. شما نمیتونین بدون دسترسی به کل یک بایت از محتوای یک بیت اطلاعی حاصل کنین یا مقدار اونو تغییر بدین. بنابراین وقتی میخواییم یک بیت رو از کل یک بایت مورد سنجش قرار بدیم بایستی شرایطی رو فراهم کنیم که بشه فقط با اون بیت کار کرد. یکی از راههای موجود اینه که مقدار اون بایت رو با عددی and کنیم که در اون عدد؛ تنها بیت یا بیت هایی رو که میخواییم نگهداریم و بقیه بیت های غیر مهم صفر باشه یا به تعبیری دیگه مقدار غیر صفر نداشته باشه. مثلا اگه بخواییم با بیت شماره 2 یک بایت کار کنیم این عدد برابر هست با:
                      0x04 یا "یک که به اندازه 2 تا به سمت چپ شیفت داده شده". ماکروی BV اینکارو برای شما انجام میده.
                      بعد از این بایستی این عدد رو با بایت مورد نظرمون and کنیم تا بتونیم مطمئن باشیم که فقط بیت 2 از بایت مورد نظر بدون تغییر باقی میمونه و بقیه بیت ها صفر میشن. (البته برای مقایسه و نه در بایت اصلی).

                      مثل اینه که بگیم:


                      1- BASIC: IF PORTB.2 = 1 THEN

                      2- BASIC: A = PORTB AND &H04
                      IF A = 4 THEN

                      3- C: a = PORTB & 0x04;
                      if( a == 4 )

                      4- C: if((PORTB & 0x04) == 4)

                      5- C: if(PORTB & 0x04)

                      6- C: if(PORTB & BV(2))


                      که تمام موارد فوق عینا مثل هم هستن. فقط این نکته رو بایستی در نظر داشت که در زبان C یک عبارت عددی غیر صفر میتونه به عنوان True در یک شرط تلقی بشه. (مورد های 4 و 5)

                      در زمان مقایسه میشه از اپراتور ~ هم برای این مورد استفاده کرد که با اجرای این عمل تمامی بیت ها عکس (invert) میشن. مثل اینکه عکس رو نگاتیو کنین و سپس بهش نگاه کنین.

                      حالا کد شما:
                      x میشه مکمل مقدار پورت B. یعنی اگر هر بیتی در PORTB یک باشه در x صفره و بالعکس.
                      بنا براین شرط پشت سر این دستور یعنی x=~1 اولا همواره اجرا میشه. چون دستور مقایسه در زبان C دو تا = هست نه یکی!! (چرائیش رو قبلا اشاره کردم. x مساوی با یک عدد غیر صفر قرار داده شده و سپس چک میشه. بنابراین همیشه درسته!) و ثانیا اگر فرض کنیم شما در تایپش اشتباه لپی کردین یعنی کد درست )x==~1) بوده باشه؛ بایستی کل بیت های PORTB صفر باشه ولی بیت شماره صفر؛ صفر باشه.
                      این بنده خدا لقمه رو دور سر پیچونده. میتونست بگه if(PORTB == 1) که خودتون میبینین این کد فقط با بیت صفر از پورت B کار نمیکنه (اونطوری که شما قید کردین) بلکه با تمام PORTB کار داره.
                      سلام.
                      من کلا قاطی کردم oo:
                      فقط یه سوال :
                      این روشی که شما گفتید فقط بیت مورد نظر رو چک میکنه و کاری به بیتهای دیگه نداره؟؟
                      مثلا تو دستور این if (PINB==1) اگه یه بیت دیگه تو همین پورت یک بشه دیگه شرط اجرا نمیشه.
                      من میخوام طوری بشه که بیتهای دیگه هر وضعیتی داشتن در نظر نگیره و فقط بیت مورد نظر چک بشه.

                      دیدگاه


                        پاسخ : آموزش winavr و avrlib

                        مثلا تو دستور این if (PINB==1) اگه یه بیت دیگه تو همین پورت یک بشه دیگه شرط اجرا نمیشه.
                        دقیقا! ولی این معادل همون کدیه که شما قید کردین:
                        x=~PINB
                        if (x=~1){
                        }
                        در کدی که من آوردم فقط همین بیت چک میشه.

                        if(IsBitSet(PORTB,0))
                        {
                        }


                        دیدگاه


                          پاسخ : آموزش winavr و avrlib

                          سلام.
                          یه نگاهی به دستور زیر بنداز :
                          کد:
                          if (x==9){
                          x=40}
                          تو این دستور اگه مقدار x=9 باشه x رو مساوی 40 قرار میده درسته؟؟
                          ولی این شرط همیشه مقدارش درسته و کاری نداره x چند باشه همش دستور تو شرط رو اجرا میکنه و مقدار x رو مساوی 40 قرار میده!!
                          مشکل از کجاست؟

                          دیدگاه


                            پاسخ : آموزش winavr و avrlib

                            ممکنه شما بجای دو تا = در عبارت شرطی یک = قید باشین. در این صورت اول کامپایلر مقدار 9 رو توی x میریزه. بعد چک میکنه حاصل این عمل (یعنی عدد 9) چون مساوی با صفر نیست پس true حساب میشه و شرط برای همیشه اجرا میشه. میتونین این فرم رو هم چک کنین. همیشه اجرا میشه:


                            if(9)
                            {
                            }


                            اما اگر در شرط 2 تا مساوی آورده باشین فقط در صورتی شرط اجرا میشه که x مساوی با 9 باشه.
                            یادتون باشه:
                            = در C یعنی سمت راست رو توی سمت چپ قرار بده.
                            == یعنی آیا سمت چپ با سمت راست مساوی هست؟ یا به نوعی دیگه "آیا حاصل تفریق عبارت سمت چپ با سمت راست صفر نیست؟" (مفهوم عددی)

                            دیدگاه


                              پاسخ : آموزش winavr و avrlib

                              سلام.
                              این برنامه ای که نوشتم همیشه شرط اجرا میشه !!!
                              #include <avr/io.h>
                              #include <util/delay.h>
                              #include <avrlibdefs.h>
                              int main(){
                              DDRB=0XFF;
                              int x;
                              while (1){
                              PORTB=x;
                              x=x+1;
                              _delay_ms (500);
                              if (x==9){
                              x=0b00010000;}
                              }}

                              در ضمن کتابخونه lcd 4bit رو از کجا دانلود کنم؟؟ (غیر از avrlib)
                              من از کتابخونه avrlib استفاده کردم و موقعی که تو پروتئوس شبیه سازی کردم همش وسط lcd مینویسه a.
                              حالا نمیدونم مشکل از برنامه هست یا پروتئوس!!

                              دیدگاه


                                پاسخ : آموزش winavr و avrlib

                                جسارتا برنامه تون باگ داره. قبل از شروع while مقدار متغیر x چنده؟ معلوم نیست! چون مقدار اولیه نداره. اگه خیال میکنین مقدارش صفره... باز هم شرمنده! متغیر محلی بر خلاف متغیر های عمومی تا چیزی توشون نریزین معلوم نیست چه مقداری دارن. بنا براین اگر این کد رو trace میکنین و میبینین که داره اجرا میشه؛ پس همیشه اجرا میشه؛ بخاطر اینه که بطور تصادفی ممکنه توی x مقدار 8 وجود داشته بعد یکی اضافه شده و 9 شده و کد if اجرا شده. ولی مسلما کد برای بار دوم اجرا نمیشه چون در سیکل قبلی اول 16 شده و بعد ابتدای سیکل بعدی میشه 17. و این یعنی دیگه تا overflow انجام نشه و دوباره مقدار 9 رو پیدا نکنه دوباره اجرا نمیشه.

                                دیدگاه

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