Witam!
Od wczoraj walczę z wewnętrznym EEPROMem w atmedze128L. Ogólnie problematyczna część programu działa następująco: na żadanie użytkownika dokonywana jest zmiana parametrów w pamięci (adres: IP, maska, brama sieciowa). Plik definiujący zmienne w pamięci:
Zapis wygląda w ten sposób:
Potem przy ew. włączeniu urządzenia, jeśli są wymagane adresy statyczne, powinny być one pobrane z EEPROMu. I tu pojawia się problem. Obojętne co tam zapiszę, to w jednej częsci programu za pomocą instrukcji (takie głupie wypisanie na terminal)
dostaję zawsze odpowiedź: 35.35.35.35, natomiast ten zapis wywoływany w innej części programu daje już dobrą odpowiedź, czyli dokładnie to, co było zapisywane do EEPROMu.
IMO znaczy to tyle, że zapis jest dobry tylko coś jest nie tak z odczytem z pamięci. Nie mam tylko pojęcia dlaczego ten sam zapis w różnych miejscach daje różne wyniki?
Jeszcze przy okazji niejako, może mi ktoś wyjaśni, bo spotkałem się z dwiema metodami zapisu i chciałbym zrozumieć, czym różni się taki zapis od zapisu takiego zakładając, że uint8_t to unsigned char?
Pozdrawiam
Żabek
Dodano po 3 [godziny] 58 [minuty]:
Przepraszam za post pod postem, ale sprawa jest dosyć pilna a ja sam nie umiem znaleźć rozwiązania.
Używam wersji 4.2.2 z datą 2007.12.21. Może coś jest nie tak z deklaracją zmiennych?
Pozdrawiam
Żabek
Mały EDIT:
Eksperymentalnie doszedłem do następującego wniosku - odczytana z EEPROMu wartość jest różna w zależności od miejsca wywołania funkcji odczytującej. Np. robiąc to w taki sposób:
gdzie funkcja jest zdefiniowana jako:
da to w efekcie mniej wiecej taki wynik:
192.20.20.20
15.15.14.15
192.20.20.20
Do komórek zapisano odpowiednio 1 2 3 4 i ta sama funkcja w zupełnie innym miejscu odczytuje je poprawnie!
Nie jest to ani 'dolny obszar' pamięci EEPROM a odczyt odbywa sie na długo po ustaleniu się napięcia zasilania. Próbowałem wyłączyć przerwania na czas odczytu ale bez rezultatów.
Jest to M128L zasilana ok. 3v3. Może jakieś fusebity są ustawione na wyższe napięcie (gdzieś czytałem) ale czy to powodowałoby, że raz czyta dobrze a drugi raz źle?
Może ktoś ma jakiś pomysł, bo czuję, że czeka mnie kolejna nieprzespana noc
Od wczoraj walczę z wewnętrznym EEPROMem w atmedze128L. Ogólnie problematyczna część programu działa następująco: na żadanie użytkownika dokonywana jest zmiana parametrów w pamięci (adres: IP, maska, brama sieciowa). Plik definiujący zmienne w pamięci:
static uint8_t EEMEM configmem_static_ipaddr_msb;
static uint8_t EEMEM configmem_static_ipaddr_hi;
static uint8_t EEMEM configmem_static_ipaddr_lo;
static uint8_t EEMEM configmem_static_ipaddr_lsb;Zapis wygląda w ten sposób:
//wszystko ok, zapisujemy zmiany w pamieci
eeprom_write_byte(&configmem_static_ipaddr_msb,addr[0][0]);
eeprom_busy_wait();
eeprom_write_byte(&configmem_static_ipaddr_hi, addr[0][1]);
eeprom_busy_wait();
eeprom_write_byte(&configmem_static_ipaddr_lo, addr[0][2]);
eeprom_busy_wait();
eeprom_write_byte(&configmem_static_ipaddr_lsb, addr[0][3]);
eeprom_busy_wait();Potem przy ew. włączeniu urządzenia, jeśli są wymagane adresy statyczne, powinny być one pobrane z EEPROMu. I tu pojawia się problem. Obojętne co tam zapiszę, to w jednej częsci programu za pomocą instrukcji (takie głupie wypisanie na terminal)
rprintf("%d.%d.%d.%d\r\n", eeprom_read_byte(&configmem_static_ipaddr_msb), eeprom_read_byte(&configmem_static_ipaddr_hi), eeprom_read_byte(&configmem_static_ipaddr_lo), eeprom_read_byte(&configmem_static_ipaddr_lsb));dostaję zawsze odpowiedź: 35.35.35.35, natomiast ten zapis wywoływany w innej części programu
rprintf("%d.%d.%d.%d\r\n", eeprom_read_byte(&configmem_static_ipaddr_msb), eeprom_read_byte(&configmem_static_ipaddr_hi), eeprom_read_byte(&configmem_static_ipaddr_lo), eeprom_read_byte(&configmem_static_ipaddr_lsb));IMO znaczy to tyle, że zapis jest dobry tylko coś jest nie tak z odczytem z pamięci. Nie mam tylko pojęcia dlaczego ten sam zapis w różnych miejscach daje różne wyniki?
Jeszcze przy okazji niejako, może mi ktoś wyjaśni, bo spotkałem się z dwiema metodami zapisu i chciałbym zrozumieć, czym różni się taki zapis
eeprom_write_byte(&zmienna, wartosc);eeprom_write_byte((uint8_t *)zmienna, wartosc);Pozdrawiam
Żabek
Dodano po 3 [godziny] 58 [minuty]:
Przepraszam za post pod postem, ale sprawa jest dosyć pilna a ja sam nie umiem znaleźć rozwiązania.
Używam wersji 4.2.2 z datą 2007.12.21. Może coś jest nie tak z deklaracją zmiennych?
Pozdrawiam
Żabek
Mały EDIT:
Eksperymentalnie doszedłem do następującego wniosku - odczytana z EEPROMu wartość jest różna w zależności od miejsca wywołania funkcji odczytującej. Np. robiąc to w taki sposób:
rprintf("... //wypisanie na terminal zawartosci 4 komorek
funkcja();
rprintf(" //ponowne wypisanie tego samegogdzie funkcja jest zdefiniowana jako:
void funkcja(void)
{
rprintf(...
return;
}da to w efekcie mniej wiecej taki wynik:
192.20.20.20
15.15.14.15
192.20.20.20
Do komórek zapisano odpowiednio 1 2 3 4 i ta sama funkcja w zupełnie innym miejscu odczytuje je poprawnie!
Nie jest to ani 'dolny obszar' pamięci EEPROM a odczyt odbywa sie na długo po ustaleniu się napięcia zasilania. Próbowałem wyłączyć przerwania na czas odczytu ale bez rezultatów.
Jest to M128L zasilana ok. 3v3. Może jakieś fusebity są ustawione na wyższe napięcie (gdzieś czytałem) ale czy to powodowałoby, że raz czyta dobrze a drugi raz źle?
Może ktoś ma jakiś pomysł, bo czuję, że czeka mnie kolejna nieprzespana noc
