اطلاعیه

Collapse
No announcement yet.

نوشتن بیش از 8 بیت در EEPROM هایی که 8 بیتی هستند

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

    نوشتن بیش از 8 بیت در EEPROM هایی که 8 بیتی هستند

    با سلام خدمت همه دوستان ارزشمند و مدیر محترم

    به اختصار عرض کنم که خانواده PIC16F87x که در بازار ایران بهتر در دسترس هستند تا بقیه و قیمتی هم منصفانه دارند ، حافظه EEPROM در دسترس کاربر برای خواندن و نوشتن در ضمن اجرای برنامه فقط هشت بیتی دارند. با این مقدمه سوالم را اینگونه مطرح می کنم که :

    در ضمن برنامه لازم شده است که با متغیرهایی بیش از 8 بیت کار کنیم و می خواهیم آنها را در EEPROM ذخیره کنیم . چه راه کاری (که خودتان جواب گرفته باشید) را سراغ دارید؟
    در محیط PICBASIC من این کار را انجام داده ام و نتیجه نداشت:
    با فرض اینکه متغیر ما P var word باشد
    1) برای ذخیره و خواندن Write 0,p.LowByte & Write 2,p.HighByte
    و منطقاً Read2,p.HighByte
    2) شیفت دادن به اندازه 8 بیت و 16 بیت در یک متغیر ثانویه هم نتیجه ای نداشت !
    شاید اگر بتوانیم عدد دسیمال را به باینری تبدیل کنیم آنوقت بشود کاری کرد که من هر چه گشتم چیزی نیافتم. به عنوان مثال ضرب کردن در 256 و جمع با مقدار کم ارزش تر.

    منتظر جواب و راهنمایی دوستان هستم.

    با احترام
    والسلام علي من اتبع الهدي .... و درود بر کساني که راه هدايت را دنبال مي کنند.

    هوشمندانه بپرسيد...

    #2
    پاسخ : نوشتن بیش از 8 بیت در EEPROM هایی که 8 بیتی هستن&#

    من با شیفت جواب گرفتم، البته با زبان C اینم کدشه:
    کد:
    EEPROM_Write(keyAddress+0, ((rem<<16)>>16));Delay_ms(20);
    EEPROM_Write(keyAddress+1, ((rem<<8)>>16));Delay_ms(20);
    EEPROM_Write(keyAddress+2, (rem>>16));
    rem که یه عدد 20 بیتی است بصورت 8 بیتی در حافظه نوشه می شود.

    دیدگاه


      #3
      پاسخ : پاسخ : نوشتن بیش از 8 بیت در EEPROM هایی که 8 بیتی هستن&#

      نوشته اصلی توسط zoz_zozm
      من با شیفت جواب گرفتم، البته با زبان C اینم کدشه:... rem که یه عدد 20 بیتی است بصورت 8 بیتی در حافظه نوشه می شود.
      سلام
      ممنون از اینکه جواب دادید.
      منطقی به نظر می رسد که شیفت دادن اطلاعات 8 بیت ، 8 بیت ؛ باید جواب بدهد . البته علامت های شیفت گذاری شما چون هم به سمت چپ بود و هم به سمت راست، اندکی من را گیج کرد (دلیلش هم این است که از زبان C استفاده نکرده ام تا کنون). حالا یک سوال: اگر به چپ و یا راست شیفت بدهیم اولویت بایت پائین و بایت بالا چه مدلی خواهد بود ؟

      فکر کنم که من عدد شانزده بیتی را یک بار داخل یک متغیر شانزده بیتیWORD و یک بار دیگر داخل یک متغیر هشت بیتی BYTE به سمت چپ شیفت دادم که در هر دوحالت نشد!!! در کد زیر من متغیر های واسط را شانزده بیتی آوردم . عیناً همین کد را برای متغیر های واسط lower & higher به صورت هشت بیتی نوشتم. باز هم نشد!!!
      کد:
      ps var WORD ;my original 16-bit data
      lower var WORD
      higher var WORD 
      CLEAR
      lower=ps<<16 ;16bits shift to left ward
      higher=ps<<8 ;8bits shift to left ward
      WRITE 0,lower
      WRITE 1,higher
      در محیط بیسیک پرو
      البته همانطور که اینجا آوردم ، به دلیل استفاده از دستور CLEAR در ابتدای برنامه خودم که همه متغیر ها را صفر می کند ، دیگر متغیرهای واسط را با صفر مقدار دهی نکردم. یک تفاوت دیگر هم بین کار من با نظر شما هست که من از تاخیر استفاده نکردم که فکر می کنم الزامی هم ندارد.

      ممکن است از شما دوست عزیز خواهش کنم که واضح تر (در خصوص جهت شیفت ها و نوع متغیر هایتان) توضیح بفرمائید.

      با احترام و تشکر
      والسلام علي من اتبع الهدي .... و درود بر کساني که راه هدايت را دنبال مي کنند.

      هوشمندانه بپرسيد...

      دیدگاه


        #4
        پاسخ : نوشتن بیش از 8 بیت در EEPROM هایی که 8 بیتی هستند

        با سلام خدمت دوست عزیز
        آقا کد شما کمی مشکل داره اون رو اینجوری اصلاح کن
        کد قبلی شما اول میاد متغییر 16 بیتی رو 16 بیت شیفت میدی دیگه چیزی نمی مونه! :mrgreen:
        کد:
        ps var WORD ;my original 16-bit data
        lower var BYTE
        higher var BYTE
        CLEAR
        lower=ps ;8 bits of low word
        higher=ps>>8 ;8 bits of high ward
        WRITE 0,lower
        WRITE 1,higher

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

        دیدگاه


          #5
          پاسخ : نوشتن بیش از 8 بیت در EEPROM هایی که 8 بیتی هستند

          نوشته اصلی توسط abbasmh
          با سلام خدمت دوست عزیز
          آقا کد شما کمی مشکل داره اون رو اینجوری اصلاح کن
          کد قبلی شما اول میاد متغییر 16 بیتی رو 16 بی...]
          سلام دوست من

          ضمن خجالت !!! باید عرض کنم که من دیشب حدود ساعت 2 بامداد این جواب را نوشتم... الان هم خودم کلی خنده ام گرفته که چرا ، همچین چیزی را نوشتم. اما در کل شما درست فرمایش فرمودید.


          الان توی کارگاه این را بررسی و آزمایش می کنم و مراتب را اعلام حضور می کنم .

          ممنون از بابت توجه و راهنمایی تان

          والسلام علي من اتبع الهدي .... و درود بر کساني که راه هدايت را دنبال مي کنند.

          هوشمندانه بپرسيد...

          دیدگاه


            #6
            پاسخ : نوشتن بیش از 8 بیت در EEPROM هایی که 8 بیتی هستن&#

            نوشته اصلی توسط abbasmh
            با سلام خدمت دوست عزیز
            آقا کد شما کمی مشکل داره اون رو اینجوری اصلاح کن
            کد قبلی شما اول میاد متغییر 16 بیتی رو 16 بیت شیفت میدی دیگه چیزی نمی مونه! :mrgreen:
            کد:
            ps var WORD ;my original 16-bit data
            lower var B
            سلام دوباره

            با اینکه منطق برنامه شما درسته اما نمی دانم که چرا باز هم نشد!!! :angry:
            یک سه چهار ساعت هم روی این نظر شما کار کردم اما مطمئن هستم که یک اشتباه کوچک می کنم که نمی گذاره موفق بشوم
            گفتم بدین وسیله هم سلامی دوباره کرده باشم و هم تشکری ویژه .

            به هرحال ما را بی خبر نگذارید

            یا علی
            والسلام علي من اتبع الهدي .... و درود بر کساني که راه هدايت را دنبال مي کنند.

            هوشمندانه بپرسيد...

            دیدگاه


              #7
              پاسخ : نوشتن بیش از 8 بیت در EEPROM هایی که 8 بیتی هستند

              علیک سلامی مجدد
              آقا این برنامرو اینجوری بنویس
              اول میاد توی حافظه می نویسه بعد متغییر ها رو صفر میکنه و بعد دوباره می خونه
              کد:
              ps var WORD ;my original 16-bit data
              lower var BYTE
              higher var BYTE
              CLEAR
              lower=ps ;8 bits of low word
              higher=ps>>8 ;8 bits of high ward
              WRITE 0,lower
              delay_ms(10)
              WRITE 1,higher
              delay_ms(10)
              lower=0
              higher=0
              ps=0
              READ 0,lower
              READ 1,higher
              ps=(higher<<8)+lower
              شما سعی کن اگه باز نشد کل سورس رو بزار
              موفق باشی :bye

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

              دیدگاه


                #8
                پاسخ : نوشتن بیش از 8 بیت در EEPROM هایی که 8 بیتی هستند

                نوشته اصلی توسط abbasmh
                علیک سلامی مجدد
                آقا این برنامرو اینجوری بنویس
                اول میاد توی حافظه می نویسه بعد متغییر ها رو صفر میکنه و بعد دوباره می خونه ...
                آقا abbasmh سلام
                امیدوارم که حالتان خوب باشد
                صادقانه عرض کنم که چون شدید گرفتار نوشتن روال یک برنامه برای PID هستم . دیگه نشد که توصیه شما را در خصوص ذخیره بیش از 8 بیت بررسی و لحاظ کنم . فعلا یک کلک مرغابی ، سوار کردم. یعنی اینکه به جای ذخیره عدد در قالب ورد WORD یک ضریب خاص را که همیشه کمتر از 255 است را ذخیره می کنم و مجدد همان را قرائت می کنم. و داخل رابطه و فرمولی وارد می کنم که در نهایت همان نتیجه به دست بیاید.

                برای اتمام کار در این روال برنامه PID ، زمان ، برای من تند و سریع سپری می شود و به قول مرحوم قیصر امین پور ( که خدا رحمتش کند) ناگهان چه زود ، دیر میشود.... یواش یواش کار من هم داره دیر می شود.... آخه قول دادم و دارم بد قول می شوم....

                از این جهت که من در eca.ir تازه وارد هستم. گفتم که از مرتبه دوستی مان استفاده کنم و از شما بپرسم که روی موضوع کنترل حلقه بسته با استفاده از تکنیک تناسب ، انتگرال و مشتق یا اصطلاحاً PID ، چیزی انجام شده دارید که جواب گرفته باشید؟ یا احیانا تو این تالار های گفتگو PIC ، چیزی به رویت تان رسیده است؟ نکته ای که فکر کنید ممکن است مفید فایده باشد؟

                البته شایان ذکر است که برنامه من (از نظر نرم افزاری) تقریبا تمام است و فردا جمعه انشاالله سخت افزار DAC0800 را به میکرو متصل می کنم . و سخت افزار را در آزمایشگاه تست می کنم . ممکن است که برنامه ای که من نوشته ام ، در شرائط واقعی جواب ندهد ، و لازم باشد که بیشتر به جزئیات آن پرداخته شود.

                لذا گفتم از شما و همچنین دوست ارزشمندم ، جناب آقای مهندس مستقیمی ، مدیر محترم تالار گفتمان PIC بپرسم که برنامه ای از قبل آماده شده دارید؟

                البته اگر فردا انشاالله به لطف خدا جواب بدهد بعد باید یک نمونه اولیه بفرستم بره یک آزمایشگاه سیالات ، با یک سیستم پمپ و Frequency inverterدر محیط سیال آب ، در شرائط کاملا واقعی آزمایش کنیم و آن وقت ببینیم که به قول معروف : " چی از آب در می آید " ؟؟

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

                منتظر خبر هر دو بزرگوار هستم.

                ارادتمندتان
                والسلام علي من اتبع الهدي .... و درود بر کساني که راه هدايت را دنبال مي کنند.

                هوشمندانه بپرسيد...

                دیدگاه


                  #9
                  پاسخ : نوشتن بیش از 8 بیت در EEPROM هایی که 8 بیتی هستند

                  ممنون و تشکر از صداقت شما
                  من شخصا در مورد بچه ها کمکی از دستم بر بیاد دریق نمی کنم ولی متاسفانه تا حالا در مورد PID کار خاصی انجام ندادم و اطلاعات خاصی ندارم :redface:
                  یه پیشنهاد:
                  شما یه تاپیک با موضوع مرتبط ایجاد کن و فقط به تاپیک انجمن PIC اکتفا نکن و از انجمن AVR و ... نیز کمک بگیر. امیدوارم به نتیجه برسید
                  یا علی ع
                  :bye

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

                  دیدگاه


                    #10
                    پاسخ : نوشتن بیش از 8 بیت در EEPROM هایی که 8 بیتی هستند

                    جناب اصغریان سلام عرض میکنم.
                    خوشحالم که مسئله ذخیره سازی رو تونستین حل بکنین. :nerd:
                    در مورد PID، متاسفانه تا الان تجربه ی کاری ندارم.
                    ولی این فایل هست که یه نمونه کنترل دمای آب مخزن هست که با PID نوشته شده.شاید بتونه کمکتون کنه.البته با AVR هست. ولی خبPID همون PID هست دیگه،فرقی نمیکنه میکرو چی باشه.

                    دیدگاه


                      #11
                      پاسخ : نوشتن بیش از 8 بیت در EEPROM هایی که 8 بیتی هستند

                      نوشته اصلی توسط شاهرخ مستقیمی
                      ....که یه نمونه کنترل دمای آب مخزن هست که با PID نوشته شده.شاید بتونه کمکتون کنه.البته با AVR هست. ....
                      سلام جناب مهندس مستقیمی

                      امیدوارم که حال شریف خوب باشد

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

                      امیدوارم که در عمل ، درست از آب !!! در بیاید.

                      متشکرم
                      والسلام علي من اتبع الهدي .... و درود بر کساني که راه هدايت را دنبال مي کنند.

                      هوشمندانه بپرسيد...

                      دیدگاه


                        #12
                        پاسخ : نوشتن بیش از 8 بیت در EEPROM هایی که 8 بیتی هستند

                        نوشته اصلی توسط abbasmh
                        علیک سلامی مجدد
                        آقا این برنامرو اینجوری بنویس....
                        سلام جناب آقای abbasmh
                        امیدوارم که حالتان خوب باشد. من راهنمایی ها و توضیحات ارزشمند و مفید شما را اینجوری در سورس کد لحاظ کردم که بعدها که نگاه می کنم خودم زود متوجه بشوم و گیج نشوم. نظر درست و کارشناسی شما که همان 8 بیت شیفت است ؛ همانا معادل با تقسیم بر 256 یا h100 است ، لذا

                        کد:
                        ps var WORD
                        lower var byte
                        higher var byte
                        higher =ps / 256
                        lower = ps - (higher*$100) 
                        WRITE 0,higher
                        WRITE 1,lower
                        
                        and from the other side
                        
                        READ 0,higher
                        READ 1,lower
                        ps=(higher * $100) + lower
                        والسلام علي من اتبع الهدي .... و درود بر کساني که راه هدايت را دنبال مي کنند.

                        هوشمندانه بپرسيد...

                        دیدگاه


                          #13
                          پاسخ : نوشتن بیش از 8 بیت در EEPROM هایی که 8 بیتی هستند

                          با سلامی دوباره
                          ممنونم به لطف شما
                          درسته حق با شماست. به نظرم کد شما نیز مشکلی نداره فقط بعد از هر بار نوشتن توی EEPROM یک تاخیر 20 میلی ثانیه ای به نظر اطمینان کار رو بیشتر میکنه.
                          موفق باشید
                          :bye

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

                          دیدگاه

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