اطلاعیه

Collapse
No announcement yet.

آزمایش eeprom و نتیجه عجیب !

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

    آزمایش eeprom و نتیجه عجیب !

    همونطور که می دونید توی دیتا شیت میکروها یه عددی برای محدودیت نوشتن در eeprom تعیین شده که برای مثلا mega32 این مقدار برابر 100000 هست
    من چون به این اعداد اعتماد نداشتم خودم دست بکار شدم و برنامه زیر رو نوشتم
    یک میکروی جان برکف پیدا کردم :biggrin: و پروگرمش کردم
    همونطور که میبینید برنامه زیر یک عدد تصادفی ایجاد میکنه و در متغیر A میریزه و بعد اونو تو eeprom مینویسه و دوباره می خونه وتو متغیر B میریزه و اگر ایندو با هم برابر نبودن اجرای برنامه متوقف میشه
    اما اتفاقی که افتاد جالب بود ! متغیر c که نشانگر تعداد دفعات نوشتن و خوندن از eeprom هست به عدد 3500000
    (سه میلیون و پانصد هزار !!) رسیده و مدار از دیشب روشنه ! و همچنان داره عددش زیاد میشه !
    الان دوتا شاخ روی سر من سبز شده 1 می خوام بدونم که چطور همچین چیزی ممکنه ؟

    کد:
    $regfile = "m32def.dat"
    $crystal = 8000000
    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = Pb.0 , Db5 = Pb.1 , Db6 = Pb.2 , Db7 = _
     Pb.3 , E = Pb.5 , Rs = Pb.4
    Config Timer1 = Timer , Prescale = 1024
    Enable Timer1
    On Timer1 Timer1_isr
    Timer1 = 62000
    enable Interrupts
    Start Timer1
    Cls
    
    Dim A As Word
    Dim B As Word
    Dim C As Long
    
    Do
    A = Rnd(65535)
    Writeeeprom A , 1022
    Waitms 5
    Readeeprom B , 1022
    Waitms 5
    If A <> B Then
    Stop Timer1
    Locate 1 , 1 : Lcd "Number =" ; C
    Do : Loop
    End If
    Incr C
    Loop
    
    End
    
    
    Timer1_isr:
    Timer1 = 62000
    Locate 1 , 1 : Lcd "Number =" ; C
    Return

    #2
    پاسخ : عملیات انتحاری با AVR

    کار عملی به این میگن ها

    ولی دوست من منظور شرکت از 100000 سری کار eeprom
    نوشتن و خوندن کامل حافظه eeprom هست نه یک بایت
    از دو چیز بسیار زیاد یاد گرفتم (1) نمونه مدارهای موجود در سایت های خارجی (2) مهندسی معکوس بردهای غیر ایرانی. به نقل از آقای مرتضی امانی
    --------------------------------------------------------
    تمام دنیا ما را تحریم کرده اند؛ حداقل خودمان همدیگر را تحریم نکنیم. به نقل از pencil
    --------------------------------------------------------
    اشک هایی که پس از هر شکست ریخته میشوند همان عرق هاییست که برای پیروزی ریخته نشده است. mehran901

    دیدگاه


      #3
      پاسخ : عملیات انتحاری با AVR

      نوشته اصلی توسط moghani1376
      کار عملی به این میگن ها

      ولی دوست من منظور شرکت از 100000 سری کار eeprom
      نوشتن و خوندن کامل حافظه eeprom هست نه یک بایت
      به نظر شما روی یک بایت بدون خرابی چند بار میشه نوشت ؟؟

      اضافه شده در تاریخ :
      [quote author=moghani1376 link=topic=115144.msg749553#msg749553 date=1445360899]
      کار عملی به این میگن ها
      پاره ای از رویکردهای دفاعی

      دیدگاه


        #4
        پاسخ : عملیات انتحاری با AVR

        نوشته اصلی توسط moghani1376
        کار عملی به این میگن ها

        ولی دوست من منظور شرکت از 100000 سری کار eeprom
        نوشتن و خوندن کامل حافظه eeprom هست نه یک بایت
        اگه منظورتون موقع پروگرم شدن هست من واقعا نمیدونم در اون حالت پروگرمر چطوری دیتا رو روی eeprom مینویسه یعنی سیستمش با حالت عادی فرق داره ؟
        در نهایت باید دیتا توی رجیسترهای eeprom ذخیره بشه و ازش خونده بشه حالا چه فرقی میکنه یکی یا هزارتا؟
        (ضمنا مدار تا 40 میلیون رفت من دیگه حوصلم سر رفت قطعش کردم!)

        دیدگاه


          #5
          پاسخ : عملیات انتحاری با AVR

          اینکه گفته میشه قابلیت 100 هزار بار نوشتن داره منظور این نیس که 100 هزار بار میشه eeprom رو پروگرم کرد؟؟!! من اینطوری فکر میکنم.

          در ضمن شرکت های بزرگی مثل اتمل عددی رو که ذکر میکنن حداقل مقداری هستش که شرکت تضمین میکنه که حتما به این عدد میرسیم وگرنه میشه از این بیشتر هم رفت. نمونه دیگش فرکانس کاری ای وی آر هستش که اتمل تا 16 مگ رو تضمین کرده ولی تا 24 مگ هم over clock میشه!
          www.gam-co.blogsky.com

          دیدگاه


            #6
            پاسخ : عملیات انتحاری با AVR

            نوشته اصلی توسط vahidabedi
            اینکه گفته میشه قابلیت 100 هزار بار نوشتن داره منظور این نیس که 100 هزار بار میشه eeprom رو پروگرم کرد؟؟!! من اینطوری فکر میکنم.

            در ضمن شرکت های بزرگی مثل اتمل عددی رو که ذکر میکنن حداقل مقداری هستش که شرکت تضمین میکنه که حتما به این عدد میرسیم وگرنه میشه از این بیشتر هم رفت. نمونه دیگش فرکانس کاری ای وی آر هستش که اتمل تا 16 مگ رو تضمین کرده ولی تا 24 مگ هم over clock میشه!
            یعنی شما اختلاف بین صدهزار و چهل میلیون رو چطوری توضیح میدین میشه 400 برابر ناقابل !! تازه من مدار رو قطع کردم معلوم نیست واقعا تا کجا بره

            ما هر جا تو انجمن چپ میرفتیم راست می رفتیم میگفتن eeprom محدودیت نوشتن داره حالا حداقل معلوم شد که اینطورا هم نیست

            دیدگاه


              #7
              پاسخ : عملیات انتحاری با AVR

              نوشته اصلی توسط 8787
              یعنی شما اختلاف بین صدهزار و چهل میلیون رو چطوری توضیح میدین میشه 400 برابر ناقابل !! تازه من مدار رو قطع کردم معلوم نیست واقعا تا کجا بره

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

              دیدگاه


                #8
                پاسخ : عملیات انتحاری با AVR

                نوشته اصلی توسط DesignerEng
                کامپایلر ها برنامه را دقیقا همانطور که برنامه نویس می خواهد ترجمه نمی کنند.
                مثلا در برنامه شما کامپایلر می بیند طرز استفاده شما از eeprom مانند یک متغیر sram هست پس به جای eeprom حافظه sram را اختصاص می دهد که سرعت اجرای برنامه بالاتر رود .
                برای تستی که مد نظر دارید بهتر است از زبان اسمبلی استفاده کنید.
                من فکر نکنم چنین کاری کنه . //

                در جواب دوستمون شما میکرو رو برای چند روز خاموش کن و دوباره تست کن ببین چیزی توش مونده آیا چیزی که درش مونده با مقدار قبل از خاموش کردن میکرو برابره .
                I'm going to
                RWTH Aachen
                University

                دیدگاه


                  #9
                  پاسخ : عملیات انتحاری با AVR

                  نوشته اصلی توسط 8787
                  همونطور که می دونید توی دیتا شیت میکروها یه عددی برای محدودیت نوشتن در eeprom تعیین شده که برای مثلا mega32 این مقدار برابر 100000 هست
                  من چون به این اعداد اعتماد نداشتم خودم دست بکار شدم و برنامه زیر رو نوشتم
                  یک میکروی جان برکف پیدا کردم :biggrin: و پروگرمش کردم
                  همونطور که میبینید برنامه زیر یک عدد تصادفی ایجاد میکنه و در متغیر A میریزه و بعد اونو تو eeprom مینویسه و دوباره می خونه وتو متغیر B میریزه و اگر ایندو با هم برابر نبودن اجرای برنامه متوقف میشه
                  اما اتفاقی که افتاد جالب بود ! متغیر c که نشانگر تعداد دفعات نوشتن و خوندن از eeprom هست به عدد 3500000
                  (سه میلیون و پانصد هزار !!) رسیده و مدار از دیشب روشنه ! و همچنان داره عددش زیاد میشه !
                  الان دوتا شاخ روی سر من سبز شده 1 می خوام بدونم که چطور همچین چیزی ممکنه ؟

                  کد:
                  $regfile = "m32def.dat"
                  $crystal = 8000000
                  Config Lcd = 16 * 2
                  Config Lcdpin = Pin , Db4 = Pb.0 , Db5 = Pb.1 , Db6 = Pb.2 , Db7 = _
                   Pb.3 , E = Pb.5 , Rs = Pb.4
                  Config Timer1 = Timer , Prescale = 1024
                  Enable Timer1
                  On Timer1 Timer1_isr
                  Timer1 = 62000
                  enable Interrupts
                  Start Timer1
                  Cls
                  
                  Dim A As Word
                  Dim B As Word
                  Dim C As Long
                  
                  Do
                  A = Rnd(65535)
                  Writeeeprom A , 1022
                  Waitms 5
                  Readeeprom B , 1022
                  Waitms 5
                  If A <> B Then
                  Stop Timer1
                  Locate 1 , 1 : Lcd "Number =" ; C
                  Do : Loop
                  End If
                  Incr C
                  Loop
                  
                  End
                  
                  
                  Timer1_isr:
                  Timer1 = 62000
                  Locate 1 , 1 : Lcd "Number =" ; C
                  Return
                  سلام
                  شما باید کاری کنید که میکرو بعد هر بار نوشتن تغذیش قطع شه و دوباره وصل شه و اونوقت هست که باید بخونی برای همین منظور استفاده از رله بهترین روش می باشد
                  و سرعت قطع و وصل شدن رله رو بزار رو 100 میلی ثانیه و بزار بشماره البته باید مرلقب باشی اداپتورت نسوزه می تونی یه مقاومم بزاری ولتاژ خود میکرو تا اندازه 2 ولت افت کنه و میکرو خاموش شه ولی در اینصورت رو اداپتور فشار زیادی وارد نمی شود

                  میکرو با یه پایه رله رو روشن می کنه و چون تغذیه میکرو وصل هست به رله با روشن کردن رله کاری می کنیم که ولتاژ تغذیه تا حد قبل توجهی افت کنه و میکرو خاموش بشه :redface:
                  برد جوجه کشی:
                  مطالعه پست 1 (حتما مطالعه کنید)


                  مطالعه پست 2 (برای مطلع شدن از تغییرات برنامه مطالعه کنید)

                  دانلود

                  توجه:
                  این برد نیمه صنعتی و خانگی هست...
                  برای صنعتی شدن حتما برد مخصوص خودتون رو بزنید...

                  آی دی کانال تلگرامی مربوط به برد جوجه کشی : electr0o0nic@

                  دیدگاه


                    #10
                    پاسخ : عملیات انتحاری با AVR

                    نوشته اصلی توسط azadfalah
                    من فکر نکنم چنین کاری کنه . //

                    در جواب دوستمون شما میکرو رو برای چند روز خاموش کن و دوباره تست کن ببین چیزی توش مونده آیا چیزی که درش مونده با مقدار قبل از خاموش کردن میکرو برابره .
                    کامپایلر قبل از ترجمه برنامه یکسری کارها رو کد انجام میده به اسم بهینه سازی مثلا در کد زیر:
                    کد:
                    for(i=0;i<250;i++)
                    	b=i;
                    PORTA=b;
                    چیزی که برنامه نویس فکر می کنه انجام می شه 250 بار اجرای حلقه هست.
                    اما یک کامپایلر خوب تکه کد بالا را به صورت زیر تبدیل می کنه:
                    کد:
                    PORTA=249;
                    به این می گویند بهینه سازی . حالا اگر برنامه نویس بخواهد تکه کد نوشته شده دقیقا به همان صورت ترجمه شود باید به طریقی به کامپایلر بگوید که از بهینه سازی آن جلوگیری کند و یا اینکه برنامه نویس آن را به زبان اسمبلی نوشته و با برنامه اصلی میکس کند. البته بحث من بصورت کلی است و نمی دانم دقیقا بسکام در چه سطحی بهینه سازی روی کد انجام می دهد.

                    دیدگاه


                      #11
                      پاسخ : عملیات انتحاری با AVR

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

                      از شوخی گذشته برنامه زیر رو برا این نوشتم که با سرعت بیشتری روی eeprom نوشته و خونده بشه و همونطور که میبینید از مقدار دهی مستقیم رجیسترها استفاده کردم . (دوستان بزرگوار لطفا برنامه رو چک کنید اگر اشتباهی کردم بگین)
                      در حال حاضر عدد C روی صفحه lcd من از عدد 888000000 (هشتصد و هشتاد و هشت میلیون) هم گذشته !!


                      این هم برنامه :
                      کد:
                      $regfile = "m32def.dat"
                      $crystal = 8000000
                      Config Lcd = 16 * 2
                      Config Lcdpin = Pin , Db4 = Pb.0 , Db5 = Pb.1 , Db6 = Pb.2 , Db7 = _
                       Pb.3 , E = Pb.5 , Rs = Pb.4
                      Config Timer1 = Timer , Prescale = 1024
                      Enable Timer1
                      On Timer1 Timer1_isr
                      Timer1 = 57000
                      Enable Interrupts
                      Start Timer1
                      Cls
                      
                      Dim A As Byte
                      Dim B As Byte
                      Dim C As Long
                      
                      Do
                      Disable Interrupts
                      A = Rnd(255)
                      Wait0:
                      sbic eecr,eewe
                      Goto Wait0
                      
                      Eear = 1022
                      Eedr = A
                      Set Eemwe
                      Set Eewe
                      
                      
                      Wait1:
                      sbic eecr,eewe
                      Goto Wait1
                      
                      Eear = 1022
                      Set Eere
                      B = Eedr
                      
                      Enable Interrupts
                      If A <> B Then
                      Stop Timer1
                      Locate 1 , 1 : Lcd "c =" ; C
                      Locate 2 , 1 : Lcd "eeprom damaged"
                      Do : Loop
                      End If
                      Incr C
                      Loop
                      
                      End
                      
                      
                      Timer1_isr:
                      Timer1 = 57000
                      Locate 1 , 1 : Lcd "c =" ; C
                      Locate 2 , 1 : Lcd "a=" ; A ; ; " " ; "b=" ; B ; "  "
                      Return

                      دیدگاه


                        #12
                        پاسخ : عملیات انتحاری با AVR

                        نوشته اصلی توسط 8787
                        آقا من دیروز برنامه زیر رو نوشتم و مدار رو دوباره روشن کردم و شب گرفتم خوابیدم ...
                        تو خواب دیدم یه یارویی با چاقو افتاده دنبالم و هرجا میرم اونم میاد ... یه دفعه برگشتم بهش گفتم تو دیگه کی هستی ؟ کفت : داداش من ایدوپی رامم ! :biggrin:

                        از شوخی گذشته برنامه زیر رو برا این نوشتم که با سرعت بیشتری روی eeprom نوشته و خونده بشه و همونطور که میبینید از مقدار دهی مستقیم رجیسترها استفاده کردم . (دوستان بزرگوار لطفا برنامه رو چک کنید اگر اشتباهی کردم بگین)
                        در حال حاضر عدد C روی صفحه lcd من از عدد 888000000 (هشتصد و هشتاد و هشت میلیون) هم گذشته !!


                        این هم برنامه :
                        کد:
                        $regfile = "m32def.dat"
                        $crystal = 8000000
                        Config Lcd = 16 * 2
                        Config Lcdpin = Pin , Db4 = Pb.0 , Db5 = Pb.1 , Db6 = Pb.2 , Db7 = _
                         Pb.3 , E = Pb.5 , Rs = Pb.4
                        Config Timer1 = Timer , Prescale = 1024
                        Enable Timer1
                        On Timer1 Timer1_isr
                        Timer1 = 57000
                        Enable Interrupts
                        Start Timer1
                        Cls
                        
                        Dim A As Byte
                        Dim B As Byte
                        Dim C As Long
                        
                        Do
                        Disable Interrupts
                        A = Rnd(255)
                        Wait0:
                        sbic eecr,eewe
                        Goto Wait0
                        
                        Eear = 1022
                        Eedr = A
                        Set Eemwe
                        Set Eewe
                        
                        
                        Wait1:
                        sbic eecr,eewe
                        Goto Wait1
                        
                        Eear = 1022
                        Set Eere
                        B = Eedr
                        
                        Enable Interrupts
                        If A <> B Then
                        Stop Timer1
                        Locate 1 , 1 : Lcd "c =" ; C
                        Locate 2 , 1 : Lcd "eeprom damaged"
                        Do : Loop
                        End If
                        Incr C
                        Loop
                        
                        End
                        
                        
                        Timer1_isr:
                        Timer1 = 57000
                        Locate 1 , 1 : Lcd "c =" ; C
                        Locate 2 , 1 : Lcd "a=" ; A ; ; " " ; "b=" ; B ; "  "
                        Return
                        برنامه را طوری بنویسید که هربار بعد از روشن شدن ابتدا مقدار ذخیره شده در eeprom را نشان دهد. اگر هر دفعه با خاموش و روشن کردن مدار مقدار ثابتی نشون داد یعنی اون قسمت اییپرام سوخته هست.ولی اگر اینطور نشد دلیل قطعی بر سالم بودن eeprom نیست! البته باید به اندازه کافی برای خاموش شدن وقت بذارید که ولتاژ خازنهای تغذیه صفر شود.
                        پ.ن: مطمئن باشید اگر این عددهایی که شما بدست آوردید درست بود تا حالا هزاران بار اتمل این قضیه را تو بوق و کرنا کرده بود.

                        دیدگاه


                          #13
                          پاسخ : آزمایش eeprom و نتیجه عجیب !

                          راستش منم به این فکر افتادم که اون خونه eeprom سوخته و برنامه داره مقدار EEDR رو دست نخورده بر میگردونه
                          برای همین برنامه رو به شکل زیر تغییر دادم و دوباره دارم تست میکنم که الان به 17 میلیون رسیده
                          ضمنا خونه 1022 رو با روش خاموش روشن کردن هم تست کردم کاملا سالمه
                          دوستان فقط یه خواهشی ازتون دارم اگر لطف کنید شما هم همین برنامه رو عملا تست کنید و نتیجه رو اینجا بگین خیلی عالی میشه :nice:


                          کد:
                          $regfile = "m32def.dat"
                          $crystal = 8000000
                          Config Lcd = 16 * 2
                          Config Lcdpin = Pin , Db4 = Pb.0 , Db5 = Pb.1 , Db6 = Pb.2 , Db7 = _
                           Pb.3 , E = Pb.5 , Rs = Pb.4
                          Config Timer1 = Timer , Prescale = 1024
                          Enable Timer1
                          On Timer1 Timer1_isr
                          Timer1 = 57000
                          Enable Interrupts
                          Start Timer1
                          Cls
                          
                          Dim A As Byte
                          Dim B As Byte
                          Dim C As Long
                          
                          Do
                          Disable Interrupts
                          A = Rnd(255)
                          Wait0:
                          sbic eecr,eewe
                          Goto Wait0
                          '-------------------- writing A to 1022
                          Eear = 1022
                          Eedr = A
                          Set Eemwe
                          Set Eewe
                          
                          '--------------------- reading B from another address for change EEDR
                          Wait1:
                          sbic eecr,eewe
                          Goto Wait1
                          
                          
                          Eear = 1021
                          Set Eere
                          B = Eedr
                          '----------------------- reading B from 1022
                          Wait2:
                          sbic eecr,eewe
                          Goto Wait2
                          
                          
                          Eear = 1022
                          Set Eere
                          B = Eedr
                          
                          Enable Interrupts
                          '------------------------ compare A and B
                          If A <> B Then
                          Stop Timer1
                          Locate 1 , 1 : Lcd "c =" ; C
                          Locate 2 , 1 : Lcd "eeprom damaged"
                          Do : Loop
                          End If
                          Incr C
                          Loop
                          
                          End
                          
                          
                          Timer1_isr:
                          Timer1 = 57000
                          Locate 1 , 1 : Lcd "c =" ; C
                          Locate 2 , 1 : Lcd "a=" ; A ; ; " " ; "b=" ; B ; "  "
                          Return

                          دیدگاه


                            #14
                            پاسخ : عملیات انتحاری با AVR

                            نوشته اصلی توسط DesignerEng
                            طرز استفاده شما از eeprom مانند یک متغیر sram هست پس به جای eeprom حافظه sram را اختصاص می دهد که سرعت اجرای برنامه بالاتر رود
                            خب اگه بریزه روی حافظه sram یدفه برق بره که اطلاعات روی sram میپره.فکر نکنم اینطوری باشه!!
                            نوشته اصلی توسط 8787
                            همونطور که می دونید توی دیتا شیت میکروها یه عددی برای محدودیت نوشتن در eeprom تعیین شده که برای مثلا mega32 این مقدار برابر 100000 هست
                            شای منظور کمپانی نوشتن و پاک کردن باشه نه نوشتن خالی

                            دیدگاه


                              #15
                              پاسخ : عملیات انتحاری با AVR

                              نوشته اصلی توسط saeiddiod
                              خب اگه بریزه روی حافظه sram یدفه برق بره که اطلاعات روی sram میپره.فکر نکنم اینطوری باشه!!شای منظور کمپانی نوشتن و پاک کردن باشه نه نوشتن خالی
                              پاک کردن هم همون نوشتنه دیگه FF میریزه توش

                              دیدگاه

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