اطلاعیه

Collapse
No announcement yet.

تفاوت پورت g,f در codevision ,iar

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

    تفاوت پورت g,f در codevision ,iar

    با سلام
    چرا در کدویژن برای atmega128 پورتهای G,F را نمی شود بصورت بیتی مقدار داد و error می دهد ولیکن در iar مشکلی ندارد و کار می کند ؟
    حتی با کد ویژن جدید 2.3.5 هم تست کردم !

    #2
    پاسخ : تفاوت پورت g,f در codevision ,iar

    با سلام
    آقا اینکه مشکلی نداره ، کامپایل میشه
    من به عنوان مثال این دو خط رو نوشتم و بیت 1 پورت F و بیت 0 پورت G یک شدند :

    PORTF|=(1<<1);
    PORTG|=(1<<0);


    تو تنظمیات کدویژن تنظیم مربوط به دسترسی بیتی به پورت ها رو چک کردید ؟

    دیدگاه


      #3
      پاسخ : تفاوت پورت g,f در codevision ,iar

      این تنظیمات که می فرمایید کجاست ؟
      البته برای پورتهای دیگر مشکلی ندارد و این PORTG.0=1 و PORTF.1=1 را ERROR می دهد

      دیدگاه


        #4
        پاسخ : تفاوت پورت g,f در codevision ,iar



        البته برای پورتهای دیگر مشکلی ندارد و این PORTG.0=1 و PORTF.1=1 را ERROR می دهد
        OK
        تا اونجا که من میدونم این روش مقدار دهی فقط مختص کدویژن هست و جزو استاندار های برنامه نویسی نیست اما اینکه چرا این دستور در مورد این دوتا پورت اجرا نمیشه به خاطر این که مثلا این : "PORTF.1=1" باید بعد از کامپایل (با توجه به اینکه کدویژن از اسمبلر اتمل استفاده میکنه)تبدیل بشه به :

        SBI 0x62,1

        خوب این دو تا اشکال داره :
        1. 0X62 آدرس حافظه SRAM هست نه فایل ریجیستر های I/O که قابال دسترسی برای دستورات بیتی باشه .
        2. کلا دستورات بیتی مثل SBI , CBI تا رجیستر 0X1F (یعنی 32 تا رجیستر I/O) قابل استفاده هستند.
        به خاطر همین وقتی که اینجوری مینویسید چون از محدوده خارج هست کامپایلر خطا میگره و از این رو کامپایلر مجبوره برای دسترسی به این محدوده از دستورات دسترسی به حافظه SRAM استفاده کنه مثل LDS , STS.

        دیدگاه


          #5
          پاسخ : تفاوت پورت g,f در codevision ,iar

          من اون تیک رو هم که شما فرمودین زدم ولی مشکل حل نشد
          پیغامی که میده :
          Error: G:\xbee1\xbee1.c(164): the first argument of the '.' operator must be of 'struct' or 'union' type

          دیدگاه


            #6
            پاسخ : تفاوت پورت g,f در codevision ,iar

            نه دیگه ، توضیح که دادم !
            این مسئله اصلا امکان پذیر نیست برای کامپایلر که بخواد به این خواسته برنامه نویس جواب بده چون اصلا امکانش وجود نداره چون احتمالا این PORT.PIN=1 معادل SBI PORT,PIN هست و همونطور که گفتم SBI برای رجیسترهای قبل از $1F قابل استفاده هست پس موقع کامپایل با خطا به شما میگه این در توانایی اسمبلر نیست .

            در مورد اون تیک هم که زدید باید بگم که در واقع با زدن این تیک یه فایل هدر به برنامه اضافه میشه که حاوی اسم بیت های رجیسترها هست تا موقع مقدار دهی بیتی برای خوانا تر شدن برنامه از اسم بیت ها استفاده بشه نه شماره بیت مثلا اگه اون تیک رو بزارید میتونید جای این :

            PORTF|=(1<<5)


            بنویسید :

            PORTF|=(1<<PORTF5)


            چرا از ماکرو مثل SETBIT(PORTG, 2 ); استفاده نمیکنید ؟

            دیدگاه


              #7
              پاسخ : تفاوت پورت g,f در codevision ,iar

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

              من به شخصه این رو جزو اشکلات کدویژن می گذارم.

              دیدگاه


                #8
                پاسخ : تفاوت پورت g,f در codevision ,iar

                برای زمانی که از این پورتها بعضی پینها ورودی و برخی خروجی هستند کار کردن با پینها مشکل است. خصوصا اینکه من پینها رو در برنامه define می کنم تا برنامه قابل فهم باشه نمی دونم چرا کدویژن این مشکلشو حل نکرده تا حالا !

                دیدگاه


                  #9
                  پاسخ : تفاوت پورت g,f در codevision ,iar

                  با سلام
                  جناب عباسی چرا از ماکرو های خود کدوژن که برای کار بیتی با رجیستر های میکرو نوشته شده استفاده نمیکنید ؟

                  این ماکرو ها داخل فایل هدر iobits.h نوشته شدند ، فقط کاف اول برنامه اینکلود بشن ، بعد میتونید از ماکرو هاش که به قرار زیر هستند استفاده کنید :

                  کد:
                  /#define __BM(b) (1 << (b)) // bit b mask
                  
                  #ifdef _ATXMEGA_DEVICE_
                  // I/O port bit manipulation for ATxmega devices
                  #define __CONCAT(a,b) a##b // concatenate 2 strings
                  // set port bit b, atomic
                  // example: SETBIT(PORTA.OUT,5)
                  #define SETBIT(port,b) {__CONCAT(port,SET) = __BM(b);}
                  // clear port bit b, atomic
                  #define CLRBIT(port,b) {__CONCAT(port,CLR) = __BM(b);}
                  // toggle port bit b, atomic
                  #define TGLBIT(port,b) {__CONCAT(port,TGL) = __BM(b);}
                  #else
                  // I/O port bit manipulation for non-ATxmega AVR devices
                  // set port bit b, atomic for sfr port address <= 0x1F
                  // example: SETBIT(PORTA,5)
                  #define SETBIT(port,b) {(port) |= __BM(b);}
                  // clear port bit b, atomic for sfr port address <= 0x1F
                  #define CLRBIT(port,b) {(port) &= ~__BM(b);}
                  // toggle port bit b
                  #define TGLBIT(port,b) {(port) ^= __BM(b);}
                  #endif
                  
                  // set port bit b to value
                  #define EQUBIT(port,b,value) {if (value) SETBIT(port,b) else CLRBIT(port,b);}
                  // test port bit b, returns 0 or 1
                  #define TSTBIT(port,b) ((port & __BM(b)) != 0)

                  دیدگاه


                    #10
                    پاسخ : تفاوت پورت g,f در codevision ,iar

                    عالییییییییییییی بوووووووووووووووود

                    دیدگاه

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