Tăng số lần ghi đọc EEPROM

Collapse
X
 
  • Giờ
  • Show
Clear All
new posts
  • luulinh
    Thành viên tích cực
    • Jun 2006
    • 316

    #1

    Tăng số lần ghi đọc EEPROM

    EEPROM của em phải ghi đi ghi lại nhiều lần,mà lại chỉ dùng có mỗi 1 Byte thui, trong khi số lần ghi nó là có hạn. Cứ ghi mãi thì nó sẽ hỏng, mà lại chỉ hỏng một Byte . Em đang muốn dùng tất cả EEPROM để lưu trữ, như vạy ghi xóa thỏai mai.
    Các bác cho em ý kiến nhá.
    ●█═██▄▄▄▄▄▄▄▄▄
    ▄▅██████▅▄▃▂
    ████████████████
    ◥⊙▲⊙▲⊙▲⊙▲⊙▲⊙▲◤
  • hiodong
    Thành viên tích cực
    • Sep 2005
    • 433

    #2
    Đọc datasheet thấy ghi đọc những 1.000.000 lần , cứ dùng tẹt đi
    Cung cấp Oscilocope , Inverter , Switching , DC power supply , AC millivolt meter ....

    Comment

    • luulinh
      Thành viên tích cực
      • Jun 2006
      • 316

      #3
      Nguyên văn bởi hiodong Xem bài viết
      Đọc datasheet thấy ghi đọc những 1.000.000 lần , cứ dùng tẹt đi
      HÌnh như hơi quá bác ạ! làm gì tận 1 MIL . Ví dụ như ATmega8 có 10.000 lần "bọ"
      Mà dù cho 1 MIL thật nhưng cứ 1 s ghi và phát kiểu gì chả hỏng.
      ●█═██▄▄▄▄▄▄▄▄▄
      ▄▅██████▅▄▃▂
      ████████████████
      ◥⊙▲⊙▲⊙▲⊙▲⊙▲⊙▲◤

      Comment

      • blackmoon
        Thành viên tích cực
        • Jul 2005
        • 363

        #4
        Lưu trữ dữ liệu khi mất nguồn nuôi

        Nguyên văn bởi luulinh Xem bài viết
        HÌnh như hơi quá bác ạ! làm gì tận 1 MIL . Ví dụ như ATmega8 có 10.000 lần "bọ"
        Mà dù cho 1 MIL thật nhưng cứ 1 s ghi và phát kiểu gì chả hỏng.
        Bộ nhớ EEPROM hay các loại non-volatile nói chung dùng để lưu dữ liệu khi mất nguồn nuôi, còn bình thường khi nguồn đầy đủ thì bạn load ra RAM mà dùng, sao phải mỗi giây phải lưu 1 lần vào EEPROM?
        Có thể có nhiều cách để duy trì giá trị của dữ liệu. Có thể dùng thêm pin ngoài + chế độ tiết kiệm năng lượng, hoặc dùng 1 mạch phát hiện mất nguồn nuôi để báo về AVR khi nguồn sụt, lúc đó lưu dữ liệu lại cũng kịp (cỡ một vài milisec cho 1 byte thôi mà).... Dùng cách nào thì phụ thuộc project của bạn, đúng thế không nhỉ?
        Thân mến,

        Comment

        • thavali
          Thành viên tích cực
          • Mar 2006
          • 246

          #5
          ý của bạn luulinh khá hay, thực sự thì cái ổ cứng ta sài cũng được Window nó ghi theo kiểu như vậy, nhằm để hạn chế tình trạng dữ liệu cứ ghi hoài lên một phân vùng nào đó, còn những phân vùng khác lại không được ghi => mau hư ổ cứng.với MCU cũng có thể bắt chước như vậy. Cách thực hiện là: ghi vào EERPOM ở một địa chỉ có giá trị ngẫu nhiên.
          Như vậy bạn phải có hàm tạo số ngẫu nhiên có giá trị từ 0 - size eeprom.
          chẳn hạn (viết bằng codevisionAVR):

          int var_add = Random();// tạo giá trị ngẫu nhiên cho biến
          eeprom int var_eeprom @var_add ;// tạo biến var_eeprom trong eeprom có địa chỉ var_add
          // làm gì với biến var_eeprom thì tùy

          .......

          mỗi lần ghi vào eeprom thì gọi lại random()

          Hàm random() bạn phải tự viết, hoặc dùng hàm thư viện stdlib.h:
          int rand (void): hàm này tạo số ngẫu nhiên từ 0-32767

          có ý nào hay hơn xin bạn bổ sung
          Last edited by thavali; 16-04-2008, 13:30.

          Comment

          • luulinh
            Thành viên tích cực
            • Jun 2006
            • 316

            #6
            Nguyên văn bởi thavali Xem bài viết
            ý của bạn luulinh khá hay, thực sự thì cái ổ cứng ta sài cũng được Window nó ghi theo kiểu như vậy, nhằm để hạn chế tình trạng dữ liệu cứ ghi hoài lên một phân vùng nào đó, còn những phân vùng khác lại không được ghi => mau hư ổ cứng.với MCU cũng có thể bắt chước như vậy. Cách thực hiện là: ghi vào EERPOM ở một địa chỉ có giá trị ngẫu nhiên.
            Như vậy bạn phải có hàm tạo số ngẫu nhiên có giá trị từ 0 - size eeprom.
            chẳn hạn (viết bằng codevisionAVR):

            int var_add = Random();// tạo giá trị ngẫu nhiên cho biến
            eeprom int var_eeprom @var_add ;// tạo biến var_eeprom trong eeprom có địa chỉ var_add
            // làm gì với biến var_eeprom thì tùy

            .......

            mỗi lần ghi vào eeprom thì gọi lại random()

            Hàm random() bạn phải tự viết, hoặc dùng hàm thư viện stdlib.h:
            int rand (void): hàm này tạo số ngẫu nhiên từ 0-32767

            có ý nào hay hơn xin bạn bổ sung
            - Khi ta ghi thỉ random, nhưng khi đọc lại thì sao?
            - Tiếp theo là hàm random hình như cũng chỉ là "giả random" thui.

            Cái này em có cách rồi, dùng hết được EEPROM luôn.
            - Nhưng nói chung cách detect mất nguồn như bác BM nói vẫn hay hơn, mặc dù có vẻ lằng nhằng.
            ●█═██▄▄▄▄▄▄▄▄▄
            ▄▅██████▅▄▃▂
            ████████████████
            ◥⊙▲⊙▲⊙▲⊙▲⊙▲⊙▲◤

            Comment

            • kaokuong
              Thành viên chính thức
              • Jul 2007
              • 39

              #7
              không muốn ghi lên 1 byte nhớ nhiều lần thì sau mỗi lần ghi tăng giá trị thanh ghi địa chỉ lên 1 ,đến 1 giá trị nào đó thì quay trở về vị trí ban đầu, trước khi ghi 1byte mới thì nhớ ghi vào vị trí cũ FFH . sau khi mất điện ta phải seach lại toàn bộ eeprom xem ô nào giá trị khác FFH thì lấy( dĩ nhiên số liệu khi ghi phải tránh con số FFH ra).
              nói thì nói thế thối chứ đây là 1 cách làm tồi . khi lập trình ta phải phân tích tình hình để chỉ ghi lên eepom khi thật cần thôi

              Comment

              • zemen
                Thành viên tích cực
                • Nov 2005
                • 536

                #8
                Chơi kiểu này dc không:
                - Trước hết tạo 1 vùng nhớ EEPROM 100 byte, xóa tất cả chúng về 0.
                - Khi cần lưu byte d.liệu ta sẽ xem nó có giá trị bao nhiêu, chẳng hạn d.liệu = 10, thế thì cất nó vào ô nhớ thứ 10. Nếu d.liệu>=100 thì lưu 1 vào ô nhớ 100, xóa hết 99 ô nhớ đầu rồi mới cất phần lẻ vào ô nhớ tương ứng.
                - Khi cần đọc lại, ta sẽ đọc hết cả trăm byte, tìm d.liệu lớn nhất trong 99 byte đầu rồi cộng thêm số lần d.liệu ở byte thứ 100 nếu có.
                Như vậy d.liệu có thay đổi 100 lần thì ta mới chỉ ghi vào EEPROM 2 lần. Số lần nạp lớn nhất cho EEPROM là 10.000 thì d.liệu có thể thay đổi 500.000 lần.
                Nếu 1 ngày thay đổi 1000 lần, 1 tháng là 30.000 lần thì ta có thể dùng EEPROM dc cả năm rồi còn j. Muốn lâu hơn nữa, chắc cũng dc thôi.
                !e

                Comment

                • luulinh
                  Thành viên tích cực
                  • Jun 2006
                  • 316

                  #9
                  không muốn ghi lên 1 byte nhớ nhiều lần thì sau mỗi lần ghi tăng giá trị thanh ghi địa chỉ lên 1 ,đến 1 giá trị nào đó thì quay trở về vị trí ban đầu, trước khi ghi 1byte mới thì nhớ ghi vào vị trí cũ FFH . sau khi mất điện ta phải seach lại toàn bộ eeprom xem ô nào giá trị khác FFH thì lấy( dĩ nhiên số liệu khi ghi phải tránh con số FFH ra).
                  nói thì nói thế thối chứ đây là 1 cách làm tồi . khi lập trình ta phải phân tích tình hình để chỉ ghi lên eepom khi thật cần thôi
                  Nhược điểm cách này là phải đọc trung bình 50% và phải tránh 1 số("FFH" chẳng hạn).
                  Cách em làm khá hơn 1 tẹo (tinh thần vẫn vậy), mỗi khi khởi động sẽ search tìm vị trí của dữ liệu, ghi địa chỉ của nó vào 1 biến trên RAM, bây giờ có làm gì cũng chỉ phải đọc 1 lần. Còn muốn ghi FFH thì xử lý tẹo là được. Xem ra nó cũng đỡ tồi hơn rồi, cái chính là cùng phần cứng đấy lập trình sao cho EEPROM sống lâu hơn thui :P
                  ●█═██▄▄▄▄▄▄▄▄▄
                  ▄▅██████▅▄▃▂
                  ████████████████
                  ◥⊙▲⊙▲⊙▲⊙▲⊙▲⊙▲◤

                  Comment

                  • phucthinhel
                    Thành viên tích cực
                    • Jan 2006
                    • 782

                    #10
                    cách lưu vào ram là hay hơn cả ! nhưng mà khi cúp điện thì cần một khoản thời gian lưu vào eeprom là hiệu quả nhất ! nhưng eeprom thì hạn chế số lần ghi đọc nên cách tốt hơn cả thì lưu vào ram ! vì ram không hạn chế số lần ghi đọc nhưng có nhược điểm là phải có nguồn nuôi cho nó thôi !
                    Mạch nạp Little Programmer
                    MSC-51,AVR,EEPROM ... etc

                    Site Fukusei shop :

                    Comment

                    • luulinh
                      Thành viên tích cực
                      • Jun 2006
                      • 316

                      #11
                      cách lưu vào ram là hay hơn cả ! nhưng mà khi cúp điện thì cần một khoản thời gian lưu vào eeprom là hiệu quả nhất ! nhưng eeprom thì hạn chế số lần ghi đọc nên cách tốt hơn cả thì lưu vàoram ! vì ram không hạn chế số lần ghi đọc nhưng có nhược điểm là phải có nguồn nuôi cho nó thôi !
                      Em biết là hay, nhưng cái chính là muốn hay thì phải làm lại trong khi em đang lười...
                      ..cùng phần cứng đấy lập trình sao cho EEPROM sống lâu hơn thui :P
                      ●█═██▄▄▄▄▄▄▄▄▄
                      ▄▅██████▅▄▃▂
                      ████████████████
                      ◥⊙▲⊙▲⊙▲⊙▲⊙▲⊙▲◤

                      Comment

                      • tam1234
                        Thành viên tích cực
                        • Jul 2005
                        • 233

                        #12
                        Re:

                        Tui có cách này ko biết ổn ko. Lấy ô nhớ cuối cùng của ROM để lưu giá trị Index. Sau một khoảng thời gian chừng vài ngày thay đổi giá trị Index này một lần. Khi ghi dữ liệu thì ghi vào ô nhớ thứ Index và khi đọc thì đọc giá trị Index này rồi mới đọc giá trị đã lưu ở ô thứ Index.

                        Comment

                        • zemen
                          Thành viên tích cực
                          • Nov 2005
                          • 536

                          #13
                          Nguyên văn bởi tam1234 Xem bài viết
                          Tui có cách này ko biết ổn ko. Lấy ô nhớ cuối cùng của ROM để lưu giá trị Index. Sau một khoảng thời gian chừng vài ngày thay đổi giá trị Index này một lần. Khi ghi dữ liệu thì ghi vào ô nhớ thứ Index và khi đọc thì đọc giá trị Index này rồi mới đọc giá trị đã lưu ở ô thứ Index.
                          Cách này hay đấy chứ!
                          !e

                          Comment

                          Về tác giả

                          Collapse

                          luulinh Tìm hiểu thêm về luulinh

                          Bài viết mới nhất

                          Collapse

                          Đang tải...