اطلاعیه

Collapse
No announcement yet.

کوچ کردن از کدویژن به AtmelStudio

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

    پاسخ : کوچ کردن از کدویژن به AtmelStudio

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

    1- همیشه اینو گفتم : هیچ وقت خودتون را به کامپایلر و محیط برنامه نویسی محدود نکنید . هر کدام یک ویژگی هایی دارند.
    من خودم الان در پروژه های خیلی مهمم هم از کدویژن استفاده میکنم . ممکنه در یک پروژه از چند کامپایلر استفاده کنم.
    مثلا کدویژن به نسبت کدهای بهینه تر از نظر سایز ایجاد میکند. (نسبت به gcc در حالت سایز پتیمایز)


    2- کد ویزارد به هیچ وجه یک خصوصیت خوب در کدویژن نیست.
    اصلا دنبال کدویزارد و.. نباشید. کدویزارد یک ایده ای بوده که فقط برای فروش بیشتر کدویژن ایجاد شده.
    اصلا خوب نیست ، نباید بش عادت کنید .
    منطقی نیست که یک سری رجیستر اول کار تنظیم بشه و بعدش دیگه ثابت بمونه.
    نگید نمیتونم اسم رجیستر ها را حفظ کنم. یه مدت که کار کنید خودش دیگه تو ذهن میمونه.
    من خودم در حال نوشتن برنامه حتما دیتاشیت را در کنار محیط برنامه نویسی باز میکنم. اگه یه چیز یادم رفت سریع مراجعه میکنم به دیتاشیت. این اصولی تره.(باید دیتاشیت را کهنه کنید)





    راه اندازی ماژول nrf24l01p برای codevision (ارتباط بیسیم بین دو میکرو) : http://www.eca.ir/forum2/index.php?topic=78587.0
    کوچ کردن از کدویژن به http://www.eca.ir/forum2/index.php?topic=81025.0 : AtmelStudio
    نحوه نوشتن اصولی یک لایبرری و درایور نرم افزاری( بصورت ساده) : http://www.eca.ir/forum2/index.php?topic=81071
    http://www.eca.ir/forum2/index.php?topic=82130.0 سفارش راه انداز ماژول های مختلف توسط اعضای انجمن
    انشالله به زودی تاپیک ها به روز رسانی خواهد شد،

    دیدگاه


      پاسخ : کوچ کردن از کدویژن به AtmelStudio

      نوشته اصلی توسط RubeuS
      قبل از همه چیز از دوستانی که در این تاپیک فعالیت میکنند و دوستانی که بنده را یاری میکنند تشکر میکنم



      بایستی برخی دیفاین ها مشخص باشه به عنوان مثال (volatile BYTE_BITFIELD*) یک عمل cast است که دیتا آبجکت بعد از خود را به یک اشاره گر cast میکند. پس یه جورایی باید عبارت بعد از آن یک آدرس باشد که با توجه به PORTA& میبینیم که همینطور است.
      پس تا اینجا یک آدرس داریم که اگر (volatile BYTE_BITFIELD*) را در نظر نگیریم ، این آدرس همان آدرس رجیستر PORTA در SRAM است(کلا معماری رجیستر ها در avr به صورت memory mapped i/o می باشد)
      خوب حالا اگه ببنید یک * پشت عبارت کلی است که کار این عملگر این است که در خروجی مقدار دیتاآبجکتی که آدرسش بعد از آن مشخص است برمیگرداند.
      یعنی مقدار درون دیتا آبجکت از نوع volatile BYTE_BITFIELD با آدرس PORTA& را بر میگرداند.

      نکته: در صورتی که (volatile BYTE_BITFIELD*) حذف شود ، این دیفاین معادل زیر میشود:
      کد:
      #define porta PORTA
      ببخشید کارکرد و مزیت اینکار چیه ؟

      دیدگاه


        پاسخ : کوچ کردن از کدویژن به AtmelStudio

        نوشته اصلی توسط aseok
        ببخشید کارکرد و مزیت اینکار چیه ؟
        به عنوان مثال ما یک دیتا آبجکت از نوع int داریم :
        کد:
        int X;
        خوب الان این یعنی یک فضایی را در sram رزرو کردیم که 2 بایته (تو اکثر کامپایلرهای مخصوص میکرو int دو بایته)

        حالا این X حتما یک آدرسی داره که به نسبت میکرو این آدرس از یک عددی شروع میشه و یه حداکثری هم داره .
        مثلا ما میگیریم کامپایلر آدرس X را 0x25A8 در حافظه در نظر گرفته .

        پس الان چی شد؟
        X کجاای حافظه قرار داره؟

        یک بایتش تو 0x25A8 قرار داره . (بایت کم ارزش LSByte)
        یک بایتش تو 0x25A9 قرار داره . (بایت پر ارزش MSByte)

        حالا یه مقدار دهی به X میکنیم:
        کد:
        X=0x22FF;
        با اینکار 0xFF میره داخل خانه به آدرس 0x25A8 و 0x22 میره داخل خانه به آدرس 0x25A9

        خوب برسیم به کاربرد اونطوری دیفاین نوشتن:

        ببنید الان اگه مقدار X را بخونیم چی میده بمون؟
        اره . 0x22FF رو میده.

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

        چی کار کنم؟ :question:
        اره یک دیفاین مثل اینکه شما قرار دادی مینویسم:
        کد:
        #define x (*((char*)(&X)))
        حالا دیگه x بهم LSByte رو برمیگردونه و دیگه کلش رو برنمیگردونه.

        البته خود کسی که کد را نوشته از همه بهتر مقصوده کدش را میدونه.

        راستی دیدید بعضی رجیسترها دو قسمتی هستند .( مثل رجیستر های تایمر1 در مگا 32 ) ؟

        میشه با اینطور دیفاین نوشتن با یک عبارت کلش را انتخاب کنیم.

        راه اندازی ماژول nrf24l01p برای codevision (ارتباط بیسیم بین دو میکرو) : http://www.eca.ir/forum2/index.php?topic=78587.0
        کوچ کردن از کدویژن به http://www.eca.ir/forum2/index.php?topic=81025.0 : AtmelStudio
        نحوه نوشتن اصولی یک لایبرری و درایور نرم افزاری( بصورت ساده) : http://www.eca.ir/forum2/index.php?topic=81071
        http://www.eca.ir/forum2/index.php?topic=82130.0 سفارش راه انداز ماژول های مختلف توسط اعضای انجمن
        انشالله به زودی تاپیک ها به روز رسانی خواهد شد،

        دیدگاه


          پاسخ : کوچ کردن از کدویژن به AtmelStudio

          با سلام

          سید جان اولش میخواستم از شما تشکر کنم بعدا یک خواهشی از شما داشتم اگه ممکنه در این تاپیک و یا یک تاپیک مستقل الگوریتم نوشتن فارسی در TFT و GLCDD را که دوستانی مثل آقای نوربخش استفاده میکنند را با تشریح نسبی کــد بفرمایید من میدانم که این این درخواست اکثر دوستان می باشد باز هم تشکر میکنم

          دیدگاه


            پاسخ : کوچ کردن از کدویژن به AtmelStudio

            نوشته اصلی توسط Shapour-Ardebil
            با سلام

            سید جان اولش میخواستم از شما تشکر کنم بعدا یک خواهشی از شما داشتم اگه ممکنه در این تاپیک و یا یک تاپیک مستقل الگوریتم نوشتن فارسی در TFT و GLCDD را که دوستانی مثل آقای نوربخش استفاده میکنند را با تشریح نسبی کــد بفرمایید من میدانم که این این درخواست اکثر دوستان می باشد باز هم تشکر میکنم
            سلام

            در رابطه با السیدی من زیاد کار نکردم(علتشم در ادامه میگم) . و جناب نوربخش بهتر از همه میتونه راهنمایی کنه.

            ولی یک سری توضیحات کلی قرار میدم:

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

            السیدی چیزی نیست جز یک سری پیکسل که کنار هم اومدند.
            به عنوان یک مثال ساده ، یک السیدی گرافیکی سیاه سفید را در نظر بگیرید. مثلا یک السیدی که دارای 128 پیکسل در راستای افقی و 64 پیکسل در راستای عمودی داره. و این پیکسل ها فقط دو حالت روشن و خاموش(سیاه و سفید) میتوانند داشته باشند.
            مثلا به شکل زیر:
            _______________
            | |
            | |
            |______________|

            خوب این السیدیه ما یک چیپ راه انداز سخت افزاری داره که اطلاعات را دریافت میکنه و به نسبت اطلاعات دریافتی پیکسل ها را روشن و خاموش میکنه.(مثلا چیپ ks0108 سامسونگ)

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

            فهمیدید چی شده؟

            نه به این سادگیا هم که فکر میکنید نیست.

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

            باید این طرح ها را برزید داخل یک حافظه ( آرایه ای خاص)
            میدونید به این آرایه چی میگن؟
            اره آفرین ... فونت.

            خوب یک سوال: من یک کتابخونه دارم شنیدم قابلیت نوشتن فارسی داره، چه جوریاست؟ من فقط به یک تابع رشته ی فارسیم رو میدم و راحت نمایش داده میشه.
            اون زیر همه ی اینکارا انجام میشه ، بدون اینکه شما بدونید. حرفها تشخیص داده میشه و طرح های مناسب از آرایه ی فونت انتخاب میشه و قرار داده میشه.

            ببنید غیر از اینچیزا یک فکتور مهم دیگه هم هست. اونم سایز فونته.
            سایز فونت یعنی چی؟

            یادتونه گفتم برای الف کافیه یک طرح داشته باشیم که یک سری پیکسل عمودی روشن کنه .
            حالا اگه تعداد این پیکسل ها 10 باشه چی میشه؟ حالا اگه 5 تا باشه چی میشه؟
            اره آفرین سایز کوچیک و بزرگ میشه.
            اگه چند تا خط عمودی چسبیده به هم باشن چی میشه؟
            اره الف کلفت تر نشون داده میشه.


            خیلی کارا میشه انجام داد.
            مثلا یک آرایه ای از طرح ها داشته باشیم که برامون نستعلیق بنویسه. یا ...

            به ذوق سلیقه کسی که این آرایه فونت را مینویسه بر میگرده.
            مثلا یک نمودار داشته باشیم. یا یک بردار. یا یک منوی قشنگ . یا...

            منم راستش زیاد ذوق و سلیقه ی خوبی ندارم ، بخاطر همین زیاد نمیرم دنبال اینکارا.

            شما کافیه یک تابع داشته باشید که بتونید باش یک پیکسل مورد نظرتون را روشن و خاموش کنید . دیگه بقیش ذوق و سلیقه ی خودتونه ، که یک کار کنید در یک زمان پیکسل های مورد نظرتون روشن و خاموش باشن .

            حالا اگه بخوایید این رشته فارسی را رنگی نشون بدید چی؟
            خوب نیاز به یک السیدی رنگی داریم . در این السیدی ها دیگه یک پیکسل دو حالت نداره و میتونه حالت های مختلفی داشته باشه . مثلا یک پیکسل را بشه بهش سه بایت تخصیص داد. 3 بایت یعنی 24 بیت، 24 بیت یعنی دو بتوان 24 حالت یعنی 16 میلیون حالت(16 میلیون رنگ مختلف) ( فهمیدید چرا مثلا تو مشخصات السیدی گوشیتون زده السیدی با 16 میلیون رنگ).(البته اکثرا میان بعضی بیت ها را مشترک میگیرن ، و با اینکار تعداد رنگ ها را میارن پایین)

            کجا بودیم؟؟
            اهان . داشتم میگفتم به هر پیکسل 3 بایت اختصاص داده میشه. میدونید این سه بایت چیه؟ RGB شنیدید؟(رنگ های اصلی(قرمز ، سبز ، آبی)) همونه . هر بایت نشوندهنده مقدارتاثیر اون رنگ تو پیکسله.

            ااا اینههههمهههههه تنظیمات مختلف داریم!!!! تو گوشیمون خیلی قشنگ پیکسل ها مقدار دهی میشه. چه جوریه که قاتی نمیشن . همزمان خیلی کارهای دیگه هم با گوشی انجام میدیم.

            اینا دیگه کار سیستم عامله . و همچنین با یک پردازنده ی قوی میتونیم خیلی سریع این تغییرات را اعمال کنیم.

            در این مباحث مطلب خیلی زیاده.
            راه اندازی ماژول nrf24l01p برای codevision (ارتباط بیسیم بین دو میکرو) : http://www.eca.ir/forum2/index.php?topic=78587.0
            کوچ کردن از کدویژن به http://www.eca.ir/forum2/index.php?topic=81025.0 : AtmelStudio
            نحوه نوشتن اصولی یک لایبرری و درایور نرم افزاری( بصورت ساده) : http://www.eca.ir/forum2/index.php?topic=81071
            http://www.eca.ir/forum2/index.php?topic=82130.0 سفارش راه انداز ماژول های مختلف توسط اعضای انجمن
            انشالله به زودی تاپیک ها به روز رسانی خواهد شد،

            دیدگاه


              پاسخ : کوچ کردن از کدویژن به AtmelStudio

              با تشکر از آقای مرتضوی ، ببخشید اینکه LSB رو برگردونه کجای کد تعیین شده ، در صورتی که هدفمون MSB باشه کد چجوری میشه ؟

              کد:
              #define x (*((char*)(&X)))

              دیدگاه


                پاسخ : کوچ کردن از کدویژن به AtmelStudio

                نوشته اصلی توسط aseok
                با تشکر از آقای مرتضوی ، ببخشید اینکه LSB رو برگردونه کجای کد تعیین شده ، در صورتی که هدفمون MSB باشه کد چجوری میشه ؟

                کد:
                #define x (*((char*)(&X)))
                همیشه از داخلی ترین پرانتز شروع به تحلیل کنید.

                بافرض اینکه int دو بایت باشه و char یک بایت:

                X& یه آدرس به دیتا آبجکت int به ما میده. تو حافظه وقتی یک دیتا آبجکت دو بایتی داشته باشیم ، بایت کم ارزش( LSByte ) داخل خانه ی با آدرس کوچکتر و بایت پر ارزش در خانه ی با آدرس بزرکتر جای میگیره. پس X& در اصل آدرس LSByte هست . (خونه اولی) . که کامپایلر اینو به عنوان int میشناسه.

                حالا میخوایم نظر کامچایلر را در اینجا عوض کنیم. بش بگیم من X& را بهت میگم ولی تو دیگه iآدرس به دیتا آبجکت int نشناسش و اینجا آدرس به دیتا آبجکت char بشناسش .
                برای اینکار پشت X& پرانتز (*char) میزاریم .
                ولی دقت کنید X& هیچ تغییری نمیکنه ولی دید کامپایلر بهش عوض میشه و دیگه اون را یک دیتا آبجکت char در نظر میگیره.
                پس تا اینجا عبارت زیر را فهمیدیم چی شد:
                ((char*)(&X))

                حالا میریم سراغ بقیش:
                ببنید پشت این عبارت یک عملگر * اومده.
                این عملگر مقدار درون حافظه که آدرسش بعد از این عملگر اومده ، برمیگردونه.
                یعنی چی؟
                یعنی اگه ما پرانتز (*char) را بر داریم ، یک مقدار 2 بایتی شامل MSByte و LSByte رو برمیگردونه.
                حالا اگه پرانتز رو بزاریم چی؟
                اره . چون دیگه کامپایلر فکر میکنه اون آدرس از نوع آدرس به char است ، این عملگر فقط یک بایت و اونم بایت اول که LSByte است را برمیگردونه.(مقدار درونش)

                پس از این به بعد اگه ما X را فراخوانی کنیم دو بایت بر میگردونه ( int )

                ولی اگه x را فراخوانی کنیم یک بایت و اونم بایت کم ارزش اون int را بر میگردونه.

                تمرین:
                دیفاینی بنویسید که با فراخوانی m مقدار MSByte دیتا آبجکت X که از نوع int است را برگردونه:
                .
                .
                .
                .
                کد:
                #define m ( *( ((char*)(&X))+1 ) )
                راه اندازی ماژول nrf24l01p برای codevision (ارتباط بیسیم بین دو میکرو) : http://www.eca.ir/forum2/index.php?topic=78587.0
                کوچ کردن از کدویژن به http://www.eca.ir/forum2/index.php?topic=81025.0 : AtmelStudio
                نحوه نوشتن اصولی یک لایبرری و درایور نرم افزاری( بصورت ساده) : http://www.eca.ir/forum2/index.php?topic=81071
                http://www.eca.ir/forum2/index.php?topic=82130.0 سفارش راه انداز ماژول های مختلف توسط اعضای انجمن
                انشالله به زودی تاپیک ها به روز رسانی خواهد شد،

                دیدگاه


                  پاسخ : کوچ کردن از کدویژن به AtmelStudio

                  نوشته اصلی توسط RubeuS
                  سلام

                  در رابطه با السیدی من زیاد کار نکردم(علتشم در ادامه میگم) . و جناب نوربخش بهتر از همه میتونه راهنمایی کنه.

                  ولی یک سری توضیحات کلی قرار میدم:

                  .
                  .
                  .
                  .
                  ضمن تشکر از شما منظور من یک کار میدانی با تمام ریزه کاری های آن بود وگرنه من تا اینجا میدانستم که :
                  هرکدوم از حروف فارسی چهار حالت داره
                  1- اول
                  2- وسط
                  3- اخر چسبان
                  4 - اخر تنها
                  مثل حرف ه ( ههه ه)
                  مثل حرف ی ( ییی ی) و ...
                  ممکنه بعضی از حروف یکی از این حالتها رو نداشته باشه ولی بیشتر از 4 حالت نیست

                  الف : بنابراین باید با یک نرم افزار فونت ساز یا تبدیل عکس به HEX مثل FAST LCD یه عکس از فونت طراحی بشه
                  ب: حالا به یه MAP نیاز داریم این MAP برای تشخیص نوع حرف و حالتش به کار میره هر حرف 4 حالت داره در صورتی که برای هر چهارتا حالتش فقط یه کد اسکی هست که برای هر چهار حالت مشترک می باشد ( توی ارایه خود فونت ما نمیتونیم همه حروف رو با حالهای مختلفش قرار بدیم یعنی شما 32 حرف داری با حرکه ها و چند تا شکلک و علامت 128 = 4 × 32 با 128 تای انگلیسی میشه 256 در صورتی که کد اسکی 8 بیته و 256 اخرشه و در ویندوز که خود مصرف کننده فونت هست تصمیم میگیره از کدوم حالت استفاده کنه )
                  ج: حروف فارسی از 127 شروع میشه تا 255 پس یکی یکی شماره حروف رو در میاریم و در یک آرایه 4 × 128 میزاریم مثل این :
                  کد:
                  flash unsigned char F_FONT_MAP[111][4]={
                  
                   0xFF, 0xFF, 0xFF, 0xFF, // 127 =>
                   0xFF, 0xFF, 0xFF, 0xFF, // 128 =>
                   0x06, 0x06, 0x05, 0x05, // 129 =>  پ
                   0xFF, 0xFF, 0xFF, 0xFF, // 130 =>
                   0xFF, 0xFF, 0xFF, 0xFF, // 131 =>
                   0xFF, 0xFF, 0xFF, 0xFF, // 132 =>
                   0xFF, 0xFF, 0xFF, 0xFF, // 133 =>
                   0xFF, 0xFF, 0xFF, 0xFF, // 134 =>
                   0xFF, 0xFF, 0xFF, 0xFF, // 135 =>
                   0xFF, 0xFF, 0xFF, 0xFF, // 136 =>
                   0xFF, 0xFF, 0xFF, 0xFF, // 137 =>
                   0xFF, 0xFF, 0xFF, 0xFF, // 138 =>
                   0xFF, 0xFF, 0xFF, 0xFF, // 139 =>
                   0xFF, 0xFF, 0xFF, 0xFF, // 140 =>
                   0x0E, 0x0E, 0x0D, 0x0D, // 141 =>  چ
                   0x17, 0x17, 0x17, 0x17, // 142 =>  ژ
                   0xFF, 0xFF, 0xFF, 0xFF, // 143 =>
                   0x31, 0x31, 0x30, 0x30, // 144 =>  گ
                   0xFF, 0xFF, 0xFF, 0xFF, // 145 =>
                   0xFF, 0xFF, 0xFF, 0xFF, // 146 =>
                   0xFF, 0xFF, 0xFF, 0xFF, // 147 =>
                   0xFF, 0xFF, 0xFF, 0xFF, // 148 =>
                   0xFF, 0xFF, 0xFF, 0xFF, // 149 =>
                   0xFF, 0xFF, 0xFF, 0xFF, // 150 =>
                   0xFF, 0xFF, 0xFF, 0xFF, // 151 =>
                   0x2F, 0x2F, 0x2E, 0x2E, // 152 =>  ک
                   0xFF, 0xFF, 0xFF, 0xFF, // 153 =>
                   0xFF, 0xFF, 0xFF, 0xFF, // 154 =>
                   0xFF, 0xFF, 0xFF, 0xFF, // 155 =>
                   0xFF, 0xFF, 0xFF, 0xFF, // 156 =>
                   0xFF, 0xFF, 0xFF, 0xFF, // 157 =>
                   0xFF, 0xFF, 0xFF, 0xFF, // 158 =>
                   0xFF, 0xFF, 0xFF, 0xFF, // 159 =>
                   0xFF, 0xFF, 0xFF, 0xFF, // 160 =>
                   0xFF, 0xFF, 0xFF, 0xFF, // 161 =>
                   0xFF, 0xFF, 0xFF, 0xFF, // 162 =>
                   0xFF, 0xFF, 0xFF, 0xFF, // 163 =>
                   0xFF, 0xFF, 0xFF, 0xFF, // 164 =>
                   0xFF, 0xFF, 0xFF, 0xFF, // 165 =>
                   0xFF, 0xFF, 0xFF, 0xFF, // 166 =>
                   0xFF, 0xFF, 0xFF, 0xFF, // 167 =>
                   0xFF, 0xFF, 0xFF, 0xFF, // 168 =>
                   0xFF, 0xFF, 0xFF, 0xFF, // 169 =>
                   0x3C, 0x3B, 0x3A, 0x39, // 170 =>  ه
                   0xFF, 0xFF, 0xFF, 0xFF, // 171 =>
                   0xFF, 0xFF, 0xFF, 0xFF, // 172 =>
                   0xFF, 0xFF, 0xFF, 0xFF, // 173 =>
                   0xFF, 0xFF, 0xFF, 0xFF, // 174 =>
                   0xFF, 0xFF, 0xFF, 0xFF, // 175 =>
                   0xFF, 0xFF, 0xFF, 0xFF, // 176 =>
                   0xFF, 0xFF, 0xFF, 0xFF, // 177 =>
                   0xFF, 0xFF, 0xFF, 0xFF, // 178 =>
                   0xFF, 0xFF, 0xFF, 0xFF, // 179 =>
                   0xFF, 0xFF, 0xFF, 0xFF, // 180 =>
                   0xFF, 0xFF, 0xFF, 0xFF, // 181 =>
                   0xFF, 0xFF, 0xFF, 0xFF, // 182 =>
                   0xFF, 0xFF, 0xFF, 0xFF, // 183 =>
                   0xFF, 0xFF, 0xFF, 0xFF, // 184 =>
                   0xFF, 0xFF, 0xFF, 0xFF, // 185 =>
                   0xFF, 0xFF, 0xFF, 0xFF, // 186 =>
                   0xFF, 0xFF, 0xFF, 0xFF, // 187 =>
                   0xFF, 0xFF, 0xFF, 0xFF, // 188 =>
                   0xFF, 0xFF, 0xFF, 0xFF, // 189 =>
                   0xFF, 0xFF, 0xFF, 0xFF, // 190 =>
                   0x43, 0x43, 0x43, 0x43, // 191 =>  ؟
                   0x3C, 0x3B, 0xFF, 0xFF, // 192 =>  ه
                   0x40, 0x40, 0x40, 0x40, // 193 =>  ء
                   0xFF, 0xFF, 0xFF, 0x00, // 194 =>  آ
                   0xFF, 0xFF, 0xFF, 0xFF, // 195 =>  أ
                   0xFF, 0xFF, 0xFF, 0xFF, // 196 =>  و
                   0x02, 0x02, 0x02, 0x02, // 197 =>  ا
                   0xFF, 0xFF, 0xFF, 0xFF, // 198 =>  ئ
                   0x02, 0x01, 0x01, 0x02, // 199 =>  ا
                   0x04, 0x04, 0x03, 0x03, // 200 =>  ب
                   0xFF, 0xFF, 0xFF, 0xFF, // 201 =>  ه
                   0x08, 0x08, 0x07, 0x07, // 202 =>  ت
                   0x0A, 0x0A, 0x09, 0x09, // 203 =>  ث
                   0x0C, 0x0C, 0x0B, 0x0B, // 204 =>  ج
                   0x10, 0x10, 0x0F, 0x0F, // 205 =>  ح
                   0x12, 0x12, 0x11, 0x11, // 206 =>  خ
                   0x13, 0x13, 0x13, 0x13, // 207 =>  د
                   0x14, 0x14, 0x14, 0x14, // 208 =>  ذ
                   0x15, 0x15, 0x15, 0x15, // 209 =>  ر
                   0x16, 0x16, 0x16, 0x16, // 210 =>  ز
                   0x19, 0x19, 0x18, 0x18, // 211 =>  س
                   0x1B, 0x1B, 0x1A, 0x1A, // 212 =>  ش
                   0x1D, 0x1D, 0x1C, 0x1C, // 213 =>  ص
                   0x1F, 0x1F, 0x1E, 0x1E, // 214 =>  ض
                   0xFF, 0xFF, 0xFF, 0xFF, // 215 =>
                   0x20, 0x20, 0x20, 0x20, // 216 =>  ط
                   0x21, 0x21, 0x21, 0x21, // 217 =>  ظ
                   0x25, 0x24, 0x23, 0x22, // 218 =>  ع
                   0x29, 0x28, 0x27, 0x26, // 219 =>  غ
                   0xFF, 0xFF, 0xFF, 0xFF, // 220 =>
                   0x2B, 0x2B, 0x2A, 0x2A, // 221 =>  ف
                   0x2D, 0x2D, 0x2C, 0x2C, // 222 =>  ق
                   0x2F, 0x2F, 0x2E, 0x2E, // 223 =>  ک
                   0xFF, 0xFF, 0xFF, 0xFF, // 224 =>
                   0x33, 0x33, 0x32, 0x32, // 225 =>  ل
                   0xFF, 0xFF, 0xFF, 0xFF, // 226 =>
                   0x35, 0x35, 0x34, 0x34, // 227 =>  م
                   0x37, 0x37, 0x36, 0x36, // 228 =>  ن
                   0x3C, 0x3B, 0x3A, 0x39, // 229 =>  ه
                   0x38, 0x38, 0x38, 0x38, // 230 =>  و
                   0xFF, 0xFF, 0xFF, 0xFF, // 231 =>
                   0xFF, 0xFF, 0xFF, 0xFF, // 232 =>
                   0xFF, 0xFF, 0xFF, 0xFF, // 233 =>
                   0xFF, 0xFF, 0xFF, 0xFF, // 234 =>
                   0xFF, 0xFF, 0xFF, 0xFF, // 235 =>
                   0x3F, 0x3E, 0x3D, 0x3D, // 236 =>  ی
                   0x3F, 0x3E, 0x3D, 0x3D // 237 =>  ی
                  };
                  د: حالا بایدحالت حرف رو تشخیص بدی (بفهمی کدوم یکی از اون چهارتاست) بعد با خوندن 8 بایت از جدول فونتمون با ابتدای عددی که از توی جدول MAP در اوردیم روی LCD نمایش بدیم
                  برای تشخیص حروف قبل از انتخاب نوع حرف ، حرف قبل رو چک میکنیم تا بدونم یکی از این حروف ( ا - آ - د - ذ - ر - ز - ژ - و – فاصله ) هست یا نه بعد فاصله چک میشه مثل این :
                  -1 اگر حرف قبل یکی از این نه حرف باشد به شرطی که حرف بعدی فاصله باشه از نوع چهارم یا اخر تنها هست
                  2 - اگر حرف قبل یکی از این نه حرف باشد به شرطی که حرف بعدی فاصله نباشه از نوع اول یا اول چسبان هست
                  3 - اگر حرف قبل یکی از این نه حرف نباشد به شرطی که حرف بعدی فاصله باشد از نوع سوم یا اخر چسبان هست
                  4 - اگر حرف قبل یکی از این نه حرف نباشد به شرطی که حرف بعدی فاصله نباشد از نوع ذوم یا وسط هست
                  یه چیزی مثل این البته من اینجا کاراکتر نال یا پایان زشته رو هم همزمان با فاصله چک کردم

                  ر: بعد از تشخیص نوع اندیس دیتای حروف مورد نظر رو از ارایه MAP در میاریم ارایه مپ برپایه کدهای اسکی هست ولی ارایه خود فونت نه در موارد 4 گانه ای که ذکر شد در جای حرف اول از رشته خالی است که حرف ماقبل آن وجود ندارد و در همان گزینه های 1 و 2 گنجانده می شود. در روش نمایش فونت از طریق تایپ مستقیم فارسی در محیط برنامه، مشکلاتی هم وجود دارد که از جمله آن مسئله نمایش اعداد فارسی است که در ادیتورهای مختلف یا به درستی قابل نمایش نیست و یا در شرایط خاص و با قرار گرفتن بین دو حرف فارسی دیگر قابل نمایش است. یک مسئله دیگر در فونت های متغیر این است که در کاربردهایی که قرار است یک متن از پیش تعیین شده از flash در کنار اطلاعات متغیری از SRAM نمایش داده شود،

                  و .....

                  من می خواستم همه باهم یک کار عملی با همکاری همدیگر ومدیریت شما انجام بدیم


                  دیدگاه


                    پاسخ : کوچ کردن از کدویژن به AtmelStudio

                    نوشته اصلی توسط Shapour-Ardebil
                    ضمن تشکر از شما منظور من یک کار میدانی با تمام ریزه کاری های آن بود وگرنه من تا اینجا میدانستم که :
                    هرکدوم از حروف فارسی چهار حالت داره
                    1- اول
                    2- وسط
                    3- اخر چسبان
                    4 - اخر تنها
                    مثل حرف ه ( ههه ه)
                    مثل حرف ی ( ییی ی) و ...
                    ممکنه بعضی از حروف یکی از این حالتها رو نداشته باشه ولی بیشتر از 4 حالت نیست

                    الف : بنابراین باید با یک نرم افزار فونت ساز یا تبدیل عکس به HEX مثل FAST LCD یه عکس از فونت طراحی بشه
                    ب: حالا به یه MAP نیاز داریم این MAP برای تشخیص نوع حرف و حالتش به کار میره هر حرف 4 حالت داره در صورتی که برای هر چهارتا حالتش فقط یه کد اسکی هست که برای هر چهار حالت مشترک می باشد ( توی ارایه خود فونت ما نمیتونیم همه حروف رو با حالهای مختلفش قرار بدیم یعنی شما 32 حرف داری با حرکه ها و چند تا شکلک و علامت 128 = 4 × 32 با 128 تای انگلیسی میشه 256 در صورتی که کد اسکی 8 بیته و 256 اخرشه و در ویندوز که خود مصرف کننده فونت هست تصمیم میگیره از کدوم حالت استفاده کنه )
                    ج: حروف فارسی از 127 شروع میشه تا 255 پس یکی یکی شماره حروف رو در میاریم و در یک آرایه 4 × 128 میزاریم مثل این :
                    کد:
                    flash unsigned char F_FONT_MAP[111][4]={
                    
                     0xFF, 0xFF, 0xFF, 0xFF, // 127 =>
                     0xFF, 0xFF, 0xFF, 0xFF, // 128 =>
                     0x06, 0x06, 0x05, 0x05, // 129 =>  پ
                     0xFF, 0xFF, 0xFF, 0xFF, // 130 =>
                     0xFF, 0xFF, 0xFF, 0xFF, // 131 =>
                     0xFF, 0xFF, 0xFF, 0xFF, // 132 =>
                     0xFF, 0xFF, 0xFF, 0xFF, // 133 =>
                     0xFF, 0xFF, 0xFF, 0xFF, // 134 =>
                     0xFF, 0xFF, 0xFF, 0xFF, // 135 =>
                     0xFF, 0xFF, 0xFF, 0xFF, // 136 =>
                     0xFF, 0xFF, 0xFF, 0xFF, // 137 =>
                     0xFF, 0xFF, 0xFF, 0xFF, // 138 =>
                     0xFF, 0xFF, 0xFF, 0xFF, // 139 =>
                     0xFF, 0xFF, 0xFF, 0xFF, // 140 =>
                     0x0E, 0x0E, 0x0D, 0x0D, // 141 =>  چ
                     0x17, 0x17, 0x17, 0x17, // 142 =>  ژ
                     0xFF, 0xFF, 0xFF, 0xFF, // 143 =>
                     0x31, 0x31, 0x30, 0x30, // 144 =>  گ
                     0xFF, 0xFF, 0xFF, 0xFF, // 145 =>
                     0xFF, 0xFF, 0xFF, 0xFF, // 146 =>
                     0xFF, 0xFF, 0xFF, 0xFF, // 147 =>
                     0xFF, 0xFF, 0xFF, 0xFF, // 148 =>
                     0xFF, 0xFF, 0xFF, 0xFF, // 149 =>
                     0xFF, 0xFF, 0xFF, 0xFF, // 150 =>
                     0xFF, 0xFF, 0xFF, 0xFF, // 151 =>
                     0x2F, 0x2F, 0x2E, 0x2E, // 152 =>  ک
                     0xFF, 0xFF, 0xFF, 0xFF, // 153 =>
                     0xFF, 0xFF, 0xFF, 0xFF, // 154 =>
                     0xFF, 0xFF, 0xFF, 0xFF, // 155 =>
                     0xFF, 0xFF, 0xFF, 0xFF, // 156 =>
                     0xFF, 0xFF, 0xFF, 0xFF, // 157 =>
                     0xFF, 0xFF, 0xFF, 0xFF, // 158 =>
                     0xFF, 0xFF, 0xFF, 0xFF, // 159 =>
                     0xFF, 0xFF, 0xFF, 0xFF, // 160 =>
                     0xFF, 0xFF, 0xFF, 0xFF, // 161 =>
                     0xFF, 0xFF, 0xFF, 0xFF, // 162 =>
                     0xFF, 0xFF, 0xFF, 0xFF, // 163 =>
                     0xFF, 0xFF, 0xFF, 0xFF, // 164 =>
                     0xFF, 0xFF, 0xFF, 0xFF, // 165 =>
                     0xFF, 0xFF, 0xFF, 0xFF, // 166 =>
                     0xFF, 0xFF, 0xFF, 0xFF, // 167 =>
                     0xFF, 0xFF, 0xFF, 0xFF, // 168 =>
                     0xFF, 0xFF, 0xFF, 0xFF, // 169 =>
                     0x3C, 0x3B, 0x3A, 0x39, // 170 =>  ه
                     0xFF, 0xFF, 0xFF, 0xFF, // 171 =>
                     0xFF, 0xFF, 0xFF, 0xFF, // 172 =>
                     0xFF, 0xFF, 0xFF, 0xFF, // 173 =>
                     0xFF, 0xFF, 0xFF, 0xFF, // 174 =>
                     0xFF, 0xFF, 0xFF, 0xFF, // 175 =>
                     0xFF, 0xFF, 0xFF, 0xFF, // 176 =>
                     0xFF, 0xFF, 0xFF, 0xFF, // 177 =>
                     0xFF, 0xFF, 0xFF, 0xFF, // 178 =>
                     0xFF, 0xFF, 0xFF, 0xFF, // 179 =>
                     0xFF, 0xFF, 0xFF, 0xFF, // 180 =>
                     0xFF, 0xFF, 0xFF, 0xFF, // 181 =>
                     0xFF, 0xFF, 0xFF, 0xFF, // 182 =>
                     0xFF, 0xFF, 0xFF, 0xFF, // 183 =>
                     0xFF, 0xFF, 0xFF, 0xFF, // 184 =>
                     0xFF, 0xFF, 0xFF, 0xFF, // 185 =>
                     0xFF, 0xFF, 0xFF, 0xFF, // 186 =>
                     0xFF, 0xFF, 0xFF, 0xFF, // 187 =>
                     0xFF, 0xFF, 0xFF, 0xFF, // 188 =>
                     0xFF, 0xFF, 0xFF, 0xFF, // 189 =>
                     0xFF, 0xFF, 0xFF, 0xFF, // 190 =>
                     0x43, 0x43, 0x43, 0x43, // 191 =>  ؟
                     0x3C, 0x3B, 0xFF, 0xFF, // 192 =>  ه
                     0x40, 0x40, 0x40, 0x40, // 193 =>  ء
                     0xFF, 0xFF, 0xFF, 0x00, // 194 =>  آ
                     0xFF, 0xFF, 0xFF, 0xFF, // 195 =>  أ
                     0xFF, 0xFF, 0xFF, 0xFF, // 196 =>  و
                     0x02, 0x02, 0x02, 0x02, // 197 =>  ا
                     0xFF, 0xFF, 0xFF, 0xFF, // 198 =>  ئ
                     0x02, 0x01, 0x01, 0x02, // 199 =>  ا
                     0x04, 0x04, 0x03, 0x03, // 200 =>  ب
                     0xFF, 0xFF, 0xFF, 0xFF, // 201 =>  ه
                     0x08, 0x08, 0x07, 0x07, // 202 =>  ت
                     0x0A, 0x0A, 0x09, 0x09, // 203 =>  ث
                     0x0C, 0x0C, 0x0B, 0x0B, // 204 =>  ج
                     0x10, 0x10, 0x0F, 0x0F, // 205 =>  ح
                     0x12, 0x12, 0x11, 0x11, // 206 =>  خ
                     0x13, 0x13, 0x13, 0x13, // 207 =>  د
                     0x14, 0x14, 0x14, 0x14, // 208 =>  ذ
                     0x15, 0x15, 0x15, 0x15, // 209 =>  ر
                     0x16, 0x16, 0x16, 0x16, // 210 =>  ز
                     0x19, 0x19, 0x18, 0x18, // 211 =>  س
                     0x1B, 0x1B, 0x1A, 0x1A, // 212 =>  ش
                     0x1D, 0x1D, 0x1C, 0x1C, // 213 =>  ص
                     0x1F, 0x1F, 0x1E, 0x1E, // 214 =>  ض
                     0xFF, 0xFF, 0xFF, 0xFF, // 215 =>
                     0x20, 0x20, 0x20, 0x20, // 216 =>  ط
                     0x21, 0x21, 0x21, 0x21, // 217 =>  ظ
                     0x25, 0x24, 0x23, 0x22, // 218 =>  ع
                     0x29, 0x28, 0x27, 0x26, // 219 =>  غ
                     0xFF, 0xFF, 0xFF, 0xFF, // 220 =>
                     0x2B, 0x2B, 0x2A, 0x2A, // 221 =>  ف
                     0x2D, 0x2D, 0x2C, 0x2C, // 222 =>  ق
                     0x2F, 0x2F, 0x2E, 0x2E, // 223 =>  ک
                     0xFF, 0xFF, 0xFF, 0xFF, // 224 =>
                     0x33, 0x33, 0x32, 0x32, // 225 =>  ل
                     0xFF, 0xFF, 0xFF, 0xFF, // 226 =>
                     0x35, 0x35, 0x34, 0x34, // 227 =>  م
                     0x37, 0x37, 0x36, 0x36, // 228 =>  ن
                     0x3C, 0x3B, 0x3A, 0x39, // 229 =>  ه
                     0x38, 0x38, 0x38, 0x38, // 230 =>  و
                     0xFF, 0xFF, 0xFF, 0xFF, // 231 =>
                     0xFF, 0xFF, 0xFF, 0xFF, // 232 =>
                     0xFF, 0xFF, 0xFF, 0xFF, // 233 =>
                     0xFF, 0xFF, 0xFF, 0xFF, // 234 =>
                     0xFF, 0xFF, 0xFF, 0xFF, // 235 =>
                     0x3F, 0x3E, 0x3D, 0x3D, // 236 =>  ی
                     0x3F, 0x3E, 0x3D, 0x3D // 237 =>  ی
                    };
                    د: حالا بایدحالت حرف رو تشخیص بدی (بفهمی کدوم یکی از اون چهارتاست) بعد با خوندن 8 بایت از جدول فونتمون با ابتدای عددی که از توی جدول MAP در اوردیم روی LCD نمایش بدیم
                    برای تشخیص حروف قبل از انتخاب نوع حرف ، حرف قبل رو چک میکنیم تا بدونم یکی از این حروف ( ا - آ - د - ذ - ر - ز - ژ - و – فاصله ) هست یا نه بعد فاصله چک میشه مثل این :
                    -1 اگر حرف قبل یکی از این نه حرف باشد به شرطی که حرف بعدی فاصله باشه از نوع چهارم یا اخر تنها هست
                    2 - اگر حرف قبل یکی از این نه حرف باشد به شرطی که حرف بعدی فاصله نباشه از نوع اول یا اول چسبان هست
                    3 - اگر حرف قبل یکی از این نه حرف نباشد به شرطی که حرف بعدی فاصله باشد از نوع سوم یا اخر چسبان هست
                    4 - اگر حرف قبل یکی از این نه حرف نباشد به شرطی که حرف بعدی فاصله نباشد از نوع ذوم یا وسط هست
                    یه چیزی مثل این البته من اینجا کاراکتر نال یا پایان زشته رو هم همزمان با فاصله چک کردم

                    ر: بعد از تشخیص نوع اندیس دیتای حروف مورد نظر رو از ارایه MAP در میاریم ارایه مپ برپایه کدهای اسکی هست ولی ارایه خود فونت نه در موارد 4 گانه ای که ذکر شد در جای حرف اول از رشته خالی است که حرف ماقبل آن وجود ندارد و در همان گزینه های 1 و 2 گنجانده می شود. در روش نمایش فونت از طریق تایپ مستقیم فارسی در محیط برنامه، مشکلاتی هم وجود دارد که از جمله آن مسئله نمایش اعداد فارسی است که در ادیتورهای مختلف یا به درستی قابل نمایش نیست و یا در شرایط خاص و با قرار گرفتن بین دو حرف فارسی دیگر قابل نمایش است. یک مسئله دیگر در فونت های متغیر این است که در کاربردهایی که قرار است یک متن از پیش تعیین شده از flash در کنار اطلاعات متغیری از SRAM نمایش داده شود،

                    و .....

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

                    در این رابطه خوب کتابخانه ها و کدهایی وجود داره . شما یعنی دوباره میخواید انجامش بدید؟!

                    من هدفتون را از اینکار متوجه نمیشم؟ چه نیازی هست؟

                    ولی خوب اگه میخواید از روی کنجکاوی و تمرین اینکار را کنید ( نمیگم از روی اینکه برا خودتون بتونید یک کتابخانه ی مستقل داشته باشید ، چون در این رابطه ، یه جورایی اینکار فقط تلف کردن وقته)

                    یا میخواید کدهای موجود را تحلیل کنید، مشکلی نداره . منم تا جایی که بتونم کمک میکنم.

                    البته باید نکات زیر در نظر گرفته شود:

                    1- یک تاپیک مستقل در این رابطه ایجاد کنید .

                    2- اگر میخواید کتابخانه ی خاصی که توسط اعضای انجمن نوشته شده ، تحلیل کنید . باید حتما قبلش خودشون در جریان باشن. ( اینو تاکید میکنم.)

                    3- اگر میخواید کتابخانه بنویسید قبلش میتوانید یک سری فرضیات برای اینکه همه یک دست باشن ، در نظر بگیرید. مثل : نوع میکرو - کامپایلر - نوع السیدی . ( فعلا برای شروع بهتره منحصرا کار کنید)

                    4- اگر میخواید کتابخانه بنویسید باید یک سری اصول را قبل از اون در نظر بگیرید.

                    در رابطه با فونت ها هم من با اجازه ی جناب نوربخش فقط پی دی افی که گذاشتند را معرفی میکنم : FEmap description
                    یه نگاه بش بندازید بد نیست. فقط یک جدوله ولی اگه یکم روش فکر کنید خیلی چیزا تو ذهنتون میاد.

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

                    اصلا کلا استفاده از السیدی خیلی محدوده ، خودم کلا اگه برا تست تو پروژه هام استفاده کنم که البته راحت ترم از مانیتور کامپیوترم استفاده کنم(با استفاده از سیستم عامل) تا السیدی یه ذره ای.(البته یه مدت قصد داشتم یک کتاخونه برا یک السیدی کوچیک بنویسم ولی اصلا وقت نشد.) (راستش 6 7 ماه پیش یک السیدی رنگی کوچیک خریدم ، به خدا هنوز فرصت نکردم بزنمش به تغذیه)

                    راه اندازی ماژول nrf24l01p برای codevision (ارتباط بیسیم بین دو میکرو) : http://www.eca.ir/forum2/index.php?topic=78587.0
                    کوچ کردن از کدویژن به http://www.eca.ir/forum2/index.php?topic=81025.0 : AtmelStudio
                    نحوه نوشتن اصولی یک لایبرری و درایور نرم افزاری( بصورت ساده) : http://www.eca.ir/forum2/index.php?topic=81071
                    http://www.eca.ir/forum2/index.php?topic=82130.0 سفارش راه انداز ماژول های مختلف توسط اعضای انجمن
                    انشالله به زودی تاپیک ها به روز رسانی خواهد شد،

                    دیدگاه


                      پاسخ : کوچ کردن از کدویژن به AtmelStudio

                      نوشته اصلی توسط RubeuS
                      همیشه از داخلی ترین پرانتز شروع به تحلیل کنید.

                      بافرض اینکه int دو بایت باشه و char یک بایت:

                      X& یه آدرس به دیتا آبجکت int به ما میده. تو حافظه وقتی یک دیتا آبجکت دو بایتی داشته باشیم ، بایت کم ارزش( LSByte ) داخل خانه ی با آدرس کوچکتر و بایت پر ارزش در خانه ی با آدرس بزرکتر جای میگیره. پس X& در اصل آدرس LSByte هست . (خونه اولی) . که کامپایلر اینو به عنوان int میشناسه.

                      حالا میخوایم نظر کامچایلر را در اینجا عوض کنیم. بش بگیم من X& را بهت میگم ولی تو دیگه iآدرس به دیتا آبجکت int نشناسش و اینجا آدرس به دیتا آبجکت char بشناسش .
                      برای اینکار پشت X& پرانتز (*char) میزاریم .
                      ولی دقت کنید X& هیچ تغییری نمیکنه ولی دید کامپایلر بهش عوض میشه و دیگه اون را یک دیتا آبجکت char در نظر میگیره.
                      پس تا اینجا عبارت زیر را فهمیدیم چی شد:
                      ((char*)(&X))

                      حالا میریم سراغ بقیش:
                      ببنید پشت این عبارت یک عملگر * اومده.
                      این عملگر مقدار درون حافظه که آدرسش بعد از این عملگر اومده ، برمیگردونه.
                      یعنی چی؟
                      یعنی اگه ما پرانتز (*char) را بر داریم ، یک مقدار 2 بایتی شامل MSByte و LSByte رو برمیگردونه.
                      حالا اگه پرانتز رو بزاریم چی؟
                      اره . چون دیگه کامپایلر فکر میکنه اون آدرس از نوع آدرس به char است ، این عملگر فقط یک بایت و اونم بایت اول که LSByte است را برمیگردونه.(مقدار درونش)

                      پس از این به بعد اگه ما X را فراخوانی کنیم دو بایت بر میگردونه ( int )

                      ولی اگه x را فراخوانی کنیم یک بایت و اونم بایت کم ارزش اون int را بر میگردونه.

                      تمرین:
                      دیفاینی بنویسید که با فراخوانی m مقدار MSByte دیتا آبجکت X که از نوع int است را برگردونه:
                      .
                      .
                      .
                      .
                      کد:
                      #define m ( *( ((char*)(&X))+1 ) )
                      سلام.دسترسی به بایت اول آیا با دستور زیر قابل دسترسی نیست؟
                      کد:
                      #define x ((char)X)
                      و برای بایت دوم:

                      کد:
                      #define x *((&((char)X))+1)

                      دیدگاه


                        پاسخ : کوچ کردن از کدویژن به AtmelStudio

                        نوشته اصلی توسط sadeghmojtabaei
                        سلام.دسترسی به بایت اول آیا با دستور زیر قابل دسترسی نیست؟
                        کد:
                        #define x ((char)X)
                        و برای بایت دوم:

                        کد:
                        #define x *((&((char)X))+1)
                        سلام . بله به گونه های مختلفی میشه به خانه های حافظه دسترسی داشت/

                        من اون دیفاینها رو نوشتم چون میخواستم یه جورایی مربوط به سوال اولشون باشه.
                        وگرنه اصلا اینطور نیست که آیه اومده باشه که یک راه برای اینکار وجود داره.

                        با اشاره گرها و کستنیگ و .... بازی های زیادی میشه انجام داد.
                        راه اندازی ماژول nrf24l01p برای codevision (ارتباط بیسیم بین دو میکرو) : http://www.eca.ir/forum2/index.php?topic=78587.0
                        کوچ کردن از کدویژن به http://www.eca.ir/forum2/index.php?topic=81025.0 : AtmelStudio
                        نحوه نوشتن اصولی یک لایبرری و درایور نرم افزاری( بصورت ساده) : http://www.eca.ir/forum2/index.php?topic=81071
                        http://www.eca.ir/forum2/index.php?topic=82130.0 سفارش راه انداز ماژول های مختلف توسط اعضای انجمن
                        انشالله به زودی تاپیک ها به روز رسانی خواهد شد،

                        دیدگاه


                          پاسخ : کوچ کردن از کدویژن به AtmelStudio

                          سلام

                          آیا با دستور زیر ، بیتهای 7 تا 12 از data در رجیستر UDR ( رجیستر مربوط به بافر ارسال در usart ، بافرض ارسال 6 بیتی) قرار میگیرد ؟ فرم صحیح آن چیست ؟
                          باتشکر.


                          کد:
                          int data = 0xABCD ;
                          UDR = data / 64 ;

                          دیدگاه


                            پاسخ : کوچ کردن از کدویژن به AtmelStudio

                            نوشته اصلی توسط aseok
                            سلام

                            آیا با دستور زیر ، بیتهای 7 تا 12 از data در رجیستر UDR ( رجیستر مربوط به بافر ارسال در usart ، بافرض ارسال 6 بیتی) قرار میگیرد ؟ فرم صحیح آن چیست ؟
                            باتشکر.


                            کد:
                            int data = 0xABCD ;
                            UDR = data / 64 ;
                            سلام

                            اول فرض زیر را در نظر بگیرید :
                            lsb بیت شماره ی 0 است . پس شماره ها از صفر شروع میشوند .
                            الان اون حرفتون که گفتید بیت های 7 تا 12 با این کد گذاشتین و 6 بیت data را به راست شیفت میده در تناقضه.

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

                            1- توضیح در رابطه با کدتون:
                            یک متغییر عدصحیح data داریم ( 2 بایت)
                            که مقدارش به باینری میشه : 0b 1010 1011 1100 1101

                            حالا تو خط بعدی شما میایید تقسیمش میکنید به 64 ...
                            تقسیم به 64 مثل این میمونه که شما 6 بیت به راست شیفت بدید( توجه : 64 همون 2 به توان 6 است)

                            پس نتیجه میشه : 0b 0000 0010 1010 1111

                            حالا میریزید داخل رجیستر 1 بایتی UDR .
                            همینجا باید گفت:
                            او او ... اخطار اخطار اخطار . دارید 2 بایت رو میریزید تو یک ظرف یک بایتی.

                            خوب مشکلی نیست castش میکنیم .
                            پس میشه :
                            کد:
                            UDR = (char)(data>>6);
                            یا همون:
                            کد:
                            UDR = (char)(data/64);
                            فرقی نمیکنن این دوتا.

                            پس الان تو UDR چیه؟
                            کد:
                            UDR = 0b10101111; //UDR = 0xAF;
                            گفتید ارتباطتون 6 بیتیه؟
                            پس دو بیت بالایی ( پرارزش) در نظر گرفته نمیشه و فقط بیتهای 0b101111 فرستاده میشن.

                            سوال: این بیتها ، بیتهای شماره چنده متغییر data هستد؟
                            جواب: بیتهای شماره ی 6 تا 11 یعنی 6 و 7 و 8 و 9 و 10 و 11 هستند.

                            فهمیدید چرا گفتم حرفتون با کدتون در تناقضه؟


                            2- حالا برسیم سراغ کدی که بیت های 7 تا 12 متغییر دیتا را بفرسته.
                            خودتون باید دیگه حدس زده باشید.
                            اره به جا 6 بیت 7 بیت به راست شیفت میدیم:

                            کد:
                            UDR = (char)(data>>7);


                            راه اندازی ماژول nrf24l01p برای codevision (ارتباط بیسیم بین دو میکرو) : http://www.eca.ir/forum2/index.php?topic=78587.0
                            کوچ کردن از کدویژن به http://www.eca.ir/forum2/index.php?topic=81025.0 : AtmelStudio
                            نحوه نوشتن اصولی یک لایبرری و درایور نرم افزاری( بصورت ساده) : http://www.eca.ir/forum2/index.php?topic=81071
                            http://www.eca.ir/forum2/index.php?topic=82130.0 سفارش راه انداز ماژول های مختلف توسط اعضای انجمن
                            انشالله به زودی تاپیک ها به روز رسانی خواهد شد،

                            دیدگاه


                              پاسخ : کوچ کردن از کدویژن به AtmelStudio

                              با تشکر از توضیحتون ، ببخشید عمل تقسیم شیفت به راست نیست ؟

                              دیدگاه


                                پاسخ : کوچ کردن از کدویژن به AtmelStudio

                                نوشته اصلی توسط aseok
                                با تشکر از توضیحتون ، ببخشید عمل تقسیم شیفت به راست نیست ؟
                                بله عمل تقسیم ، همون شیفت به راست است ، تو جمله اول اشتباه نوشتم ، خواستم ویرایش کنم نتم قطع شد. البته در ادامه گفتم که شیفت به راسته ، فقط تو جمله اول سهوا اشتباه نوشته شده.
                                ممنون
                                راه اندازی ماژول nrf24l01p برای codevision (ارتباط بیسیم بین دو میکرو) : http://www.eca.ir/forum2/index.php?topic=78587.0
                                کوچ کردن از کدویژن به http://www.eca.ir/forum2/index.php?topic=81025.0 : AtmelStudio
                                نحوه نوشتن اصولی یک لایبرری و درایور نرم افزاری( بصورت ساده) : http://www.eca.ir/forum2/index.php?topic=81071
                                http://www.eca.ir/forum2/index.php?topic=82130.0 سفارش راه انداز ماژول های مختلف توسط اعضای انجمن
                                انشالله به زودی تاپیک ها به روز رسانی خواهد شد،

                                دیدگاه

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