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

ATMEGA8 - C/C++ - jak zapamiętać zaprogramowane wartości ?

bestmlody 14 Cze 2009 21:52 3258 20
  • #1 6656627
    bestmlody
    Poziom 14  
    Drodzy koledzy...
    Napisałem niedawno program. Jest w innym poście. Nadal go rozwijam i aktualnie pisze funkcje do programowania. Poprostu chciałbym aby moje urządzenie było uniwersalne, programowalne :)
    Włącze urządznie, odpali się z parametrami domyślnymi, zaprogramuje je i jak zapamiętać je, żeby po wyłączeniu i ponownym włączeniu one nie zgineły. Potrzebuje zapamiętać, 4 wartości HEX.
    Jest coś takiego możliwe?
  • #2 6656905
    maly_elektronik
    Poziom 23  
    A od czego posiada kolega pamięć EEPROM w procesorku :?:
    Wystarczy że standardowo zapiszesz te 4 bajty do eepromu (domyślne) a później każde programowanie będzie modyfikowało ich zawartość :) Tylko trzeba pamiętać że eeprom ma ograniczoną ilość zapisu :)

    Pozdrawiam maly_elektronik
  • #3 6657189
    Kolek
    Poziom 25  
    maly_elektronik napisał:
    Tylko trzeba pamiętać że eeprom ma ograniczoną ilość zapisu :)


    100 000 cykli to powiedziałbym żadne ograniczenie, nawet zmiana zawartości 10 razy dziennie to nadal 10 000 dni. Wiadomo niektóre kontrolery zniosą więcej inne mniej, ale mniej więcej powinno się zgadzać z danymi katalogowymi. Jak trzeba zapamiętać coś co się zmienia bardzo często to warto pomyśleć o jakiejś małej pamięci ram i podtrzymaniu bateryjnym.
  • #5 6659540
    bestmlody
    Poziom 14  
    Bardzo się ciesze, że coś takiego da się zrobić, ale czy ktoś mógłby pokazać na konkretnym przykładzie?

    x=0xFF; //zmienna globalna
    void programowanie()
    {
    wprowadzam nowe wartości;
    np. x=0xF0;
    --- zapamiętuje do pamięci ---
    }

    Jak powinien wyglądać ten fragment ? Czy to jakieś bardzo skomplikowane funkcje?
  • #6 6659914
    rsikon
    Poziom 26  
    A może ciut sięwysilić i poszukać np. na google:

    Link

    i poczytaj o: avr/eeprom.h
  • #7 6770702
    bestmlody
    Poziom 14  
    no dobra
    a mógłby mi ktoś napisać przykładowy program, jak zapisać 16 wartości od 0x00 do 0xFF do epromu, bo nie mam pojęcia o pamięci, jak się zapisuje adresy, gdzie jest początek pamięci.
    jak to późnej czytać?
  • #8 6770820
    marek-c
    Poziom 19  
    uint8_t EEMEM wait_e;

    ...

    main

    unsigned char wait;


    wait = eeprom_read_byte(&wait_e);

    ....

    eeprom_write_byte(&wait_e, wait);
    eeprom_busy_wait();


    ********************************

    uint8_t EEMEM lim_e[5];

    ...

    for(pos_e = 0;pos_e < 5;pos_e++)
    {
    eeprom_write_byte(&lim_e[pos_e], lim[pos_e]);
    eeprom_busy_wait();
    }
  • #9 6796028
    bestmlody
    Poziom 14  
    Marek bo mam problem. To jest fragment kodu, przed funkcją 'main'.
    
    #include <avr/eeprom.h>
    
    uint8_t EEMEM uklady;
    unsigned char      ilosc_uk;	  								
    ilosc_uk=eeprom_read_byte(&uklady);


    Te deklaracje są wśród kilku innych zmiennych globalnych. Niestety błąd pokazuje się taki:
    led.c:21: warning: type defaults to 'int' in declaration of 'ilosc_uk'
    led.c:21: error: conflicting types for 'ilosc_uk'
    led.c:14: error: previous declaration of 'ilosc_uk' was here
    led.c:21: error: initializer element is not constant


    Zrobiłem tak jak pokazałeś a jednak...

    Dodano po 5 [minuty]:

    A może jest błąd bo tam w tej pamięci jeszcze nic nie ma a ja na wstępie chce ją odczytać?
  • #11 6796831
    bestmlody
    Poziom 14  
    Działa :D
    Wielkie dzięki.

    Jeszcze 2 pytania:
    1. Co oznacza deklaracja - int8_t EEMEM. Nie ma opisu tego w opisie biblioteki.
    2. Widzę, że w avrdude-gui można też programować EEPROM. Jak zrobić plik z wstępnymi danymi, żeby przy pierwszym "odpaleniu" urządzenia już coś było w pamięci, żeby działało. Na czym to polega?
  • #13 6797054
    bestmlody
    Poziom 14  
    w tej, do której kolega rsikon podał mi link kilka postów wyżej
  • #14 6797087
    Brutus_gsm
    Poziom 25  
    W pliku "stdint.h" znajdziesz:
    typedef signed char int8_t;
    typedef unsigned char uint8_t;


    Jest to po prostu definicja typów ;) uint8_t to po prostu zmienna unsigned char nic więcej ;)

    A EEMEM to zmienna przechowywana w pamięci eeprom.
  • #15 6797138
    bestmlody
    Poziom 14  
    Czyli 'signed char' to to samo co 'int8_t'?
    I mógłbym w programie zamienić to i tez by działało?
  • #16 6797184
    Brutus_gsm
    Poziom 25  
    Tak. Kompilator zmienia sobie int8_t na signed char. To jest po prostu alias.
  • #17 6797271
    Freddie Chopin
    Specjalista - Mikrokontrolery
    To nie jest "po prostu alias" bo komuś się nie chciało tak dużo pisać. To jest aliast na najbardziej optymalny typ zmiennej ze znakiem o rozmiarze RÓWNYM 8 bitów. O ile char w zasadzie zawsze ma 8 bitów, to już na przykład zmienne typu short, int oraz long mogą mieć różne rozmiary zależnie od architektury. Po to właśnie są int8_t, int16_t, int32_t, int64_t i ich odpowiedniki bez znaku - uint8_t, uint16_t, uin32_t i uint64_t.

    4\/3!!
  • #18 6797334
    bestmlody
    Poziom 14  
    Pamiętajcie o moim pytaniu, Na jakieś zasadzie tworzy się pliki aby zapisac je do EEPROMU. Czy potrzeba do tego jakiegos programu?
  • #19 7214972
    bestmlody
    Poziom 14  
    Tym razem próbuje zapamiętać wartości od 0 do 1023 z rejestru ADCW.
    Deklaracja zmiennych wygląda następująco:
    
    unsigned int min;
    unsigned int max;
    
    uint16_t EEMEM min_mem;
    uint16_t EEMEM max_mem;
    

    W trakcie programowania przepisuje rejestr ADCW do zmiennych min i max, a później funkcją:
    
    eeprom_write_byte(&min_mem, min);
    eeprom_busy_wait();

    zapisuje te zmienne do pamięci.
    Po wyłączeniu i wyłączeniu urządzenie nie działało poprawnie, dlatego postanowiłem na starcie wyświetlić sobie wartości odczytane z eeprom'u. Okazało się, że dobrze zapamiętywane są tylko wartości do 255, jeśli chce zapamiętać 888 to w eepromie znajdzie się 120 (888 - 3*256).
    Wszystkie zmienne są zadeklarowene dobrze, chyba, że się mylę... W czym może być błąd?
  • #20 7215124
    mirekk36
    Poziom 42  
    No zapisujesz pojedyńczy bajt

    eeprom_write_byte(&min_mem, min); 


    a chcesz żeby zapisało ci się całe słowo dwubajtowe?

    może zaintyeresuj się funkcją z "word" w nazwie zamiast "byte" ;) - to od razu się uda

    możesz też od razu zapoznać się z zapisem całego bloku danych. I generalnie polecam ci się zapoznać z takim zapisem danych do pamięci eeprom, że tworzysz sobie np jakąś strukturę bądź struktury które zawierają wszystkie potrzbne zmienne używane w programie - podobnie później te struktury mozna odzwierciedlić w pamięci RAM - dzięki czemu też później możesz właśnie od razu jednym zamachem całość odczytywać przy starcie z eepromu za pomocą eeprom_read_block - a przy zapisie albo poszczególne zmienne też wtedy można łatwo zapisywać albo i całą strukturę
  • #21 7215249
    bestmlody
    Poziom 14  
    Działa :)
    Źle zasugerowałem się i nie chciałem wygłupić stroną:EEprom.
    Jest tam na wstępie podane, że jest funkcja read_byte, write_byte, read_word, ale nie ma write_word i pomyślałem, że trzeba tu jakoś kombinować....
    Dziękuje.
REKLAMA