logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Jak zapisać i odczytać wartości uint16_t w EEPROM Xmega w C?

mas24 28 Maj 2016 21:38 1197 5
REKLAMA
  • #1 15705523
    mas24
    Poziom 16  
    Witam,

    Chciałem zapisać kilka wartości, które przechowuje w zemiennych typu uint16_t, by potem je odczytać po ponownym włączeniu zasilania. Poczytałem trochę o EEPROM w Xmega i dotarłem do żródła sterownika eepromu. Przykład jest dla mnie zagmatwany, więc prosiłbym o kilka słów wyjaśnień, lub wskazanie miejsca, gdzie jest to dobrze opisane. Nie rozumiem kilku rzeczy, np. o co chodzi w stronach i ich zapisywaniu/odczytywaniu z EEPROM? Czy podobnie jak w Atmega, lepiej stworzyć całą klasę zemiennych i przesyłać jako całą do EEPROMu?
  • REKLAMA
  • #2 15705670
    tmf
    VIP Zasłużony dla elektroda
    Przykłady bardziej zaawansowanego użycia EEPROM masz w przykładach do moich książek o XMEGA, tam też jest to dokładnie opisane. W skrócie - możesz w XMEGA korzystać z EEPROM dokładnie tak jak w ATMega (czyli funkcje z eeprom.h), lub możesz wykorzystać dodatkowe możliwości jakie daje kontroler w XMEGA. Czyli możliwość mapowania EEPROM w obszar SRAM, dzięki czemu znika ci dodatkowa przestrzeń adresowa i do zmiennych w EEPROM możesz się dobrać tak jak do pozostałych zmiennych programu, oraz możliwość zapisu blokami. Zapis pojedynczej komóki trochę trwa, ponieważ blok ma 32 bajty i jego zapis jest jednoczesny, stąd daje to teoretycznie nawet 32-krotne przyśpieszenie zapisu do EEPROM. Generalnie trzeba dobrze przemyśleć co potrzebujesz.
  • REKLAMA
  • #3 15706258
    RomanFilipecki
    Poziom 18  
    Zgadza się, też się poisiłkowałem książką TMF.
  • REKLAMA
  • #4 15706534
    mas24
    Poziom 16  
    Na razie próbuję to zrobić w tradycyjny, "Atmegowy" sposób, gdyż mam to już przećwiczone.
    Na razie procedurka sprawdza, czy w EEPROMie jest FF (lub FFFF dla 16 bitowych zmiennych) i ustawia wartości domyślne. Jednak po odczytaniu, wartości zmiennych nie sa na swoich miejscach. Wpisuję 5 danych typu uint8_t i 8-elementową tablicę uint_16 t.

    W której książce jest to opisane? Mam Układy Peryferyjne i Praktyczne Projekty, brakuje mi tej "pierwszej" książki.
  • REKLAMA
  • #5 15706564
    tmf
    VIP Zasłużony dla elektroda
    mas24 napisał:
    Na razie próbuję to zrobić w tradycyjny, "Atmegowy" sposób, gdyż mam to już przećwiczone.
    Na razie procedurka sprawdza, czy w EEPROMie jest FF (lub FFFF dla 16 bitowych zmiennych) i ustawia wartości domyślne. Jednak po odczytaniu, wartości zmiennych nie sa na swoich miejscach. Wpisuję 5 danych typu uint8_t i 8-elementową tablicę uint_16 t.

    W której książce jest to opisane? Mam Układy Peryferyjne i Praktyczne Projekty, brakuje mi tej "pierwszej" książki.


    W "AVR. Praktyczne projekty" masz rozdział:
    Rozdział 8. Kontroler NVM - jak prosto i przyjemnie dobrać się do pamięci, a w nim 45 stron o dobieraniu się do EEPROM:
    Kod: Text
    Zaloguj się, aby zobaczyć kod


    Niemniej jeśli odwołujesz się do EEPROM tak jak w ATMega to działa to identycznie jak w starszych prockach. Pokaż kod, bo zapewne tu leży jakiś problem.
  • #6 15706605
    mas24
    Poziom 16  
    OK, oto kod:

    Plik EEP.h
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    plik EEP.C

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    i teraz w programie głównym:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    EDIT

    OK, poradziłem sobie, jak mniemam. Wywaliłem ze struktury zmienną "wybrany", która pointowała zapisywaną w EEprom tablicę już w programie. Przy starcie programu są na niej wykonywane różne operacje i stad wartości talicy nie na swoicch miejscach. Dodatkowo stworzyłem dodatkową funkcję EEP_UpdateX, gdzie odremowane są instrukcje "cli()" i "sei()", co dodatkowo poprawiło zapisywanie zmiennych do eeprom. Warto zatrzymać na chwilę przerwania (nie pokazane w przykładowym kodzie), by procek spokojnie zapisał dane do EEProm.

    Zacząłem także czytać wskazany przez Kolegę tmf rozdział. Jesli nie wykorzystam tej wiedzy w tym programie, przyda się na przyszłość.
REKLAMA