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

Obsługa wewnętrznej pamięci EEPROM w Atmega8

Paweł Frąckowiak 15 Wrz 2010 17:02 3228 16
  • #1 8513703
    Paweł Frąckowiak
    Poziom 11  
    Witam serdecznie!

    Chciałbym się dowiedzieć czy istnieje jakaś możliwość odgórnego zdefiniowania zmiennej typu float/double w pamięci EEPROM przy jednoczesnym nadaniu jej wartości.

    Do tej pory robiłem to w ten sposób, ze tworzyłem zmienną w eepromie i za pomocą te funkcji:
    
    void eeprom_write_block(const void *src, void*dst, size_t n)
    

    zapisywałem do niej jakąś tam wartość, ale w sumie to nie do końca spełnia moje oczekiwania.

    Mnie bardziej chodziło by o coś co już podczas wgrywania programu do uC zapisywałoby ta zmienną do eepromu, a nie dopiero w chwili rozpoczęcia działania aplikacji na uC. W programie chce tylko tą zmienną odczytywać i nic więcej z nią nie robić.

    Z góry dzięki za pomoc!!!
  • #3 8514059
    Paweł Frąckowiak
    Poziom 11  
    niestety to co poradziłeś mirekk36 nie działa tak jak bym chciał bo gdy próbuje tą zmienną odczytać za pomocą funkcji:
    
    void 	eeprom_read_block (void* dst, const void* src, size_t n)
    


    to jako wynik na wyświetlaczu otrzymuje NAN co raczej świadczy, że to odczytałem nie jest zapisanym floatem
  • #4 8514070
    szelus
    Poziom 34  
    A wgrałeś zawartość EEPROM?
  • #5 8514094
    mirekk36
    Poziom 42  
    dokładnie, jak mówi kolega wyżej. Skoro wgrywasz plik *.hex w którym masz przecież wszystkie zdeklarowane zmienne typu PROGMEM to po kompilacji musisz także wgrać plik *.eep , który zawiera zmienne typu EEPROM

    Pamiętaj tylko o jednym. Gdy kiedyś w twoim urządzeniu coś się stanie z pamięcią EEPROM, awaria, coś ją skasuje czy inny diabeł to masz w plecy takie żmudne wklepywanie zmiennych na etapie kompilacji i po kolejnym starcie znowu będziesz miał MAN tzn wartość 0xFF

    Normalnie ja zawsze robię tak, że domyślne wartości trzymam w pamięci FLASH. Przy pierwszysm starcie sprawdzam czy w obszarze zadeklarowanych zmiennych w EEPROM są same 0xFF. Jeśli tak to odpala się procedurka napełniająca EEPROM wartościami domyślnymi. Dzięki temu nie straszne mi nieprzewidziane przypadki po przypadkowej utracie wartości w EEPROM
  • #6 8514098
    Paweł Frąckowiak
    Poziom 11  
    no i tutaj wracamy do początku :-)
    Mój pierwszy post tego właśnie dotyczy - jak wgrać coś do EEPROM ale nie już w programie wykonywanym na procku tylko na etapie wgrywanie programu do uC.
  • #7 8514110
    mirekk36
    Poziom 42  
    No toż ci podpowiadamy jak wgrać coś do EEPROM - jak pytasz .

    Gdy programujesz procesor plikiem hex to zaprogramuj go także plikiem eep - toż o to ci chodzi. No chyba że już sam się pogubiłeś i nie wiesz o co ci chodzi.

    Dodano po 1 [minuty]:

    Podpowiedziałem ci tylko czym będzie skutkowało w przyszłości takie wgrywanie "ręczne" pliku eep ze zdefiniowanymi w kodzie programu wartościami zmiennych

    Przeczytaj jeszcze raz uważnie to co napisałem wcześniej. Sam początek.
  • #8 8514181
    Paweł Frąckowiak
    Poziom 11  
    Przepraszam za zamieszanie!!!
    Teraz już wszystko rozumiem, po prostu jakimś cudem nie widziałem twojego drugiego posta.
  • #9 8514260
    gaskoin
    Poziom 38  
    mirekk36 napisał:
    zmienne typu PROGMEM (...) zmienne typu EEPROM


    To nie jest typ, tylko atrybut. Ściślej - jest to atrybut, zawierający informację gdzie kompilator ma umieścić daną zmienn
  • #10 8514797
    Konto nie istnieje
    Konto nie istnieje  
  • #11 8514855
    mirekk36
    Poziom 42  
    No właśnie, nie ma to jak poprawiać tego - co i tak zostało dobrze zrozumiane. To chyba oczywiste, że słówko PROGMEM czy EEMEM to nie żadne typy danych - więc można było łapać mnie za słówka ;) tylko po co? skoro to nie są też żadne atrybuty ;) .... tylko nazwy utworzone za pomocą dyrektyw preprocesora o czym wspomniał ktoś wyżej ;) jak już się tak uściślać.

    Dodano po 1 [minuty]:

    albertb napisał:

    Po drugie nie EEPROM, a EEMEM. Co w wypadku uściślania jest dość ważne.


    No a tutaj się chyba koledze pomyliło - bo jednak nie EEPROM się używa tylko EEMEM w stosunku do deklarowanej zmiennej , któa ma leżeć w pamięci EEPROM. Mowa o AVR GCC - jeśli chodzi o mnie ;)
  • #12 8514900
    Konto nie istnieje
    Konto nie istnieje  
  • #13 8514930
    mirekk36
    Poziom 42  
    mirekk36 napisał:
    A jak deklarujesz np zmienną w pamięci FLASH ???

    uint8_t PROGMEM a = 2;

    podobnie dla EEPROM'a

    uint8_t EEMEM a = 2;


    No ja pisałem EEMEM przecież

    Dodano po 1 [minuty]:

    aha no i kolega gaskoin coś namieszał z tym EEPROM ;)
  • #14 8514954
    Konto nie istnieje
    Konto nie istnieje  
  • #15 8514990
    gaskoin
    Poziom 38  
    albertb napisał:
    To nie są żadne atrybuty tylko makrodefinicje (ściślej dyrektywy preprocesora) zdefiniowane w plikach nagłówkowych.


    Skoro już się tak zagłębiasz to może zerknij co to są za makrodefinicje, zanim napiszesz, że bzdura i nieprawda.

    Poza tym, co to za uściślenie - makrodefinicje (ściślej dyrektywy preprocesora). Przecież makro jest jedną z dyrektyw, a nie dyrektywa jednym z makr :D

    A chodziło o atrybuty zmiennych (w tym przypadku), za pomocą których, można powiedzieć kompilatorowi gdzie ma ja umieścić (co już napisałem).

    Nie wiem o co się czepiasz tak naprawdę.

    Jak chcesz ściślej to proszę:

    
    #define        EEMEM        __attribute__((section(".eeprom")))
    #define        PROGMEM   __attribute__((section(__progmem__)))
    



    mirekk36 napisał:

    aha no i kolega gaskoin coś namieszał z tym EEPROM ;)


    przeczytaj swój drugi post zanim coś walniesz znowu :)

    Ta dyskusja jest conajmniej bez sensu
  • #16 8515045
    mirekk36
    Poziom 42  
    albertb napisał:
    Weź głęboki oddech, albo kilka.
    Potem sprawdź, do którego posta ja się ustosunkowywałem.
    Potem sprawdź, który Twój post był cytowany w poście gaskoina.
    A potem, jak będziesz się powoływał na swój zupełnie inny to ...
    to i tak kończę bo nie bawią mnie pyskówki z Tobą

    Albert.


    Przyznałem grzecznie wyżej, że się pomyliłem zanim jeszcze odpowiedziałeś, przyznając zresztą ci rację w pierwszej części wypowiedzi a o drugą zapytałem. Czytaj więc uważniej panie pyskówkarz ;) żenujący jest rzeczwiście poziom dyskusji z tobą żeby nie nazwać prostacki.

    Dodano po 3 [minuty]:

    gaskoin napisał:

    przeczytaj swój drugi post zanim coś walniesz znowu :)

    Ta dyskusja jest conajmniej bez sensu


    rzeczywiście oftop się zrobił ;) ale walnąłeś to ty panie kolego, ja tylko nieszczęśliwie co przyznaję użyłem określenia "typu EEPROM" , "typu PROGMEM" ale nie pisałem , że stosuje się słówko EEPROM w miejsce EEMEM przy deklaracji zmiennej. Ty się natomiast doczepiłeś do określenia "typu EEPROM" sugerując, że ja mam na myśli iż jakiś tam typ EEPROM to to mniej więcej może to samo co np typ int (bzdura i można się było tego domyśleć nawet z kontekstu wypowiedzi, że nie chodzi o typ zmiennej tylko o określanie rodzaju zmiennej rzekłbym na swoje wytłumaczenie... co nie zmienia faktu, że przyznaję, iż określenie mogłobyć dwuznaczne).

    I tak z igły zrobiły się dzięki tobie widły ;)
  • #17 8515093
    Konto nie istnieje
    Konto nie istnieje  
REKLAMA