Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 30 mar 2026, o 19:40


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 10 ] 
Autor Wiadomość
PostNapisane: 5 gru 2016, o 21:07 
Offline
Nowy

Dołączył(a): 05 gru 2016
Posty: 3
Pomógł: 0

Napotkałem dziwny problem.

Mianowicie podczas tworzenia struktury - bez wartości- oraz przypisaniu jej miejsca w pamieć ee - wszystko jest ok - miejsce jest wypełnione zerami.
Kiedy tworze pojedynczą zmienną np o wartości 3 i rezerwuje jej miejsce w pamieć - to odczytując EEprom mam 0x03 - czyli tez ok.

Czyli tworzenie "wsadu" do eepromu przebiega dobrze.

Kłopot pojawia się jak chcę zmienić wartość pamięci podczas pracy programu .

używając struktur wykonuję oczywiście: (przykład z tego forum)

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


po chwili odczytuję strukture z eeprom:

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


I teraz zmienna ram_zmienne.t_min_ee ma wartość 21 !!

Przy zapisie z poziomu programu w starszym bicie mam ciągle napisaną cyfrę o 1 większa niż być powinna.

Tak samo się dzieje gdy używam zapisu pojedynczej zmiennej:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Przy liczbach 2 bajtowych problem się nasila, zapisując liczbę dec 26 w pamieć powinno być 24H a pojawia się 1034 H - czyli 4148 dec.

Całe oprogramowanie sciągłem ze strony http://mirekk36.blogspot.com/

Nie wiem jak sobie z tym poradzić.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 gru 2016, o 07:11 
Offline
Użytkownik

Dołączył(a): 07 cze 2016
Posty: 563
Pomógł: 143

Na początek zmień kolejność argumentów podczas wywołania funkcji eeprom_write_block() oraz eeprom_read_block(). Pierwszy powinien być wskaźnik do RAM, dopiero później do EEPROM, a Ty masz odwrotnie.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 gru 2016, o 20:36 
Offline
Nowy

Dołączył(a): 05 gru 2016
Posty: 3
Pomógł: 0

Faktycznie, to fragment kodu który wziąłem z tego forum - który też sprawdzałem.

U siebie w programie mam dobrze ale efekt jest taki sam (wiele kodów sprawdzałem). Zrobiłem kilka prób zapisując kolejno wartości do pamięci, oto wynik:

dec 0 = 0x00 > 0x10 źle
dec 4 = 0x04 > 0x14 źle
dec 12 = 0x0C > 0x1C źle
dec 20 = 0x14 > 0x14 ok
dec 28 = 0x1C > 0x1C ok
dec 34 = 0x22 > 0x32 źle
dec 53 = 0x35 > 0x35 ok
dec 73 = 0x49 > 0x59 źle
dec 82 = 0x52 > 0x52 ok
dec 153= 0x99 > 0x99 ok

Zapis pojedynczej zmiennej uint8_t. Pierwsza kolumna to wartość dziesiętna, druga kolumna to wartość HEX która powinna się pojawić w pamięci, a trzecia kolumna to jest co się zapisało w pamięci.

Błąd zapisu pojawia się zawsze gdy starszy bit jest parzysty lub równy zero. Wtedy jest zawyżany o 1.
Efekt liczba dec4 i dec20 zapisują się tak samo.
Próbując samego polecenia __EEPUT(10,4); efekt jest ten sam. Pod adresem 10 zapisuje "dec20";

Gdzie w bibliotece jest fragment odpowiedzialny za zapis do pamięci? może warto tam zobaczyć co się dzieje.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 gru 2016, o 20:49 
Offline
Użytkownik

Dołączył(a): 07 cze 2016
Posty: 563
Pomógł: 143

Bez całego kodu trudno będzie coś stwierdzić.

Funkcje z serii eeprom_read_xxx() oraz eeprom_write_xxx() to funkcje z biblioteki standardowej avr-libc i działają na pewno dobrze.

W jaki sposób sprawdzasz poprawność zapisu?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 gru 2016, o 11:45 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 28 wrz 2014
Posty: 1530
Lokalizacja: Warszawa
Pomógł: 55

Ja miałem problem z eeprom jak zasilanie było słabe - bardzo podobnie się zachowywało, raz ok raz nie...

_________________
--... ...-- - --- -- . -.-



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 gru 2016, o 12:06 
Offline
Użytkownik

Dołączył(a): 07 cze 2016
Posty: 563
Pomógł: 143

No tak, tylko że tutaj przekłamanie nie jest losowe. Wygląda to tak, jakby bit 4 odczytywanej wartości był permanentnie ustawiony na 1, czyli jakby po odczytaniu wykonać operację OR z 0b0001000 (0x10). Jeżeli odczytywana wartość ma również ten bit ustawiony na 1, to wynik jest prawidłowy, jeśli bit 4 jest równy 0, występuje przekłamanie.

Wydaje mi się, że w przypadku zbyt niskiego napięcia zasilającego błędy będą przypadkowe, chociaż mogę się mylić (osobiście nie miałem takiego przypadku).



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 gru 2016, o 14:30 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 28 wrz 2014
Posty: 1530
Lokalizacja: Warszawa
Pomógł: 55

Zgadza się były losowe... Zdrowo się namęczyłem z tym.

_________________
--... ...-- - --- -- . -.-



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 gru 2016, o 15:12 
Offline
Nowy

Dołączył(a): 05 gru 2016
Posty: 3
Pomógł: 0

Problem rozwiązany. Aż ciężko w to uwierzyć ale nowy mikrokontroler kupiony w TME wygląda na wadliwy. Płytka wykonana w smd, wszystkie elementy nowe, gdyby nie było tak ciasno pewnie bym już wcześniej podmienił go na innego.

Po podmianie wszystko ok. Trzy dni stracone na szukanie błędu.

Daje to trochę do myślenia. Układ ma sterować mechanizmem który w razie awarii mógłby narobić sporo szkód (finansowych). Pamięć wiadomo zawsze robi się kontrole odczytanych wartości, gorzej jeśli błąd "fabryczny" dotyczył by rejestrów które mają wpływ na działanie układu.

Dziękuję wszystkim za zainteresowanie.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 gru 2016, o 20:15 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 28 wrz 2014
Posty: 1530
Lokalizacja: Warszawa
Pomógł: 55

No to rzeczywiście - gratuluję złapania drania :)

_________________
--... ...-- - --- -- . -.-



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 gru 2016, o 21:11 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27450
Lokalizacja: Szczecin
Pomógł: 1045

Polecam ZAPIS danych do FLASH zamiast EEPROM ;) tysiąc razy pewniejsze

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 10 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 2 gości


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO