Elektroda.pl
Elektroda.pl
X

Wyszukiwarki naszych partnerów

Wyszukaj w ofercie 200 tys. produktów TME
Kategoria: Kamery IP / Alarmy / Automatyka Bram
Montersi
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 897 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
    niveasoft
    Poziom 34  

    Eeprom służy do zapisu parametrów i ustawień których nie można zaprogramować podczas programowania mikrokontrolera. Są to parametry "wyuczone", zdobyte przez mikrokontroler podczas pracy programu a maja być pamiętane.
    Możesz sobie czytać z tego Eeproma w kółko ale kosztuje Cię to czas.
    Ja pracuję tak że działam w programie na RAM bo ma szybszy dostęp. Wszystko w programie dzieje się na zmiennych z RAM i obszaru kodu programu.
    Dane z EEPROM czytam tylko w wypadku rozruchu mikrokontrolera i nimi zapełniam zmienne w RAM i na nich cały czas pracuję. Jeśli ma sie zmienić napis na wyświetlaczu i być pamiętany to robię to tak że:
    Wyswietlacz otrzymuje nowy napis ale z danych RAM a nowe dane do zapamiętania są zapisywane w EEPROM. Tylko w wypadku zaniku zasilania czytam EEPROM. Normalnie działam na RAM bo szybciej :P

    Ważną rzeczą kiedy zaczniesz korzystać z zapisów do EEProma to ustawić w mikrokontrolerze FuseBity odpowiedzialne za utrzymywanie go w stanie Reset do czasu ustalenia się napięcia zasilania które gwarantuje prawidłowe odczyty/zapisy do EEPROM.
    W skrócie FuseBity BODEN i BODLEVEL odpowiadają za to że dopóki napięcie nie osiągnie na przykład 2,7V mikrokontroler poczeka ze startem programu.
    Jest to BARDZO WAŻNE i opisane w nocie katalogowej.

    Przykładem niech będzie to że mam sterownik który ma napisy przeniesione do EEPROM ze względu na oszczędność miejsca we FLASH.
    Po burzy wyświetlał krzaki. Podczas burzy napięcie zasilające "skakało"
    Można to rozwiązać lepszym zasilaczem..ale proszę mieć na uwadze, że w nocie katalogowej pisze wyraźnie by włączyć BODEN kiedy korzysta się z EEPROM i to definitywnie rozwiązało problem z krzakami na LCD.

  • #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
    niveasoft
    Poziom 34  

    Jest ogrom stron traktujących o mikrokontrolerach, ale jakoś na żadnej nie jest napisane wprost co robi mikrokotroler bezpośrednio po włączeniu i potem dalej... tak żeby ktoś wprost napisał.

    Chętnie zerknę na każdy link jeśli ktoś się ze mną nie zgadza, pozwolę sobie przedstawić mój tok myślenia.

    Na początku po włączeniu zasilania mikrokontroler odczytuje FuseBity odpowiedzialne za jego konfigurację.

    Może być tak że ustawiony jest Bit BOOTRESETVECTOR - wróce do tego później.

    Tak więc załóżmy że startujemy.. Procek komórka po komórce czyta zawartość flash która przekłada się na komendy. Zrób to albo tamto.

    Taka komenda może też być rozkazem "wróć na miejsce pamięci &Hxxxx"

    Na razie po restarcie wypada ustawić porty we własciwe pożądane przez nas stany.
    Będziemy potrzebowali zmiennych RAM więc też je inicjujemy i - to ważne nadajemy im wartości- to może być zero albo i nie...

    Te początkowe zadania którymi nikt sobie głowy nie zaprząta załatwia za nas kompilator..

    Ale spójrzmy na to od strony mikrokontrolera..

    Startuje z pozycji startowej swojego Flasha i czyta po kolei co ma robić.

    Komórka po komórce poczytał i ustawił to co chciałeś. Teraz czas na Twoja pętle główną...

    Jeśli na przykład ustawianie portów i tam wstępna konfiguracja zajęła kilka bajtów, a pamiętajmy że czytamy flash komórka po komórce interpretując rozkazy..jesteśmy powiedzmy kilka bajtów dalej..&Hxxxx+kilka bajtów

    To na końcu pętli While kompilator wpisze wróć do tego miejsca "&Hxxxx+kilka bajtów"

    Tak na prawdę pętla polega na tym że na końcu pisze "wróć pod adres"

    Teraz w odpowiedzi na Twoje zapytanie... najprostszym wyjściem byłoby przed petlą główną wczytać dane z EEPROM do pamięci RAM.. Potem pętla główna i się kręci..
    W większości wypadków to wystarczy :P

    ..ale można inaczej

    na przykład jeśli zmienna ma wartość 0 to wczytać wartości z EEPROM a podczas odczytu z EEPROM zmieniasz wartość tej zmiennej na 1..

    Jeśli w programie będzie Ci potrzebne kolejne wczytanie zmiennych możesz zmienić wartość z powrotem na 0 i znów się wczytają..

    W mojej wypowiedzi sens miał być taki, że nie ma jednoznacznej odpowiedzi na to jak zrobić odczyt z EEPROM. Zależne jest to od tego co będzie Ci potrzebne.

    Łatwiej jest odpowiedzieć kiedy ktoś zapyta jak zapamiętać ustawienia akwarium :D

    Ludzi ogranicza tylko ich pomysłowość i wiedza.

    Na koniec .."UNIE" to może być hasło w C żeby łączyć EEPROM ze zmiennymi..ale czy jedyny słuszny..nie mnie oceniać

  • #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ć ?

 
Promocja -20%
Zamknij 
Wyszukaj w ofercie 200 tys. produktów TME
tme