Elektroda.pl
Elektroda.pl
X

Wyszukiwarki naszych partnerów

Wyszukaj w ofercie 200 tys. produktów TME
Europejski lider sprzedaży techniki i elektroniki.
Proszę, dodaj wyjątek elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Ram, flash, eeprom - Właściwe korzystanie z pamięci mikrokontrolera

szegerege1 06 Sie 2015 09:44 918 7
  • #1 06 Sie 2015 09:44
    szegerege1
    Poziom 7  

    Witam szanowne forum.
    Chciałbym poprosić o wyjaśnienie zagadnienia odnośnie prawidłowego korzystania z pamięci ram, flash, oraz eeprom.
    Jak doczytałem na forach i w notach katalogowych, ilość zapisu do pamięci flash i eeprom jest ograniczona.Rozumiem, że chodzi tutaj o moment kasowania i ponownego zapisu np, wsadu do procesora ( tu chyba nie przekroczymy limitu :D ).
    A jak to jest np. w sytuacji, kiedy zmienimy tekst na wyświetlaczu lcd, zapiszemy go do pamięci eeprom i następnie wyświetlamy cyklicznie w pętli, jak w kodzie niżej:


    Kod: c
    Zaloguj się, aby zobaczyć kod



    Jest to co prawda odczyt z eeprom, a nie zapis, ale odbywa się w pętli wiele razy na sekundę.
    Czy taka metoda i podejście jest prawidłowe z punktu programu ?.
    Zmiana tekstu odbywa się bardzo rzadko i wyświetlanie ma raczej charakter czysto statyczny.
    Jak powinienem do tego podejść, czy może tak zostawić bo jest dobrze ?

    Proszę doświadczonych kolegów o wyjaśnienie.Dziękuję.

  • #2 06 Sie 2015 22:12
    373522
    Usunięty  
  • #3 06 Sie 2015 23:32
    szegerege1
    Poziom 7  

    Witam niveasoft. Dziękuję za odpowiedż na moje pytanie.
    Rozumię sens Twojej odpowiedzi na ten temat. Mam pytanie odnośnie ładowania przy starcie zawartości pamięci eeprom do ram w celu wyświetlenia na lcd. Jak to prawidłowo zainicjować. Chodzi o użycie:

    eeprom_read_block (&tab1, &tab2, sizeof(tab1));

    Czy należy umieścić instrukcję w pętli,czy w main...W pętli będzie się wykonywać odczyt wielokrotnie. Przepraszam za takie pytania, ale dopiero staram się zrozumieć, z czym to wszystko sie je.
    Mam jeszcze pytanie, jak powinna wyglądać prawidłowa składnia kopiowania, jeśli jest np. kilka tablic?
    Jak byś mógł coś pokazać na przykładzie mojego kodu wyżej.
    Z góry dziękuję.

  • #4 07 Sie 2015 00:33
    373522
    Usunięty  
  • #5 07 Sie 2015 09:56
    dondu
    Moderator Mikrokontrolery Projektowanie

    szegerege1 napisał:
    Jak doczytałem na forach i w notach katalogowych, ilość zapisu do pamięci flash i eeprom jest ograniczona.Rozumiem, że chodzi tutaj o moment kasowania i ponownego zapisu np, wsadu do procesora ...

    Nie da się inaczej zinterpretować dokumentacji:

    Cytat:
    Write/Erase Cycles: 10,000 Flash/100,000 EEPROM


    Odczyt więc nie wpływa na dane w tych pamięciach, a robi to jedynie temperatura:

    Cytat:
    Data retention: 20 years at 85°C/100 years at 25°C(1)

    1) Reliability Qualification results show that the projected data retention failure rate is much less
    than 1 PPM over 20 years at 85°C or 100 years at 25°C.




    szegerege1 napisał:
    eeprom_read_block (&tab1, &tab2, sizeof(tab1));

    Czy należy umieścić instrukcję w pętli,czy w main...W pętli będzie się wykonywać odczyt wielokrotnie.
    ...
    Jak powinienem do tego podejść, czy może tak zostawić bo jest dobrze ?

    Jeśli odczytałeś EEPROM do tablicy w SRAM i nie zmieniałeś więcej zawartości tej tablicy, to po co chcesz ponownie odczytywać ten sam tekst z EEPROM i ponownie ładować do SRAM?


    Poboczna uwaga:

    Twój program z maksymalną możliwą częstotliwością wysyła dane do LCD - po co? Przecież oko ludzkie tego nie zauważy, a mikrokontroler zmęczy się strasznie i niepotrzebnie i w tych upałach trzeba będzie mu napojów chłodzących dostarczyć :) tym bardziej, że:

    szegerege1 napisał:
    Zmiana tekstu odbywa się bardzo rzadko i wyświetlanie ma raczej charakter czysto statyczny.

    Wyświetlaj więc tekst tylko wtedy, gdy coś się zmienia i należy to pokazać na LCD.

  • #6 07 Sie 2015 14:00
    szegerege1
    Poziom 7  

    Witam i dziękuję za odpowiedź.

    Co do ciągłego odczytu z pamięci eeprom, to oczywiście nie było to moim celem, jak równierz nie podobało mi się , że odbywa się to w pętli miliony razy na sekundę. Dlatego zadałem pytania w poprzednich postach. Na tą chwilę ładowałem dane z eepromu do lcd po pierwsze, a żeby sprawdzić, czy kopiowanie działa, po drugie, nie wiedziałem do końca, jak przy starcie urządzenia zrobić, a żeby nastąpiło pobranie danych z eeprom do ram i potem już "normalna praca" z pominięciem eeprom. Dlatego zadałem pytania w poprzednich postach, jak to zrobić, ale nie otrzymałem odpowiedzi. Nie mniej jednak wczoraj udało się to opanować na zasadzie:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Jeśli dokonam zmiany tekstu na lcd, to zapisuję do eeprom:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Mam jeszcze problem, jak zapisać np. kilka tablic za pomocą tych komend.Na tą chwilę nie pracuję jeszcze ze strukturami i wskaźnikami(czytam i staram się zrozumieć).Chodzi mi o prawidłową składnię instrukcji, jak to zrobić. Np. tablice:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Myślę, że jest jakaś prosta opcja zapisu przy użyciu :

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Gdyby ktoś zechciał mi podpowiedzieć.

    Ponadto ciągłe użycie procesora, kiedy urządzenie jest włączone i tylko wyświetla niezmienną informację na lcd istotnie mija się z celem, ale informacja musi pozostać na ekranie i kiedy zechcę wprowadzić nowy tekst, to musi zareagować na przyciski i potem może przejść w tryb uśpienia(jeżeli tak można) i stany na pinach procesora muszą pozostać niezmienne.

    Tylko dondu, jak mam to zrobić, jak się do tego zabrać i czy powyższy sposób zapisu do eeprom robię własciwie i czy prawidłowo ładuję do ram przy starcie.

    Na ten moment działa wszystko tak, jak sobie wymyśliłem, ale nie chcę, a a żeby to było nie zgodnie ze sztuką i a żeby nie nabierać złych nawyków na samym poczatku. Potem tak zostanie :D .

    Dziękuję.

  • #7 07 Sie 2015 19:14
    dondu
    Moderator Mikrokontrolery Projektowanie

    1. Dobrze wykombinowałeś - odczyt z EPROM do RAM przed pętlą główną.

    2. Zapis wielu tablic dobrze realizujesz - nie rozumiem w czym masz problem?

    3. Na wszelki wypadek napiszę: Dane w pamięci SRAM są przechowywane poprawnie podczas uśpienia mikrokontrolera - podobnie stany innych rejestrów w tym tych dot. pinów.

    4. Używaj symulatora w Atmel Studio - zobaczysz pięknie jak działa Twój program. :)

  • #8 07 Sie 2015 23:22
    szegerege1
    Poziom 7  

    Witam dondu.
    Cieszę się, że moje myślenie jest właściwe. Jak pisałem wcześniej, dopiero się uczę, ale logika nie jest mi obca i to pomaga mi dość szybko łapać, o co chodzi.Jeśli chodzi o kopiowanie tablic do eeprom, to już nie mam z tym problemu, ale tylko z jedną tablica.A jesli są np. cztery ?

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Jeszcze nie sprawdziłem, tylko myślę, że ten sposób jest własciwy:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Chodziło mi o to, że pewnie jest jakiś inny, prostszy sposób, no i muszę sprawdzić, czy jak wyżej jest dobrze.I jakie powinno byc minimalne opóźnienie, ponieważ myślę, że procesor potrzebuję trochę czasu na pełny zapis do eeprom, zanim zacznie wykonywac kolejne instrukcję.

    No i jeszcze jedno.

    Jeśli zmienię dane tylko w jednej linijce, to po co zapisywać 4 linijki, a tak będzie w kodzie wyżej ( jeśli jest prawidłowy ).

    A może jest to nie istotne i nie zawracać sobie tym głowy ?.

    Jak ograniczyć użycie procka.

    Dziękuję za wszelkie informacje.

    Dodano po 12 [minuty]:

    Sprawdziłem i działa zapis do pamięci i potem odczyt wszystkich linijek, ale pojedyńczo w tym przypadku nie da rady.

    Kiedyś przemknęło mi przed oczami "update block", czy jakoś tak.Jak zrobić ?

 Szukaj w ofercie
Zamknij 
Wyszukaj w ofercie 200 tys. produktów TME