اطلاعیه

Collapse
No announcement yet.

mikro basic

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

    mikro basic

    با عرض سلام
    از دوستانی که با این کمپایلر کار کردن کسی میتونه راهنمایی که چطور میشه یک بایت ویا یک بیت از یک متغیر رو کپی کرد.داخل pic basicبا symbol.byte0 or
    variable.bit5به راحتی انجام میشد ولی اینجا کمپایلر اجازه این کار رو نمیده
    و سوال دیگه اینگه ارایه ایی که به صورت عدد داخل پرانتز استفاده میشه چه کاربردی دارند؟ WORD[12],BYTE[15]

    #2
    پاسخ : mikro basic

    با سلام
    دوست عزیز اول از همه باید بگم از Help نرم افزار کمال استفاده رو بکن چوت توی اون کامل توضیح داده
    و بعد به این ترتیب می تونی متغییر بیتی تعریف کنی
    کد:
    dim bf as bit ' bit variable
    dim Abit as sbit at PORTB.0 ' this is where Abit is fully defined
    dim MyVar as byte
    dim Abit as sbit at MyVar.0 ' this is where Abit is fully defined
    در مورد آرایه ها:
    گاهی لازم میشه یه تعداد زیادی مثلا 1000 خونه از حافظه رو استفاده کنی و اطلاعات توش بریزی مثلا برای کار با رم های SD باید 512 بایت رو یهدفعه بخونی یا مثلا می خوای یه عکس بزرگ رو روی ال سی دی نشون بدی و باید اطلاعات عکس رو توی مثلا10000 بایت متغییر به ال سی دی بدی. ما که نمی تونیم بیایم 10000 تا متغییر با اسم های مختلف بسازیم و با اونا کار کنیم. برای همین میان یه متغییر با یه اسم ثابت تعریف می کنن ولی با طول مشخص.شما فرض کن یه متغییر بایتی یه دونه تسبیح هست حالا شما از همون متغییر به تعداد 100 تا برای کاری نیاز داری. میای یه دون کروشه میزاری و توش می نویسی 100 مثل [100] حالا شما به تعداد 100 تا متغییر داری با اسم های یکسان ولی شماره های مختلف. و به تک تک اونا می تونی مقدار بدی.
    به این مثال توجه کن:
    کد:
    dim data as byte[256]
    dim i as byte
    data[0]=0
    اولین شماره متغییر رو صفر می کنه
    data[100]=100
    صدمین شمارو مقدار 100میده
    for i=0 to 255
    data[i]=0
    next i
    توی حلقه بالایی تمامی 256 متغییر رو صفر میکنه
    for i=0 to 255
    data[i]=i
    next i
    توی حلقه بالا به هر کدوم از متغییر ها مقدار شماره خودشون رو میده
    کلا آرایه ها خیلی پر کاربردند.یه سرچ کوچولو بزنی کلی مطلب گیرت میاد.
    مثلا http://fa.wikipedia.org/wiki/%D8%A2%...D8%AF%D9%87%29
    موفق باشی :bye
    یا علی ع


    [glow=black,2,300]بردی جالب با سیستم عاملی جالب !!![/glow]

    دیدگاه


      #3
      پاسخ : mikro basic

      خیلی ممنون پاسختون خیلی جامع بود
      در مورد سوال اولم یه دستور خیلی ساده پیدا کردم که خالی از لطف نیست که بقیه دوستان(نیازمند)نیز استفاده کنن
      به عنوان مثال برای ریختن 8 بیت بالایی کلمه ی DOWN از دستور زیر استفاده می کنیم.
      PORTB=WORD(DOWN>>8) 0

      دیدگاه


        #4
        پاسخ : mikro basic

        خواهش میکنم
        برای این کار هم به روش شما میشه عمل کرد و هم از توابع خود کامپایلر استفاده کرد:
        کد:
        Lo
        ------------------------
        d = 0x12345678 	
        tmp = Lo(d) ' Equals 0x78
        *************************************************************
        Hi
        ---------------------
        d = 0x12345678 	
        tmp = Hi(d) ' Equals 0x56
        *************************************************************
        Higher
        ----------------------
        d = 0x12345678
        tmp = Higher(d) ' Equals 0x34
        *************************************************************
        Highest
        ----------------------
        d = 0x12345678 	
        tmp = Highest(d) ' Equals 0x12
        *************************************************************
        LoWord
        ----------------------
        d = 0x12345678 	
        tmp = LoWord(d) ' Equals 0x5678
        ************************************************************
        HiWord
        ----------------------
        d = 0x12345678 	
        tmp = HiWord(d) ' Equals 0x1234

        [glow=black,2,300]بردی جالب با سیستم عاملی جالب !!![/glow]

        دیدگاه


          #5
          پاسخ : mikro basic

          چند تا سوال برام پیش اومده اگه کسی بتونه راهنمایی کنه واقعا ممنون میشم.
          1.چطور میشه زمان طی شده یک سیکل رو اندازه گیری کرد؟مثلا زمانی که برای یک کریستال 4 طول میکشه حدود 1 میکرو ثانیه است ولی خب اگه برنامه سنگین باشه چی؟ میشه زمانی که طول کشیده رو محاسبه کرد.؟حجم RAM چه تاثیری روی سرعت داره؟
          2-اگه یه متغیر 32 بیتی تعریف کنیم ولی داخل اون اطلاعاتی لود نکنیم با زمانی که اطلاعات روی اون لود کردیم واسه حجم RAM فرقی هم میکنه؟
          3-برای اتصال شستی به میکرو بدون اینکه نویز پذیر هم باشه از چه دستوری میشه استفاده کردم ؟از دستور BUTTON استفاده کردم ،از نظر نویز پذیری عالی بود ولی تاخیز زمانی که ایجاد میکنه جالب نیست.از دستورات دیگه هم استفاده کردم ولی ورودی ام به شدت نویز پذیر میشه.

          دیدگاه


            #6
            پاسخ : mikro basic

            1.چطور میشه زمان طی شده یک سیکل رو اندازه گیری کرد؟مثلا زمانی که برای یک کریستال 4 طول میکشه حدود 1 میکرو ثانیه است ولی خب اگه برنامه سنگین باشه چی؟ میشه زمانی که طول کشیده رو محاسبه کرد.؟حجم RAM چه تاثیری روی سرعت داره؟
            ببین دوست من میکرو کنترلر یکسری دستورات اسمبلی داره.بسته به میکرو فرق داره ولی حدود 83 تاست حداکثر
            اکثر اونا توی یک سیکل کاری cpu اجرا میشه (یعنی فرکانس کریستال تقسیم بر چهار) ولی بعضی از اونا توی دو و حتی سه سیکل اجرا میشن مثل دستورات پرش که دو سیکلی هستند یا پرش شرطی که گاهی یک و گاهی دو و گاهی سه سیکلی هستند.
            برای اندازه گیری زمان دقیق باید تعداد دستورات اسمبلی مورد نظر رو بشماری و بسته به اینکه یک دو و یا سه سیکلی هستند زمان دقیق یه تیکه کد رو محاسبه کنی.(برای کدهای سنگین کار سختی هست) میتونی از Debuger خود کامپایلر هم استفاده کنید ولی معمولا وقتی منتظر یه اتفاق خارجی مثل کلید هستید دیباگر اذیت می کنه و جالب نیست!
            حجم رم هیچ ربطی به سرعت اجرای برنامه ها نداره ولی اگر رم بیشتر باشه میتونی برنامه رو راحتتر و بهتر بنویسی اینجوری سرعت برنامه بالا میره ولی در کل سرعت اجرای هر دستور اسمبلی فقط و فقط به سرعت کریستال بستگی داره.
            2-اگه یه متغیر 32 بیتی تعریف کنیم ولی داخل اون اطلاعاتی لود نکنیم با زمانی که اطلاعات روی اون لود کردیم واسه حجم RAM فرقی هم میکنه؟
            توی میکرو ها یا یه متغییر داریم یا نداریم
            حالا شما یه متغییر بزرگ تعریف کردی
            اگر بهینه ساز کامپایلر فعال باشه و توی برنامه از متغییر استفاده بشه که رم اشغال شده واگر استفاده نشه بهینه ساز اتوماتیک میاد متغییر رو حذف میکنه انگار اصلا متغییر رو تعریف نکردی(این گاهی مشکل ساز میشه)
            و اگر بهینه ساز غیر فعال باشه شما متغییر که تعریف میکنی رم هم اشغال میشه
            3-برای اتصال شستی به میکرو بدون اینکه نویز پذیر هم باشه از چه دستوری میشه استفاده کردم ؟از دستور BUTTON استفاده کردم ،از نظر نویز پذیری عالی بود ولی تاخیز زمانی که ایجاد میکنه جالب نیست.از دستورات دیگه هم استفاده کردم ولی ورودی ام به شدت نویز پذیر میشه.
            مجبور نیستیم حتما از دستورات کامپایلر استفاده کنیم که وقت رو تلف کنه یا اونجوری که می خوایم عمل نکنه! بسته به کاربرد خودمون می تونیم الگوریتم بهتری بنویسیم!
            موفق باشی
            :bye

            [glow=black,2,300]بردی جالب با سیستم عاملی جالب !!![/glow]

            دیدگاه


              #7
              پاسخ : mikro basic

              این بهینه سازی که بهش اشاره کردین چطور فعال میشه؟ یه سوال دیگه برام ژیش اومده ،اینکه تو یه برنامه عدد اعشاری تعریف کردم ولی مقدار اعداد بعد از اعشار حدود 6 رقمه که واسه کار من خیلی زیاده ،حدود 3 رقم هم کافیه ،میشه کمش کرد؟

              دیدگاه


                #8
                پاسخ : mikro basic

                بهینه ساز بطور پیشفرض فعاله و برای دستکارش باید بری TOOLS/options/output stting و قسمت optimization level هرچی بیشتر باشه بهینه سازی بیشتره ولی در عمل خیلی با هم فرق نمی کنه (شاید توی کدهای بزرک فرق زیادی کنه؟!)
                برای تبدیل عدد به کاراکتر قابل نمایش روی ال سی دی کامپایلر یکسری تابع داره
                برای نوع float داریم
                کد:
                sub procedure FloatToStr(dim input as real, dim byref output as string[23])
                *************************************************************************************************
                dim ff1, ff2, ff3 as real
                  txt as string[23]
                 ... 
                 ff1 = -374.2
                 ff2 = 123.456789
                 ff3 = 0.000001234
                
                 FloatToStr(ff1, txt) ' txt is "-374.2"
                 FloatToStr(ff2, txt) ' txt is "123.4567"
                 FloatToStr(ff3, txt) ' txt is "1.234e-6"
                این تابع عدد اعشاری رو توی یه رشته 23 بایتی میریزه بطور کامل
                حالا اگه شما نمی خای همشو بیا یه متغییر رشته ای کوچیکتر تعریف کن بطول مثلا 6 تا و 6تا کاراکتر اول رو بریز توش :NO:
                موفق باشی :bye

                [glow=black,2,300]بردی جالب با سیستم عاملی جالب !!![/glow]

                دیدگاه


                  #9
                  پاسخ : mikro basic

                  من تو برنامه یه متغیر float تعریف کردم حالا بعد از محاسبه یک عددی مثلا 20.54879به من میده که خیلی زیاده و من فقط می خوام این عدد بشه 20.54و سه رقم دیگه حذف بشه همین ؟(کد های تبدیل رو گذاشتم الان برنامه رو هم با پروتئوس شبیه سازی کردم مشکلی نداره منتهی فقط ...)

                  دیدگاه


                    #10
                    پاسخ : mikro basic

                    مثل اینکه پست قبلی رو با دقت نخوندی؟
                    حالا اگه شما نمی خای همشو بیا یه متغییر رشته ای کوچیکتر تعریف کن بطول مثلا 6 تا و 6تا کاراکتر اول رو بریز توش :NO:
                    بیا و یه متغییر رشته ای به طول مثلا 6 بساز و عددی رو که تبدیل به رشته 23 بایتی کردی فقط 6 بایت اول رو بریز توی متغییر رشته ای کوچیکتر . اینجوری اضافی حذف می شه
                    کد:
                    dim t as float
                    dim text23 as string[23]
                    dim text6 as string[6]
                    t=20.12345678999584522
                    floattostr(t,text23)
                    الان تبدیل به رشته شد
                    ''''text23="20.12345678999584522"
                    for i=0 to 5
                    text6[i]=text23[i]
                    next i
                    الان
                    '''''text6="20.123"

                    [glow=black,2,300]بردی جالب با سیستم عاملی جالب !!![/glow]

                    دیدگاه


                      #11
                      پاسخ : mikro basic

                      حالا درست شد.. دمت گرم داداش

                      یه راه اسونتر هم خودم پیدا کردم که تقریبا تو مایه های دستورات شماست
                      dim text as string[23]
                      dim text 1 as float
                      floattostring(text1,text)
                      text[4]=0

                      ----------------------------

                      واسه ریختن یه متغیر 32 بیتی داخل eepromچه کار میشه کرد؟ اللبته دستورش رو بلدم ولی ا بیش از یه کلمه رو نمیتونم داخلeeprom ذخیره کنم.؟؟

                      دیدگاه


                        #12
                        پاسخ : mikro basic

                        نوشته اصلی توسط hosein0361
                        واسه ریختن یه متغیر 32 بیتی داخل eepromچه کار میشه کرد؟ اللبته دستورش رو بلدم ولی ا بیش از یه کلمه رو نمیتونم داخلeeprom ذخیره کنم.؟؟
                        من بایت بایت مینویسیم با دستورات

                        Highest higher High low

                        دیدگاه


                          #13
                          پاسخ : mikro basic

                          عالی بود ممنون.
                          -----------------------------------
                          یه سوال دیگه:
                          حداکثر میزان کدی که این کمپایلر میتونه کمپایل کنه چقدر؟
                          من یه برنامه نوشتم حجم برنامه ام از 8190wordبیشتر شده واسه همین کمپایلر ارور میده ؟ ای سی که استفاده کرده بود 877 بود. ایسی که حجم برنامه اش از این بیشتر باشه تو بازار پیدا میشه؟

                          دیدگاه

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