اطلاعیه

Collapse
No announcement yet.

مشکلات ساده برنامه نویسی!!!؟؟

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

    مشکلات ساده برنامه نویسی!!!؟؟

    سلام
    در برنامه زیر قراره وقتی که کلید قرار گرفته روی PA.30 فشرده شد خروجی PB.19 ست شود.
    #include <AT91SAM7X256.H>

    int main (void)
    {
    *AT91C_PIOB_PER=0x00080000;
    *AT91C_PIOB_OER=0x00080000;
    *AT91C_PIOB_OWER=0x00080000;
    *AT91C_PIOB_ODSR=0x00000000;
    ////////////////////////////
    *AT91C_PIOA_PER=0x70000000;
    *AT91C_PIOA_ODR=0x70000000;
    *AT91C_PMC_PCER=0x70000000;
    *AT91C_PIOA_PPUER=0x70000000;
    ///////////////////////////
    while(1)
    {
    if ((~(*AT91C_PIOA_PDSR))&(1<<30) )
    *AT91C_PIOB_ODSR=0x00080000;
    else
    *AT91C_PIOB_ODSR=0X00000000;
    }

    }

    من هر کاری می کنم نمی تونم تغییر وضعیت کلید رو تو برنامه ببینم.
    یه مشکلم اینه که اول برنامه که PB.19 رو به عنوان خروجی تعریف کردم رجیستر ODSR رو هم با صفر مقدار دهی کردم ولی بعد از پروگرام کردن همچنان مقدار یک رو دارد.
    سوال بعدی اینه که : چه موقع باید کلاک I/O فعال شود و این فعال سازی چه طوریه؟
    می خواستم با مقدار دهی به رجیستر *AT91C_PMCA_PCER این کارو انجام بدم ولی با خطای تعریف نشده بودن این رجیستر رو به رو می شم و ناچار از رجیستر PMC_PCER استفاده کردم.
    خلاصه اینکه این برنامه جواب نمیده چرا؟
    در ضمن می خوام با استفاده از کتابخانه AT91SAM7X256 برنامه رو بنویسم و با تنظیم همین رجیستر هایی که تو برنامه نام بردم .
    سپاس فراوان
    همیشه بزرگوار تر از آن باشید که برنجید
    و نجیب تر از آن باشید که برنجانید!

    #2
    پاسخ : یه مشکل ساده برنامه نویسی!!!؟؟

    سلام
    این برنامه را یک تست کن ببین درست کار می کند یا نه؟
    کد:
    #include <AT91SAM7X256.H>
    
    int main (void)
    {
    *AT91C_PMC_PCER=0xC;
    ////////////////////////////
    *AT91C_PIOB_PER=0x00080000;
    *AT91C_PIOB_OER=0x00080000;
    *AT91C_PIOB_OWER=0x00080000;
    *AT91C_PIOB_ODSR=0x00000000;
    ////////////////////////////
    *AT91C_PIOA_PER=0x40000000;
    *AT91C_PIOA_ODR=0x40000000;
    *AT91C_PIOA_PPUER=0x40000000;
    ///////////////////////////
    while(1)
    {
    if (((*AT91C_PIOA_PDSR)&(1<<30))>>30)
    *AT91C_PIOB_ODSR=0x00080000;
    else
    *AT91C_PIOB_ODSR=0X00000000;
    }
    
    }

    دیدگاه


      #3
      پاسخ : یه مشکل ساده برنامه نویسی!!!؟؟

      :wow: درسته!
      سلام و سپاس.
      آقا حامد می شه مقدار دهی رجیستر PMC_PCER رو برام توضیح بدید؟ مشکل از همین رجیستر بود. :mrgreen:
      همیشه بزرگوار تر از آن باشید که برنجید
      و نجیب تر از آن باشید که برنجانید!

      دیدگاه


        #4
        پاسخ : یه مشکل ساده برنامه نویسی!!!؟؟

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

        در برنامه شما هم مقدار این قسمت درست تنظیم نشده بود هم در if اشکال داشت.

        دیدگاه


          #5
          پاسخ : یه مشکل ساده برنامه نویسی!!!؟؟

          بی نهایت سپاس گزارم :biggrin:
          ببخشید آقا حامد ،جسارته :redface: ولی شرط if مشکلی نداره، شرطی که من نوشتم و شرطی که شما نوشتید هر دو درسته. در زبان برنامه نویسی c ،یک مقدار غیر صفر true است. و شرطی که من گذاشتم رو همین حساب بوده ولی برنامه شما واضح تره :agree:
          اشکال نداره یه سوال دیگه هم بپرسم؟ :redface:
          حداکثر فرکانس نمونه برداری که از بخش adc می شه بدست آورد چقدره؟
          هر نمونه adc ده سیکل کلاک adc برای تبدیل لازم داره. حالا حداکثر فرکانس adc چقدر می تونه باشه؟
          adc سری at91sam از نوع successive approximation است و یه جا خوندم که بهترین فرکانس کاری این نوع Adc ها 75 تا 200 کیلو هرتز است، این موضوع درسته؟
          ببخشید ها!!! حالا با خودتون می گید چقدر عجله داره این!!! ولی حداکثر فرکانس نمونه برداری adc خیلی مهمه برام.فرکانس sample & hold بیشتر از 50 کیلو لازم دارم. می خوام ببینم که arm جوابگو هست یا....
          باز هم سپاس
          همیشه بزرگوار تر از آن باشید که برنجید
          و نجیب تر از آن باشید که برنجانید!

          دیدگاه


            #6
            پاسخ : یه مشکل ساده برنامه نویسی!!!؟؟

            کد:
            if ((~(*AT91C_PIOA_PDSR))&(1<<30) )
            *AT91C_PIOB_ODSR=0x00080000;
            else
            *AT91C_PIOB_ODSR=0X00000000;
            خوب این if شما می باشد. رجیستر PIO_PDSR را خوانده اید و با مقدار (30>>1) AND کرده اید. خوب بعد از AND دو احتمال وجود دارد و مقدار 0x40000000 یا 0x00000000 می شود با توجه به ورودی. درسته؟ خو حالا نتیجه T یا F می باشد. خوب شما بعد از AND کردن مکمل 1 (‍‍~) کرده اید و مقادیر 0xBFFFFFFF یا 0xFFFFFFFF می شود و طبق گفته خودتان "در زبان برنامه نویسی c ،یک مقدار غیر صفر true است." و شرط if شما همیشه T هست و هیچ زمان F نمی شود. درسته؟ این اشکال if شما بود.

            در مورد ADC رجیستر ADC_MR در دیتاشیت را ببین یک سری فرمول دارد که طبق فرمول ها حداکثر کلاک ADC را می توانید برابر MCK/2 در نظر بگیرید. و برای sample&hold هم فرمولی دارد که می توانید این زمان را تنظیم کنید که وابسته به کلاک ADC می باشد. همچنین یک زمان برای startup می باشد که این زمان هم وابسته به کلاک ADC می باشد. کلاک ADC تون هم وابسته به MCK می باشد که باید ببینید فرکانس میکرو را روی چه مقدار تنظیم کرده اید. و با بررسی فرمول ها و نوشتن برنامه و تست آن ببینید جواب کارتون را می دهد یا نه؟

            در سایت اتمل (ADC Speed (ksps را برای سری 7S , 7X برابر 384 گفته است.

            http://www.atmel.com/dyn/products/param_table.asp?category_id=163&family_id=605& amp;subfamily_id=1586

            http://www.atmel.com/dyn/products/param_table.asp?category_id=163&family_id=605& amp;subfamily_id=1724

            دیدگاه


              #7
              پاسخ : یه مشکل ساده برنامه نویسی!!!؟؟

              سلام به همه و خصوصا آقا حامد
              یه سوال پیش اومده برام و اونم اینه که وقتی می خواهیم خودمون یه کتابخانه بنویسیم کلا چه دستوراتی رو لازم داریم:
              یه سری از دستوراتی که در کتابخانه lcd دیدم اینا بودن:
              #ifndef lcd_INCLUDED_
              #define lcd_INCLUDED_
              و در آخر کتابخانه هم #endif ،اینا رو توی مجله pmm نوشته و گفته که برای جلوگیری از باز شدن متعدد این کتابخانه توسط سایر هدر ها و سورس فایل ها در یک پروژه در اول و آخر کتابخانه نوشته می شوند.
              یه سری از دستورات مثل #ifdef LCD_PORT_A هم هست که معلومه که می خواد بگه که اگه پورت a برای اتصال lcd انتخاب شده بود یه سری از تنظیمات رو انجام بده. من می خوام شکل کلی این دستور رو بدونم. وهمچنین اگه دستورات دیگه ای از این تیپ وجود داره. یعنی دستوراتی که بین سورس فایل و هدر ارتباط برقرار می کنن کدومان؟در مورد دستور اخیر پورت مربوطه توی سورس فایلی که کتابخانه lcd اضافه شده تعریف میشه!!
              امیدوارم منظورمو رسونده باشم.
              کلا اگه متوجه منظورم نشدید اگه می تونید در مورد نحوه نگارش هدر فایل ها راهنمائی ام کنید.
              بی نهایت سپاس :biggrin:
              همیشه بزرگوار تر از آن باشید که برنجید
              و نجیب تر از آن باشید که برنجانید!

              دیدگاه


                #8
                پاسخ : یه مشکل ساده برنامه نویسی!!!؟؟

                سلام
                برای نوشتن یک کتابخانه یا هدر فایل یک فایل .h و یک فایل .c نیاز دارید که فایل .h را در برنامه #include می کنید و فایل .c را هم به پروژه خود اضافه می کنید. هدر LCD که پیوست کردم برای کتاب AT91 می باشد. این هدر رو ببین متوجه می شوید که به چه صورت باید هدر فایل خود را بسازید. در فایل .h باید توابعی که می خواهید در main خود استفاده کنید را مشخص نمایید و در فایل .c بدنه توایع را می نویسید. در .c شاید توابعی باشد که نیاز نباشد که در main استفاده کنید پس نیازی نیست این توابع را در .h مشخص کنید این توایع را فقط در خود .c استفاده می کنید. فقط باید دقت داشته باشید که این توابع را در .c بالاتر از توابعی که می خواهند آنها را فراخوانی کنند بنویسید.
                فایل های پیوست شده

                دیدگاه


                  #9
                  سوالی از هدر lcd

                  نوشته اصلی توسط حامد AT91
                  سلام
                  در .c شاید توابعی باشد که نیاز نباشد که در main استفاده کنید پس نیازی نیست این توابع را در .h مشخص کنید این توایع را فقط در خود .c استفاده می کنید. فقط باید دقت داشته باشید که این توابع را در .c بالاتر از توابعی که می خواهند آنها را فراخوانی کنند بنویسید.
                  با سلام ....

                  با تشکر از پاسختون ....

                  الان داخل همین فایلی که گذاتید تابع lcd_delay_us در c. هست ولی در h. نیست .... خوب اساسا هر تابعی که بخوایم فرخوانی کنیم رو داخل h. مینوسیم ....اما خوب وقتی تابعی قرار نیست اصلا داخل برنامه فراخوانی بشه چه لزومی داره که داخل c. نوشته بشه ؟؟؟

                  جدای این حرف ها همون تابع lcd_delay_us چی کار میکنه ؟ میدونم تاخیر میکرو ثانیه ای ایجاد میکنه ولی چرا حالا تاخیرش رو با یه رجیستر وضعیت درست کرده دلیل خاصی داشته ؟؟ یعنی ممکن زمان این جوری دقیق تر باشه ؟؟؟ اصلا این تاخیر رو برای کجا استفاده میشه ؟؟؟

                  مصادیق اظهار محبت به همسر
                  بررسی مسائل جنسی در زندگی زناشویی(فایل صوتی)
                  ویژگی های خانواده سالم - مصادیق احترام (فایل صوتی)
                  اثر قصه گویی برای کودکان

                  دیدگاه


                    #10
                    پاسخ : سوالی از هدر lcd

                    نوشته اصلی توسط _مریم زارع _
                    با سلام ....

                    با تشکر از پاسختون ....

                    الان داخل همین فایلی که گذاتید تابع lcd_delay_us در c. هست ولی در h. نیست .... خوب اساسا هر تابعی که بخوایم فرخوانی کنیم رو داخل h. مینوسیم ....اما خوب وقتی تابعی قرار نیست اصلا داخل برنامه فراخوانی بشه چه لزومی داره که داخل c. نوشته بشه ؟؟؟

                    جدای این حرف ها همون تابع lcd_delay_us چی کار میکنه ؟ میدونم تاخیر میکرو ثانیه ای ایجاد میکنه ولی چرا حالا تاخیرش رو با یه رجیستر وضعیت درست کرده دلیل خاصی داشته ؟؟ یعنی ممکن زمان این جوری دقیق تر باشه ؟؟؟ اصلا این تاخیر رو برای کجا استفاده میشه ؟؟؟
                    سلام
                    خوب مثلا همین تابع تاخیر در توابع دیگری که در .c هست استفاده می شود بخاطر همین در .c وجود دارد اما در .h نیست چون نیازی نیست که در تابع main این تابع فراخوانی شود و این تابع فقط در .c فراخوانی می شود تا کار توابع دیگر در .c را کامل کند.
                    این تاخیرهایی که با for نوشته می شود اصلا دقیق نیستند از این تاخیر برای لچ کردن اطلاعات در lcd استفاده می شود که فکر کنم در حد چند صد نانو ثانیه است حالا با این تاخیر مثلا اگر 1 میکرو ثانیه بشود 5 میکرو ثانیه زیاد فرقی ندارد و کار درست انجام می شود و تاخیر های دقیق را اصلا نباید با for نوشت و باید حتما با تایمر نوشت که دقیق کار کند. علت اینکه در حلقه for یک رجیستر را خوانده ایم به طور خلاصه این می باشد که اگر آن خواندن رجیستر را حذف کنیم کامپایلر در کد ایجاد شده در ورژن های جدید IAR آن for را به درستی ایجاد نمی کند و یک کد بهینه شده را جایگزین می کند مثلا اگر قرار است متغییر i تا 1000 بشمارد و در این مدت شمارش هیچ کار خاصی در for انجام نمی شود کامپایلر می داند که بعد از for متغییر i باید مقدار 1000 را داشته باشد پس می آید بجای اینکه تا 1000 بشمارد و متغییر i را به 1000 برساند از یک خط برنامه استفاده می کند و متغییر i را برابر 1000 قرار می دهد و اصلا اون مدت تاخیر انجام نمی شود. باز اگر این مورد آخری را بد توضیح دادم تایپیک زیر را ببین بهتر متوجه می شوید.
                    http://www.eca.ir/forum2/index.php?topic=47811.0

                    دیدگاه


                      #11
                      پاسخ : سوالی از هدر lcd

                      نوشته اصلی توسط حامد AT91
                      علت اینکه در حلقه for یک رجیستر را خوانده ایم به طور خلاصه این می باشد که اگر آن خواندن رجیستر را حذف کنیم کامپایلر در کد ایجاد شده در ورژن های جدید IAR آن for را به درستی ایجاد نمی کند و یک کد بهینه شده را جایگزین می کند مثلا اگر قرار است متغییر i تا 1000 بشمارد و در این مدت شمارش هیچ کار خاصی در for انجام نمی شود کامپایلر می داند که بعد از for متغییر i باید مقدار 1000 را داشته باشد پس می آید بجای اینکه تا 1000 بشمارد و متغییر i را به 1000 برساند از یک خط برنامه استفاده می کند و متغییر i را برابر 1000 قرار می دهد و اصلا اون مدت تاخیر انجام نمی شود. باز اگر این مورد آخری را بد توضیح دادم تایپیک زیر را ببین بهتر متوجه می شوید.
                      http://www.eca.ir/forum2/index.php?topic=47811.0
                      سلام
                      آقا حامد این موضوع در مورد کامپایلر keil هم صادقه؟
                      من سعی کردم کتابخانه راه اندازی lcd به صورت 8 بیت رو برای کامپایلر keil بنوسیم،جواب داد. فقط چند تا سوال پیش اومده که امیدوارم زیاد نباشند!! :mrgreen:
                      اول از همه اینکه آیا می تونیم کل توابع lcd رو در همان هدر تعریف کنیم و بدنه آن ها رو هم همانجا بنویسیم؟(البته من اینکار رو کردم و جواب داد)چرا شما فرمودید یه فایل .c لازمه و یه فایل .h؟ منظور از این .c همون سورسی که شامل همه برنامه های مورد نیاز کاربر است؟این که به درد نخوره برای دفعات بعد باید کل توابع رو توی سورسمون کپی کنیم!!
                      اگر نه، منظور اینه که پروژه ما دو تا سورس فایل داره؟(اینطوری خطا میده و خطاش هم به این حاطره که هدر فایل نمی تونه .c خودشو بخونه! راهی وجود داره؟)

                      و اما مشکل بعدی یا تابع lcd_puts است تابعی که من نوشتم به جز اینکه نام متغیر هاش با تابعی که در هدر شما بود فرق می کنه تفاوت دیگه ای نداره ولی جواب نمی ده!!! در صورتی که تابع هدر شما جواب میده:

                      :sad:
                      این برنامه رو در نظر بگیرید:
                      char *str;
                      *str="arm";
                      lcd_putsf(str);
                      سوالم اینه که چرا برای رشته از اشاره گر استفاده شده، مزیتش چیه؟
                      حالا اگر از اشاره گر استفاده نکنیم و بنویسیم str="arm" دستور lcd_puts(str) چی باید نشون میده؟ خب البته عملا تست کردم و هر دو یه چیز رو نمایش میده و منم مشکلم دقیقا همین جاست!!!! :surprised:
                      تعریف تابع lcd_putsf اینه:
                      void lcd_putsf(char *str)
                      خب وفتی که به صورت حالت اول (استفاده از اشاره گر برای رشته)این تابع رو استفاده می کنیم قانونا نباید مشکلی باشه.
                      ولی در حالت دوم(استفاده نکردن از اشاره گر) من فکر می کنم باید یه مشکلی پیش بیاد چرا نمی یاد!!!! :surprised:

                      شرمنده که زیاد نوشتم :redface:
                      بی نهایت سپاس گزار و ممنونم :mrgreen:

                      همیشه بزرگوار تر از آن باشید که برنجید
                      و نجیب تر از آن باشید که برنجانید!

                      دیدگاه


                        #12
                        پاسخ : سوالی از هدر lcd

                        نوشته اصلی توسط جعفری
                        سلام
                        آقا حامد این موضوع در مورد کامپایلر keil هم صادقه؟
                        سلام
                        نمی دونم چون من اصلا با keil برای ARM برنامه نمی نویسم.

                        من سعی کردم کتابخانه راه اندازی lcd به صورت 8 بیت رو برای کامپایلر keil بنوسیم،جواب داد. فقط چند تا سوال پیش اومده که امیدوارم زیاد نباشند!! :mrgreen:
                        اول از همه اینکه آیا می تونیم کل توابع lcd رو در همان هدر تعریف کنیم و بدنه آن ها رو هم همانجا بنویسیم؟(البته من اینکار رو کردم و جواب داد)چرا شما فرمودید یه فایل .c لازمه و یه فایل .h؟ منظور از این .c همون سورسی که شامل همه برنامه های مورد نیاز کاربر است؟این که به درد نخوره برای دفعات بعد باید کل توابع رو توی سورسمون کپی کنیم!!
                        اگر نه، منظور اینه که پروژه ما دو تا سورس فایل داره؟(اینطوری خطا میده و خطاش هم به این حاطره که هدر فایل نمی تونه .c خودشو بخونه! راهی وجود داره؟)
                        شما از همین کتابخانه هم می توانید در keil استفاده کنید. آره می توان کل توابع را در .h نوشت اما اگر بدنه توابع در .c باشد بهتر است و حرفه ای تر. من بسیاری از کتابخانه ها رو دیدم که یک .h و یک .c دارند. اگر همه توابع را در .h بنویسید آنگاه توابعی که نباید در سورس اصلی قابل دسترس باشد در دسترس قرار می گیرد. منظور از .c همون سورس یا فایل .c که برنامه اصلی و main داخلش هست نیست. مثلا برای lcd یک فایل lcd.h و یک فایل lcd.c هست و برنامه اصلی و تابع main در فایل test.c می باشد. مشکلی هم نداره من حتی برای کتابخانه هایی که برای AVR در CV می نویسم هم به همین صورت است. شما می توانید هر چند تا فایل .c را که می خواهید به پروژه خود اضافه کنید فقط باید هر کدام یک .h هم داشته باشد که بتواند لینک ها را بدرستی کامپایلر تشخیص دهد. فقط سورس اصلی یک .c هست و .h ندارد. و در تمام فایل های .c باید فقط یک تابع به نام main باشد و این تابع باید در سورس اصلی باشد.

                        و اما مشکل بعدی یا تابع lcd_puts است تابعی که من نوشتم به جز اینکه نام متغیر هاش با تابعی که در هدر شما بود فرق می کنه تفاوت دیگه ای نداره ولی جواب نمی ده!!! در صورتی که تابع هدر شما جواب میده:
                        این قسمت برنامه را ببین چند قسمت را تغییر دادی که به درستی انجام نشده و اشکال دارد.(str ها)
                        کد:
                            do
                            {
                            str='0'+num%10;
                            num=num/10;
                            i++;
                           
                            } while(num!=0);
                           
                            for(j=0;j<=(i-1)/2;j++)
                            {ch=str[j];
                            str[j]=str[j-i-1];
                            str[j-i-1]=ch;
                            }
                            str='\0';

                        این برنامه رو در نظر بگیرید:
                        char *str;
                        *str="arm";
                        lcd_putsf(str);
                        سوالم اینه که چرا برای رشته از اشاره گر استفاده شده، مزیتش چیه؟
                        حالا اگر از اشاره گر استفاده نکنیم و بنویسیم str="arm" دستور lcd_puts(str) چی باید نشون میده؟ خب البته عملا تست کردم و هر دو یه چیز رو نمایش میده و منم مشکلم دقیقا همین جاست!!!! :surprised:
                        تعریف تابع lcd_putsf اینه:
                        void lcd_putsf(char *str)
                        خب وفتی که به صورت حالت اول (استفاده از اشاره گر برای رشته)این تابع رو استفاده می کنیم قانونا نباید مشکلی باشه.
                        ولی در حالت دوم(استفاده نکردن از اشاره گر) من فکر می کنم باید یه مشکلی پیش بیاد چرا نمی یاد!!!! :surprised:
                        در IAR کد زیر را خطا می دهد.

                        کد:
                        char *str;
                        *str="arm";
                        lcd_putsf(str);
                        و بایدبه صورت زیر استفاده شود.
                        کد:
                        char *str;
                        str="arm";
                        lcd_putsf(str);
                        در مورد اینکه چرا از اشاره گر استفاده شده این می باشد که دسترسی به آن راحتتر می باشد و با هر تعداد کاراکتر می تواند کار کند و مشکلی ندارد و تعداد کارکترها ثابت نمی باشد.

                        دیدگاه


                          #13
                          پاسخ : مشکلات ساده برنامه نویسی!!!؟؟

                          سلام
                          خب الحمدالله مشکلم با داشتن چند تا سورس حل شد. :biggrin:
                          اینکه کتابخانه ای که شما فرستادید در keil هم می تونه استفاده بشه رو تست کردم فقط لازم بود هدر میکرو عوض بشه و این خیلی برام جالب بود!!
                          من فکر می کردم دسترسی به رجیسترها مثل AT91C_BASE_PIO->PIO_SODR فقط در کامپایلر IAR تعریف شده ولی دز کمال تعجب دیدم که Keil هم اینا رو میشناسه!! من در کیل برای همین رجیستر از *AT91C_PIO_SODR استفاده می کردم، با این حساب تفاوت این دو کمپایلر از نظر برنامه نویسی چی می تونه باشه؟
                          یه سوال خیلی مسخره در رجیستر AT91C_BASE_PIO->PIO_SODR این علامت <- چیه؟ در زبان c همچین چیزی داریم یا از پیشفرض های کامپایلر است؟
                          در مورد تاخیر با حلقه های FOR باید بگم که امتحان کردم و یه حلقه FOR بدون اینکه کار خاصی انجام بده هم تاخیر رو ایجاد می کنه البته دقیق نیست. یعنی به گمونم قضیه بهینه کردن کد در KEIL منتفیه! احتمالا از این نظر IAR برتری داره :agree:
                          نوشته اصلی توسط حامد AT91

                          این قسمت برنامه را ببین چند قسمت را تغییر دادی که به درستی انجام نشده و اشکال دارد.(str ها)
                          کد:
                              do
                              {
                              str='0'+num%10;
                              num=num/10;
                              i++;
                             
                              } while(num!=0);
                             
                              for(j=0;j<=(i-1)/2;j++)
                              {ch=str[j];
                              str[j]=str[j-i-1];
                              str[j-i-1]=ch;
                              }
                              str[i]='\0';
                          این قسمت رو هم هر چی مقایسه کردم فرقی ندیدم، oo:از نظر ظاهری فرق دارند و کارشون در نهایت یه چیزه به نظر من!!یه شرط WHILE فرق می کنه که من نوشتم تا زمانی که NUM مخالف صفر است با علم به اینکه اعداد منفی در ابتدای تابع مثبت می شوند پس این شرط معادل با NUM>0 است.
                          و اینکه شمارنده حلقه DO_WHILE رو من خارج از اندیس دهی رشته اضافه کردم و هدر شما در همون اندیس رشته یه واحد اضافه کرده و به نظر میاد که اینا نباید فرقی داشته باشند....
                          به هر حال از هدر خودم صرف نظر کردم و از هدر شما استفاده کردم فقط می خواستم اگه یه موقع لازم شد خودم هدر بنویسم کلیات و بدونم که به لطف شما دونستم. :biggrin:
                          نوشته اصلی توسط حامد AT91

                          و بایدبه صورت زیر استفاده شود.
                          کد:
                          char *str;
                          str="arm";
                          lcd_putsf(str);
                          این مورد و چک کردم و دقیقا KEIL هم همینطور بود(در یه حالت خطا میده البته با هدر شما!) اما دیشب هدر خودم هر دو رو قبول می کرد که به گمونم مشکل از هدر خودمه احتمالا جوری نوشتم که....
                          اما آقا حامد شرمنده!!! من با این سه خط که هم KEIL و هم IAR قبولش دارن مشکل دارم:
                          و قتی که من STR رو اشاره گر تعریف می کنم و رشته ARM رو به صورت بالا توش می ریزم این رشته به صورت عددی در مبنای هگز درون STR ذخیره می شه حالا وقتی LCD_PUTSF رو اجرا می کنم این دستور باید مقداری رو که در آدرس قرار گرفته در STR هست رو چاپ کنه مگه نه؟؟ این مشکل نیست؟
                          می شه عملکرد این سه خط رو دقیق برام بگید اینکه در هر متغیر چی ذخیره شده و تابع چطور عمل می کنه؟
                          ببخشید که هر بار n تا سوال یه جا می پرسم :redface:
                          مریم مدیونی اگه جواب سوالام رو بدونی و جواب ندی!! اگه بلدی تو جواب بده تا آقا حامد یه نفسی تازه کنه!!
                          سپاس فراوان
                          همیشه بزرگوار تر از آن باشید که برنجید
                          و نجیب تر از آن باشید که برنجانید!

                          دیدگاه


                            #14
                            پاسخ : مشکلات ساده برنامه نویسی!!!؟؟

                            نوشته اصلی توسط جعفری
                            سلام
                            خب الحمدالله مشکلم با داشتن چند تا سورس حل شد. :biggrin:
                            اینکه کتابخانه ای که شما فرستادید در keil هم می تونه استفاده بشه رو تست کردم فقط لازم بود هدر میکرو عوض بشه و این خیلی برام جالب بود!!
                            من فکر می کردم دسترسی به رجیسترها مثل AT91C_BASE_PIO->PIO_SODR فقط در کامپایلر IAR تعریف شده ولی دز کمال تعجب دیدم که Keil هم اینا رو میشناسه!! من در کیل برای همین رجیستر از *AT91C_PIO_SODR استفاده می کردم، با این حساب تفاوت این دو کمپایلر از نظر برنامه نویسی چی می تونه باشه؟
                            یه سوال خیلی مسخره در رجیستر AT91C_BASE_PIO->PIO_SODR این علامت <- چیه؟ در زبان c همچین چیزی داریم یا از پیشفرض های کامپایلر است؟
                            سلام
                            اسم هدرها فقط در keil و IAR فرق می کند و کل برنامه یکسان است یعنی اگر برنامه ای را با IAR بنویسید به راحتی می توانید در keil استفاده نمایید و بالعکس. مثلا همین رجیستر به صورت *AT91C_PIO_SODR هم در IAR قابل دسترس می باشد. اما نام توابع روتین وقفه در IAR هر نامی می تواند داشته باشد اما در keil فکر کنم باید با irq__ شروع شود.
                            (<-) این علامت برای دسترسی به ساختار می باشد که در این روش رجیسترهای هر واحد در یک ساختار قرار دارند که این نام ساختار آدرس پایه آن واحد را نشان می دهد و نام رجیستر آدرس افست را مشخص می کند و مجموع این دو آدرس، ادرس مستقیم رجیستر می شود.
                            نوشته اصلی توسط جعفری
                            در مورد تاخیر با حلقه های FOR باید بگم که امتحان کردم و یه حلقه FOR بدون اینکه کار خاصی انجام بده هم تاخیر رو ایجاد می کنه البته دقیق نیست. یعنی به گمونم قضیه بهینه کردن کد در KEIL منتفیه! احتمالا از این نظر IAR برتری داره
                            این یکی از مزیت های IAR نسبت به keil می باشد به خاطر همین چیزها است که می شود گفت IAR حرفه ای تر است.
                            اما آقا حامد شرمنده!!! من با این سه خط که هم KEIL و هم IAR قبولش دارن مشکل دارم:
                            و قتی که من STR رو اشاره گر تعریف می کنم و رشته ARM رو به صورت بالا توش می ریزم این رشته به صورت عددی در مبنای هگز درون STR ذخیره می شه حالا وقتی LCD_PUTSF رو اجرا می کنم این دستور باید مقداری رو که در آدرس قرار گرفته در STR هست رو چاپ کنه مگه نه؟؟ این مشکل نیست؟
                            می شه عملکرد این سه خط رو دقیق برام بگید اینکه در هر متغیر چی ذخیره شده و تابع چطور عمل می کنه؟
                            خوب ببین خط اول یک متغییر اشاره گر از نوع char تعریف کردیم و چون آدرس اشاره گر را مشخص نکرده ایم کامپایلر یک آدرس از فضای RAM را به صورت خودکار برای آن در نظر میگیرد. فرض کنید کامپایلر آدرس 1000 را برای اشاره گر در نظر میگیرد.
                            خوب در خط دوم کد اسکی حرف a را در آدرس 1000 قرار می دهد و کد اسکی حرف r را در آدرس 1001 قرار می دهد و همچنین کد اسکی حرف m را در آدرس 1002 قرار می دهد.
                            در خط سوم آدرس 1000 (str) را به عنوان ورودی به تابع معرفی می کنیم.
                            اگر در روتین تابع هم ببینید در روتین تابع می آید و از آدرس 1000 (str) شروع می کند و داده ها را بر می دارد و به lcd ارسال می کند. و بعد از ارسال به lcd آدرس 1000 (str) را یک واحد افزایش می دهد و اگر به پایان متن نرسیده باشد دوباره آنرا به lcd ارسال می کند و ... تا به پایان متن برسد.

                            دیدگاه


                              #15
                              پاسخ : مشکلات ساده برنامه نویسی!!!؟؟

                              سلامی دوباره
                              نگاهی به سایت اتمل داشتم و مشخصات خانواده های مختلف رو می خوندم که سوالی برام پیش اومد:
                              برای سری sam3u نوشته بود که: glcd , semgment lcd ندارن؟؟
                              این یعنی چی؟ منظور اینه اصلا با این سری نمی شه از glcd استفاده کرد؟؟ oo: مگه وقتی کتابخانه glcd رو داشته باشیم نمی تونیم سری های مختلف رو راه اندازی کنیم؟
                              با سپاس
                              همیشه بزرگوار تر از آن باشید که برنجید
                              و نجیب تر از آن باشید که برنجانید!

                              دیدگاه

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