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

[ATmega128][C] Problem z obsługą eepromu

pudl 20 Wrz 2009 22:00 1498 8
  • #1 7039853
    pudl
    Poziom 14  
    Piszę program który w założeniu ma posiadać pamięć ustawień. Dokładniej jest w nim 11 zmiennych oraz 128 możliwości ich ustawień (128 banków pamięci dla tych 11 zmiennych). Każda zmienna jest 8bitowa.
    No i dostaje od kompilatora (WinAVR ) dziwne komunikaty:

    warning: pointer targets in passing argument 1 of 'eeprom_read_byte' differ in signedness

    W kodzie zaznaczona jest ostatnia linijka

    
    int pr = 1;
    char eq1 = 8, eq2 = 8, eq3 = 8, eq4 = 8, eq5 = 8;
    char vol = 24, V1 = 16, V2 = 16, pt = 8, st = 1, ch = 1;
    
    static char EEMEM ch_eeprom[128];
    static char EEMEM st_eeprom[128];
    static char EEMEM pt_eeprom[128];
    static char EEMEM V2_eeprom[128];
    static char EEMEM V1_eeprom[128];
    static char EEMEM vol_eeprom[128];
    static char EEMEM eq1_eeprom[128];
    static char EEMEM eq2_eeprom[128];
    static char EEMEM eq3_eeprom[128];
    static char EEMEM eq4_eeprom[128];
    static char EEMEM eq5_eeprom[128];
    
    
    st = eeprom_read_byte(&st_eeprom[pr]);


    Ten sam komunikat pojawia się przy zapisie

    eeprom_write_byte(&st_eeprom[pr], st);


    Jak narazie udało mi się go pozbyć jedynie podstawiając za adres &st_eeprom jakąś stałą liczbę

    eeprom_write_byte(0x00, st);


    Wtedy pamięć działa, zapamiętuje i odczytuje bezproblemowo.

    W czym tkwi problem?/


    -------------------------------------------------------------------

    PO PROBLEMIE :)

    Okazuje się że nie można definiować zmiennych eepromowych za pomocą char tylko trzeba to robić używając polecenia uint8_t (lub innych - uint16_t, 32, 64):
    static EEMEM uint8_t pr_eeprom;
    static EEMEM uint8_t ch_eeprom[128];
  • #2 7039919
    Freddie Chopin
    Specjalista - Mikrokontrolery
    static __ATTR_PURE__ __inline__ uint8_t eeprom_read_byte (const uint8_t * __p)

    Ty natomiast chcesz czytać / zapisywać char. Unsigned char (uint8_t) a char to dwa różne typy zmiennych dla kompilatora. Proponuję nauczyć się używania zmiennych z nagłówka <stdint.h> czyli [u]int{8|16|32|64}_t - w twoim przypadku uint8_t.

    4\/3!!
  • #3 7039929
    pudl
    Poziom 14  
    No właśnie tez sam na to wpadłem, znam te zmienne ale nie wiedziałem że będzie robić to różnice czy użyję char czy uint8_t - w końcu to i to definiuje liczbą 8bitową bez znaku..
  • Pomocny post
    #4 7039974
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Bynajmniej - "char" może być równie dobrze ze znakiem, to zależne jest tylko o fantazji danej wersji kompilatora. Można to oczywiście zmienić w opcjach, ale zakładanie że "typ" jest równoznaczne z "unsigned typ" jest błędem.

    4\/3!!
  • #5 7040034
    pudl
    Poziom 14  
    Ok, dzięki za poradę
    Pozdrawiam!
  • #6 7107814
    gregy
    Poziom 11  
    podepne się pod temat :) , ja to robiłem z rzutowaniem typów:

    ...
    char eeprom_komunikat[] EEMEM = "text \r\n\n\n";
    ...
    bufor[k]=eeprom_read_byte( (uint8_t *)(&eeprom_komunikat[k]) );

    bardzo źle?
    Bo nie wiedziałem, czy przy takiej deklaracji stringu:
    uint8_t eeprom_komunikat[] EEMEM = "text \r\n\n\n";

    na końcu stringu będzie znak null, czy trzeba go dodać jawnie?

    Inna kwestia, która mnie męczy, to jak zapanować nad umieszczaniem danych/zmiennych w EEROMIE. Ale pytanie zadam w osobny wątku, bo dotyczy raczej Atmegi8.
  • #7 7108175
    Freddie Chopin
    Specjalista - Mikrokontrolery
    gregy napisał:
    na końcu stringu będzie znak null, czy trzeba go dodać jawnie?

    Jeśli ciąg znaków jest w cudzysłowach i jest wystarczająco dużo miejsca, to zero jest zawsze

    char t1[] = "abcd"; // jest na końcu zero
    char t2[10] = "abcd"; // jest na końcu zero
    char t3[5] = "abcd"; // jest na końcu zero
    char t4[4] = "abcd"; // nie ma zera, brak miejsca
    char t5[] = {'a', 'b', 'c', 'd'}; // nie ma zera, inicjalizacja tablicy "wprost"

    4\/3!!
  • #8 7108452
    gregy
    Poziom 11  
    ok, a:
    uint8_t t1[] = "abcd";
    to kompilator też będzie wiedział że to string i doda null?
REKLAMA