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

[ATmega8][WinAVR] Błędny odczyt EEPROM

f1emodel 13 Lip 2010 15:44 2334 11
  • #1 8287901
    f1emodel
    Poziom 11  
    Witam,
    Mam problem, który spędza mi ostatnio sen powiek.
    Mam zadeklarowaną tablicę w pamięci EEPROM
    
    static EEMEM int16_t t_value[4][2]={
    									{389,386},
    									{386,386},
    									{386,386},
    									{386,386}};
    

    Podczas kompilacji
    Przy próbie odczytu z tablicy
    
    int16_t value;
    value=eeprom_read_word((int16_t*)&t_value[flag][0]);
    

    Otrzymuję komunikat o błędzie:
    
    warning: pointer targets in passing argument 1 of '__eerd_word_m8' differ in signedness
    

    Po zrzutowaniu odczytanej wartości na float i podzieleniu przez 10 otrzymuję -0,1
    W czym tkwi mój błąd?
    wkaźnik jest typu int16_t ...tablica też...
    Dodam, że po zapisie do komórki tablicy
    
    eeprom_write_word((int16_t*)&t_value[flag][number], value);
    

    kolejny odczyt jest już prawidłowy.
    Z góry dzięki za wszystkie odpowiedzi.
  • Pomocny post
    #2 8288041
    Fajfer2
    Poziom 20  
    Zamiast int16_t użyj uint16_t (dla tablicy w eepromie, rzutowanie też jest zbędne)
  • Pomocny post
    #3 8288074
    Andrzej__S
    Poziom 28  
    f1emodel napisał:

    
    static EEMEM int16_t t_value[4][2]={...
    



    Powinno być raczej:
    
    int16_t t_value[4][2] EEMEM = {...
    


    f1emodel napisał:

    
    value=eeprom_read_word((int16_t*)&t_value[flag][0]);
    



    Spróbuj tak:
    
    value=(int16_t)eeprom_read_word((const uint16_t*)&t_value[flag][0]);
    


    Funkcja eeprom_read_word oczekuje wskaźnika do const uint16_t, a zwraca uint16_t. Dlatego miałeś problem z signedness.
  • #4 8291177
    f1emodel
    Poziom 11  
    Dzięki Andrzej :) Pomogło :) Nie wyrzuca mi już warningów...niestety i tak za pierwszym razem czyta śmieci ;/ Ale różowe już znikło :)
    Jak to będzie wyglądało z zapisem do tablicy w eeprom zmiennej value?
    Też wyskakuje mi ten sam błąd...
    Czy zgodnie z tym co napisałeś poniżej analogicznie:
    Funkcja eeprom_write_word jako pierwszego argumentu oczekuje wskaźnika do const uint16_t, natomiast jako drugiego uint16_t?
  • #5 8291261
    szelus
    Poziom 34  
    f1emodel napisał:

    Dodam, że po zapisie do komórki tablicy [...] kolejny odczyt jest już prawidłowy.

    A takie głupie pytanie - jak programujesz procesor, to "wpalasz" również eeprom? Bo to z reguły oddzielna opcja...
  • #6 8292210
    f1emodel
    Poziom 11  
    Pytanie Szelus nie jest głupie a uświadamiające ;) Nie wiedziałem, że eeprom trzeba jakoś oddzielnie zapisywać.

    Za każdym razem, kiedy wgrywam program na procesor za pierwszym odczytem pojawiają się właśnie śmieci, a nie dane, które były wcześniej zapisane, więc chyba jednak w momencie programowania procesora właśnie "wpalam" eeprom.

    Wiem tylko, że można uniemożliwić zapisywanie eepromu w fusebitach.

    Mógłbyś napisać coś więcej na temat tej oddzielnej opcji?
  • #7 8292215
    Andrzej__S
    Poziom 28  
    Spróbuj może lepiej tak, jak zaproponował Fajfer2. Zamiast używać int16_t użyj uint16_t. Wtedy konwersja będzie Ci niepotrzebna:
    
    uint16_t t_value[4][2] EEMEM = { 
                               {389,386}, 
                               {386,386}, 
                               {386,386}, 
                               {386,386}};
    
    uint16_t value;
    
    //odczyt
    value=eeprom_read_word(&t_value[flag][0]);
    
    //zapis
    eeprom_write_word(&t_value[flag][number], value);
    
    


    Prościej? Tym bardziej, że nie zauważyłem w tablicy wartości ujemnych, więc być może wcale ich nie potrzebujesz.

    Dodano po 9 [minuty]:

    f1emodel napisał:

    Za każdym razem, kiedy wgrywam program na procesor za pierwszym odczytem pojawiają się właśnie śmieci, a nie dane, które były wcześniej zapisane, więc chyba jednak w momencie programowania procesora właśnie "wpalam" eeprom.


    Piszesz "chyba", więc do końca nie jesteś pewien? A dobry plik do wczytania w eeprom wybrałeś? Napisz jakiego programatora/programu używasz, to może coś podpowiemy.
  • Pomocny post
    #8 8292272
    szelus
    Poziom 34  
    f1emodel napisał:

    Za każdym razem, kiedy wgrywam program na procesor za pierwszym odczytem pojawiają się właśnie śmieci, a nie dane, które były wcześniej zapisane, więc chyba jednak w momencie programowania procesora właśnie "wpalam" eeprom.

    Wiem tylko, że można uniemożliwić zapisywanie eepromu w fusebitach.

    Niezupełnie, w fusebitach można tylko ustawić, aby nie kasował EEPROMu przy kasowaniu chipa, co ma miejsce podczas normalnego programowania. Dlatego normalnie po każdym wpisaniu programu masz w EEPROMie nie śmieci, ale chyba same 0xff, czyli -1, czyli nawet by się to zgadzało z Twoim -0.1.
    Cytat:

    Mógłbyś napisać coś więcej na temat tej oddzielnej opcji?

    Nie wiem, czym programujesz. Powinna być gdzieś operacja zapisu EEPROMa ze wskazanego pliku. Kompilator generuje oddzielny plik hex z zawartością EEPROM.
  • #9 8292473
    f1emodel
    Poziom 11  
    Dzięki Serdeczne :D
    Na Was zawsze można liczyć :)

    Używam STK200, a piszę w WinAVR.
    w tablicach typu uint8_t dostaję 255, czyli też 0xff.

    Niestety ujemne wartości są mi potrzebne, więc raczej nie mogę skorzystać z tablicy t_value typu uint16_t ... chyba, żeby zadeklarować osobną tablicę ze znakami dla wartości z tablicy uint16_t t_value, ale to mi troszkę w kodzie pomiesza.
    Z odczytywaniem już nie ma problemu dzięki Andrzejowi...niestety jeszcze kwestia zapisu została i nie umiem sobie z nią poradzić, żeby warningów nie bylo.
  • #11 8292916
    f1emodel
    Poziom 11  
    Dzięki Andrzeju :)
    Teraz już nie zgłasza ostrzeżenia kompilator.
    Wcześniej miałem:
    
    eeprom_write_word((const uint16_t*)&t_value[flag][number], (uint16_t)value); 
    

    bo myślałem, że skoro:
    funkcja eeprom_read_word oczekuje wskaźnika do const uint16_t, to funkcja
    eeprom_write_word też.
    Okazuje się, że życie nie jest jendak takie proste.
    Jeszcze raz dzięki Andrzeju.

    Jestem bardzo ciekawy jak to wygląda z tym wcześniej wspomnianym oddzielnym wgrywaniem eepromu.

    Z góry dziękuję za wszelkie wiadomości na ten temat.
  • #12 8295211
    f1emodel
    Poziom 11  
    Rozwiązałem problem. Zainstalowałem program Burn-O-Mat i zapisałem nim w eepromie plik main z rozszerzeniem eep i wszystko śmiga :)

    Pozostaje mi jeszcze wszystkim serdecznie podziękować i zamknąć temat :)
REKLAMA