اطلاعیه

Collapse
No announcement yet.

چطور یه متغییر float رو در eeprom ذخیره کنم ؟

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

    چطور یه متغییر float رو در eeprom ذخیره کنم ؟

    سلام به همه
    چطور یه متغییر float رو در eeprom ذخیره کنم ؟
    تو فرم گشتم چنتا مطلب پیدا کردم ولی متوجه نشدم !
    کلمه eeprom رو اول متغییر میزارم ولی وقتی میخاد روی ال سی دی نمایش بده عدد منفی340282329 - رو نشون میده :eek:
    زبان سی - کد ویژن
    چه يافت آنــکه تــو را گم کرد وچه گم کرد آنـکه تــو را يافت.

    #2
    پاسخ : چطور یه متغییر float رو در eeprom ذخیره کنم ؟

    کد:
    eeprom float i;
    char lcd[16];
    void main(){
    
    
    sprintf("lcd,%2.1f",i);
    lcd_puts(lcd);
    
    }
    البته باید بری توی آدرس
    configur - c compiler - s printf features
    و اونو از int , width
    به float تغییر بده.

    دیدگاه


      #3
      پاسخ : چطور یه متغییر float رو در eeprom ذخیره کنم ؟

      نوشته اصلی توسط jonbakhsh

      البته باید بری توی آدرس
      configur - c compiler - s printf features
      و اونو از int , width
      به float تغییر بده.
      من تابعی که برای پرینت استفاده کردم مربوط به داده های فلوت هست و فک نکنم احتیاج به تغییر باشه!اما امتحان کردم نشد.ممنون از توجهتون

      کد:
       char str1[15],str2[15];
         ftoa(a,2,str1); 
         sprintf(str2,"b:%S",str1);
         lcd_gotoxy(4,1); 
         lcd_puts(str1);
         lcd_gotoxy(0,0);
         lcd_puts(str2);
      چه يافت آنــکه تــو را گم کرد وچه گم کرد آنـکه تــو را يافت.

      دیدگاه


        #4
        پاسخ : چطور یه متغییر float رو در eeprom ذخیره کنم ؟

        عزیزان یه دستی برسونید
        چه يافت آنــکه تــو را گم کرد وچه گم کرد آنـکه تــو را يافت.

        دیدگاه


          #5
          پاسخ : چطور یه متغییر float رو در eeprom ذخیره کنم ؟

          سلام :nerd:
          اینجا جواب دادن که البته واسه GCC هستش. ولی یکی گفته با اشاره گرها هم می تونی انجام بدی:


          http://www.avrfreaks.net/index.php?n...c&p=895851

          با اشاره گرها که می تونی کار بکنی؟

          دیدگاه


            #6
            پاسخ : چطور یه متغییر float رو در eeprom ذخیره کنم ؟

            نوشته اصلی توسط rozeh
            سلام :nerd:
            اینجا جواب دادن که البته واسه GCC هستش. ولی یکی گفته با اشاره گرها هم می تونی انجام بدی:


            http://www.avrfreaks.net/index.php?n...c&p=895851

            با اشاره گرها که می تونی کار بکنی؟
            سلام
            با gcc کار نکردم،اشارگرها رو یه چیزای خیلی کم میدونم ازش :sad:
            ینی انجمن به این بزرگی هیچکس نیس یه جواب درس حسابی به ما بده ؟
            چه يافت آنــکه تــو را گم کرد وچه گم کرد آنـکه تــو را يافت.

            دیدگاه


              #7
              پاسخ : چطور یه متغییر float رو در eeprom ذخیره کنم ؟

              سلام

              به متغیرتون توی برنامه یک مقدار اولیه بدید . مثلا i=0 . بعد بریزید روی میکرو . دوباره تست کنید ببینید درست نمیشه .
              تاپیک جامع سیستم مدیریت ساختمان BMS و خانه هوشمند Smart Home
              دانلود مجموعه آموزشی شرکت Altium ا (Altium Training)
              مقالات و فایل های آموزشی نرم افزار Labview
              حل مشکل درایور و راه اندازی FT232 های غیراورجینال

              دیدگاه


                #8
                پاسخ : چطور یه متغییر float رو در eeprom ذخیره کنم ؟

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

                به متغیرتون توی برنامه یک مقدار اولیه بدید . مثلا i=0 . بعد بریزید روی میکرو . دوباره تست کنید ببینید درست نمیشه .
                سلام مهندس
                من تمام متغییر هام رو مقدار دهی کردم
                کد:
                eeprom float distance=0;
                چه يافت آنــکه تــو را گم کرد وچه گم کرد آنـکه تــو را يافت.

                دیدگاه


                  #9
                  پاسخ : چطور یه متغییر float رو در eeprom ذخیره کنم ؟

                  قبلا تست کرده بودم مشکلی نداشت . الان که شما اینطوری گفتید دوباره تست کردم باز هم مشکلی نداشت . اینم کل دستوراتی که استفاده کرده بودم :

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

                  کد:
                  eeprom float vmax=4.526;
                  unsigned char str10[5],str11[8];
                  ftoa(vmax,3,str10);
                  sprintf(str11,"%7s",str10);
                  glcd_puts(str11,8,5,0,1,0);
                  delay_ms(1000);
                  glcd_clear();
                  حالت دوم : حین اجرای برنامه خود متغیر مقدار می گرفت که باز هم نتیجه رو درست نشون می داد. حالا باز هم شما راه اولی که من رفتم رو دقیقا همونطوری تست کنید ببینید درست میشه یا نه . بعد راه دوم .
                  تاپیک جامع سیستم مدیریت ساختمان BMS و خانه هوشمند Smart Home
                  دانلود مجموعه آموزشی شرکت Altium ا (Altium Training)
                  مقالات و فایل های آموزشی نرم افزار Labview
                  حل مشکل درایور و راه اندازی FT232 های غیراورجینال

                  دیدگاه


                    #10
                    پاسخ : چطور یه متغییر float رو در eeprom ذخیره کنم ؟

                    نوشته اصلی توسط محمد م
                    قبلا تست کرده بودم مشکلی نداشت . الان که شما اینطوری گفتید دوباره تست کردم باز هم مشکلی نداشت . اینم کل دستوراتی که استفاده کرده بودم :

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

                    کد:
                    eeprom float vmax=4.526;
                    unsigned char str10[5],str11[8];
                    ftoa(vmax,3,str10);
                    sprintf(str11,"%7s",str10);
                    glcd_puts(str11,8,5,0,1,0);
                    delay_ms(1000);
                    glcd_clear();
                    حالت دوم : حین اجرای برنامه خود متغیر مقدار می گرفت که باز هم نتیجه رو درست نشون می داد. حالا باز هم شما راه اولی که من رفتم رو دقیقا همونطوری تست کنید ببینید درست میشه یا نه . بعد راه دوم .
                    این قسمت مربوطه برنامه :اگه اون eeprom رو بردارم درست میشه ولی من میخام تو حافظه بمونه.روش اول و دوم که گفتین رو قبلا تست کردم.
                    یه چیز دیگه یه حسی بهم میگه این کار درست نیست.چون هر بار متغییر مقدارش رفرش میشه (رایت دوباره) این محدودیت ایجاد نمیکنه؟

                    کد:
                    str7[15],str8[15];
                    eeprom float distance=0;
                    interrupt [EXT_INT0] void ext_int0_isr(void)
                    {
                    
                    distance=distance+1;
                    }
                    .
                    .
                    .
                    .
                    
                     ftoa(distance/1000,2,str7); 
                       sprintf(str8,"Distance in Km:%S",str7);
                       lcd_gotoxy(4,1); 
                       lcd_puts(str7);
                       lcd_gotoxy(0,0);
                       lcd_puts(str8);
                    چه يافت آنــکه تــو را گم کرد وچه گم کرد آنـکه تــو را يافت.

                    دیدگاه


                      #11
                      پاسخ : چطور یه متغییر float رو در eeprom ذخیره کنم ؟

                      بیخود نبود مرحوم آقازاده و آقای کی نژاد میگفتن این کامپایلر خیلی مشکل داره. :smile:
                      توی نت دنبال اشاره گرها در زبان C بگردین. خیلی ساده هستش.

                      دیدگاه


                        #12
                        پاسخ : چطور یه متغییر float رو در eeprom ذخیره کنم ؟

                        نوشته اصلی توسط rozeh
                        بیخود نبود مرحوم آقازاده و آقای کی نژاد میگفتن این کامپایلر خیلی مشکل داره. :smile:
                        توی نت دنبال اشاره گرها در زبان C بگردین. خیلی ساده هستش.
                        کامپایلر مشکل نداره . برای نوشتن برنامه در هر زبانی باید قوانین اون رو رعایت کرد و برنامه رو هم اصولی نوشت .


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

                        نوشته اصلی توسط صادق ابراهیمی
                        این قسمت مربوطه برنامه :اگه اون eeprom رو بردارم درست میشه ولی من میخام تو حافظه بمونه.روش اول و دوم که گفتین رو قبلا تست کردم.
                        یه چیز دیگه یه حسی بهم میگه این کار درست نیست.چون هر بار متغییر مقدارش رفرش میشه (رایت دوباره) این محدودیت ایجاد نمیکنه؟

                        کد:
                        str7[15],str8[15];
                        eeprom float distance=0;
                        interrupt [EXT_INT0] void ext_int0_isr(void)
                        {
                        
                        distance=distance+1;
                        }
                        .
                        .
                        .
                        .
                        
                         ftoa(distance/1000,2,str7); 
                           sprintf(str8,"Distance in Km:%S",str7);
                           lcd_gotoxy(4,1); 
                           lcd_puts(str7);
                           lcd_gotoxy(0,0);
                           lcd_puts(str8);
                        نوع متغییرهای str7 و str8 رو ننوشتین . در ضمن با توجه به اینکه str7 رو داخله تابع ftoa استفاده کردید و فقط برای تبدیل عدد به رشته هست نیازی نبود سایزش رو 15 بذارید / سایزش رو 5 هم میذاشتید کافی بود . اگه سایز اون رو 15 بذارید دیگه نمی تونید سایز str8 رو که داخل sprintf استفاده کردید (که کل عبارت رو به رشته تبدیل می کنه) رو 15 بذارید . زیرا فقط 15 تا برای str7 در نظر گرفتید . حالا بقیه کلمات هم بهش اضافه شده . پس سایزش قطعا از 15 بیشتره . این کار باعث میشه داده های نشون داده شده روی صفحه معتبر نباشه و بعضی مواقع داده های رو بصورت تداخلی نشون بده .

                        حلقه وقفه تون هم مشکوک میزنه . نوشتن روی eeprom مقداری هر چند کم زمان بره و این باید برای مقدار دادن پشت سرهم بهش رعایت بشه . ضمن اینکه اگه وقفه زیاد تحریک بشه بعد از یک مدت دیگه نمی تونید از eeprom استفاده کنید چون دیگه عمرش رو کرده . بهتره در صورت لزوم فقط آخرین مقدار یعنی همون مقدار نهایی در eeprom ذخیره بشه و نه اینکه دائم مقدار متغییر در این حافظه ذخیره بشه . چون این طوری همونطور که گفتم بعد از مدتی دیگه جان به جان آفرین تسلیم می کنه :biggrin:
                        تاپیک جامع سیستم مدیریت ساختمان BMS و خانه هوشمند Smart Home
                        دانلود مجموعه آموزشی شرکت Altium ا (Altium Training)
                        مقالات و فایل های آموزشی نرم افزار Labview
                        حل مشکل درایور و راه اندازی FT232 های غیراورجینال

                        دیدگاه


                          #13
                          پاسخ : چطور یه متغییر float رو در eeprom ذخیره کنم ؟

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

                          نوع متغییرهای str7 و str8 رو ننوشتین . در ضمن با توجه به اینکه str7 رو داخله تابع ftoa استفاده کردید و فقط برای تبدیل عدد به رشته هست نیازی نبود سایزش رو 15 بذارید / سایزش رو 5 هم میذاشتید کافی بود . اگه سایز اون رو 15 بذارید دیگه نمی تونید سایز str8 رو که داخل sprintf استفاده کردید (که کل عبارت رو به رشته تبدیل می کنه) رو 15 بذارید . زیرا فقط 15 تا برای str7 در نظر گرفتید . حالا بقیه کلمات هم بهش اضافه شده . پس سایزش قطعا از 15 بیشتره . این کار باعث میشه داده های نشون داده شده روی صفحه معتبر نباشه و بعضی مواقع داده های رو بصورت تداخلی نشون بده .

                          حلقه وقفه تون هم مشکوک میزنه . نوشتن روی eeprom مقداری هر چند کم زمان بره و این باید برای مقدار دادن پشت سرهم بهش رعایت بشه . ضمن اینکه اگه وقفه زیاد تحریک بشه بعد از یک مدت دیگه نمی تونید از eeprom استفاده کنید چون دیگه عمرش رو کرده . بهتره در صورت لزوم فقط آخرین مقدار یعنی همون مقدار نهایی در eeprom ذخیره بشه و نه اینکه دائم مقدار متغییر در این حافظه ذخیره بشه . چون این طوری همونطور که گفتم بعد از مدتی دیگه جان به جان آفرین تسلیم می کنه :biggrin:
                          ممنون مهندس
                          متغییر ها char هستد.
                          وقتی سایز str7 رو تغییر دادم بعد از چن بار فشردن شستی(شماتیک مدار در پرتوئوس:نقش شستی نشان دادن متغییر روی ال سی دی) ال سی دی قاط زد.اومدم str 8 رو تغییر دادم بازهم همون طور شد که نهایتا به حالت قبل برگردوندمشون.
                          اگه از eeprom خارجی استفاده کنم محدودیت نوشتن داره؟
                          یه سوال وقتی میخایم آیسی رو پروگرم کنیم باید فایل eeprom رو هم رایت کنیم،حالا تو پرتئوس همچین چیزی نداریم؟
                          اون حقه وقفه چرا مشکوکه؟
                          چه يافت آنــکه تــو را گم کرد وچه گم کرد آنـکه تــو را يافت.

                          دیدگاه


                            #14
                            پاسخ : چطور یه متغییر float رو در eeprom ذخیره کنم ؟

                            نوشته اصلی توسط صادق ابراهیمی
                            ممنون مهندس
                            متغییر ها char هستد.
                            وقتی سایز str7 رو تغییر دادم بعد از چن بار فشردن شستی(شماتیک مدار در پرتوئوس:نقش شستی نشان دادن متغییر روی ال سی دی) ال سی دی قاط زد.اومدم str 8 رو تغییر دادم بازهم همون طور شد که نهایتا به حالت قبل برگردوندمشون.
                            اگه از eeprom خارجی استفاده کنم محدودیت نوشتن داره؟
                            یه سوال وقتی میخایم آیسی رو پروگرم کنیم باید فایل eeprom رو هم رایت کنیم،حالا تو پرتئوس همچین چیزی نداریم؟
                            اون حقه وقفه چرا مشکوکه؟
                            اولا اون پروتئوس رو بذار کنار . :biggrin: من اسمش رو می شنوم حالم بد میشه :biggrin: بدرد هیچی نمی خوره . در ضمن فکر نکنم اون جا با eeprom کار کنه . چون متغییرهایی که توی eeprom هستن از طریق یک فایل دیگه پروگرم میشن. با پسوند .eep . من فکر کردم عملی بستی . من اون برنامه ای که بالا گفتم درست کار می کنه رو عملی بستم و درست کار کرد . شما هم حتما عملی ببندش و اون پروتئوس رو هم بذار کنار .

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

                            پس سایز اون متغییرها رو درست کن . برای str7 مقدار 6 خوبه . برای str8 هم 25 خوبه . در ضمن قطعا این جمله و اون مقدار توی ال سی دی جا نمیشه و به هم میریزه . بهتره فعلا اون قسمت Distance in km : رو حذف کنی و فقط مقدار متغییر رو چاپ کنی . بعد که درست شد موضوع اصلی یک فکری به حالش می کنیم . اگه خواستی فقط مقدار متغیر رو نشون بدی طول str8 رو هم همون 6 بذار .

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

                            برای پروگرم کردن عملی باید فایل .eep رو جدا بریزین.. یعنی یکبار حافظه فلش رو پروگرم می کنید و یکبار eeprom . داخل پروتئوس رو نمی دونم .

                            نوشته اصلی توسط صادق ابراهیمی
                            اون حلقه وقفه چرا مشکوکه؟
                            چون بقیه برنامت چیز خاصی نداشت و کار اصلی داخل حلقه وقفه انجام می شد که باید موقع نوشتن اون برنامه به اون کارهایی که گفتم باید توجه کنی (مثل زمان لازم برای نوشتن داخل eeprom و ....).

                            تاپیک جامع سیستم مدیریت ساختمان BMS و خانه هوشمند Smart Home
                            دانلود مجموعه آموزشی شرکت Altium ا (Altium Training)
                            مقالات و فایل های آموزشی نرم افزار Labview
                            حل مشکل درایور و راه اندازی FT232 های غیراورجینال

                            دیدگاه


                              #15
                              پاسخ : چطور یه متغییر float رو در eeprom ذخیره کنم ؟

                              خوب معلومه که باید فایل eep رو هم پروگرم کنی
                              تو پروتیوس هم باید اضافه کنی تا درست کار کنه
                              گذشت خصلت مردان است

                              دیدگاه

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