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



Teraz jest 24 mar 2026, o 12:03


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 7 ] 
Autor Wiadomość
PostNapisane: 29 lis 2015, o 19:05 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 28 lis 2012
Posty: 298
Pomógł: 13

Witam!

Mam problem z prostym kodem. Jest to banalny program na ATtiny2313A, który zlicza czas - sekundy, minuty, godziny, dni. Oczywiście jest to niedokładne, bo oparte o timer w procku, ale nie o dokładność tu chodziło.
Pamiętam, że poprzednio z zapisywaniem i odczytywaniem danych z EEPROM nie miałem żadnych cyrków. A teraz takie dziwactwa.
W EEPROM zapisuję sobie ilość włączeń urządzenia - inkrementuję licznik podczas każdego włączenia zasilania. Oprócz tego zapamiętuję stan diody (świeci, nie świeci).
Stan diody zawsze się zgadza, jeśli wyłączyłem z diodą włączoną, to po włączeniu świeci i na odwrót.
Niestety licznik mi wariuje. Pierwsze włączenie się zgadza (1), a później zazwyczaj jest np. 202, 203 itd. Raz zaczęło zliczać w dół, no dziwy. Coś pewnie chrzanię w kodzie, proszę mi to wytknąć, wszystko wrzucam poniżej.
Zapisywanie i odczytywanie z EEPROM realizuję poprzez struktury, jak Mirek przykazał ;-)

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


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


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



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 30 lis 2015, o 00:46 
Offline
Użytkownik

Dołączył(a): 29 lip 2014
Posty: 195
Pomógł: 44

Witam,

jedyne, co mi się rzuciło w oczy, to to że wywołujesz funkcję zapisu do EEPROM-a w pętli głównej, wygląda na to, że co około 100ms, być może komórka pamięci, w której masz zapisywany ten licznik, już nie żyje. Kiedyś, na skutek tego typu błędu udało mi się uszkodzić kilka komórek w EEPROM-ie. Warto to jakoś oflagować, albo najpierw odczytywać EEPROM-a i zapisywać jedynie wtedy, gdy jakieś dane uległy zmianie. Kolejna sprawa, przy korzystaniu z EEPROM-a w projektach należy bezwzględnie uruchamiać układ BOD w mikrokontrolerze, bo może się okazać, że przy wyłączeniu zasilania procek na resztkach energii "robi co chce" ( i często się tak zdarza, że potrafi nadpisać dane w EEPROM-ie). Nie wiem, jak konkretnie się to nazywa w Twoim procku, np. w AT128 w fuse bitach było coś takiego jak BODEN i BODLEVEL zdaje się.
W kodzie błędów jako takich nie zauważyłem.

Pozdrawiam, QuadMan.


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 30 lis 2015, o 18:02 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 28 lis 2012
Posty: 298
Pomógł: 13

Super, bardzo Ci dziękuję za odpowiedź!
BODa faktycznie nie włączyłem, zaraz to uczynię. I z tym zapisem masz rację, przecież tam w kółko uruchamiam zapis eeprom... Z tym, że jeśli nadpisywane jest tą samą wartością, to chyba nic nie powinno się dziać?

Odczytałem sobie programem eXtreme Burner zawartość EEPROM i dziwy...

Obrazek
Zapisane są komórki 01, 02, 03 oraz 7006, a struktura posiada trzy zmienne, dwie używane - stan_led i licznik.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 30 lis 2015, o 19:51 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 15 wrz 2013
Posty: 74
Lokalizacja: Sierakowice/Gdańsk
Pomógł: 9

Żeby zabezpieczyć EEPROM przed niepotrzebnym kasowaniem i ponownym zapisywaniem tej samej wartości, można zamiast:
Kod:
eeprom_write_block( &ram_cfg, &eem_cfg, sizeof(ram_cfg) );

użyć funkcji:
Kod:
eeprom_updte_block( &ram_cfg, &eem_cfg, sizeof(ram_cfg) );


Jeżeli cały blok pozostaje bez zmian, to na pewno nic nie zapisuje w EEPROM-ie.
A gdy zmieni się np. tylko 1bajt w zapisywanym bloku danych to kasuje i zapisuje na nowo tylko ten 1bajt, ale tu nie jestem do końca pewny.


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 gru 2015, o 13:33 
Offline
Użytkownik

Dołączył(a): 29 lip 2014
Posty: 195
Pomógł: 44

Witam,
zoom napisał(a):
Super, bardzo Ci dziękuję za odpowiedź!
BODa faktycznie nie włączyłem, zaraz to uczynię. I z tym zapisem masz rację, przecież tam w kółko uruchamiam zapis eeprom... Z tym, że jeśli nadpisywane jest tą samą wartością, to chyba nic nie powinno się dziać?

Odczytałem sobie programem eXtreme Burner zawartość EEPROM i dziwy...

Obrazek
Zapisane są komórki 01, 02, 03 oraz 7006, a struktura posiada trzy zmienne, dwie używane - stan_led i licznik.


zapisywanie jakich dziwacznych wartości pod nieużywanymi adresami sugeruje rzeczywiście problemy z BOD-em. Co do zapisu niezmienionych wartości: z konstrukcji EEPROM-a niestety wynika, że zapis jakiejkolwiek wartości musi być poprzedzony kasowaniem komórki, niestety :-(. Ja na Twoim miejscu spróbowałbym jednokrotnego zapisu i za nim zaraz odczytu do innej struktury testowej i wyświetlałbym dane na LCD z tejże struktury, wtedy mógłbyś na 100% przetestować poprawność kodu.
@wojtekr51 o funkcji: eeprom_updte_block( &ram_cfg, &eem_cfg, sizeof(ram_cfg) ) nie wiedziałem, ja coś takiego implementowałem "recznie". No ale ja na AVR-ach prawie nic nie robię...

Pozdrawiam, QuadMan.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 gru 2015, o 17:53 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 28 lis 2012
Posty: 298
Pomógł: 13

Włączenie BODa faktycznie poprawiło sytuację. Niestety przy odczytywaniu EEPROMA zewnętrznym programem, podczas resetu ten błąd dalej się pojawia, więc faktycznie muszę sobie czytać EEPROM do struktury u wywalać na LCD. Jedyny sposób.
Zastanawia mnie tylko, że to zawsze jest wartość 197 itp, albo 203 itp. Nigdy jakieś inne, np. 64, czy 150.
Dzięki wszystkim, walczę dalej.

BTW zawsze byłem mega zadowolony z programu AVR Burn-O-Mat. Niestety już drugi raz podczas zmieniania fusów w ATtiny 2313 coś się niedobrego dzieje. Jeden procek mi umarł - pewnie jakieś lockbity czy coś się włączyło, a teraz zamiast BODlevel musiał mi się załączyć DIV8, nagle wszystko zaczęło chodzić wolno, nie mogłem się programatorem połączyć. Na szczęście wpadłem o co chodzi, przestawiłem zworkę i zmieniłem MkAvrCalculatorem.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 gru 2015, o 18:04 
Offline
Użytkownik

Dołączył(a): 29 lip 2014
Posty: 195
Pomógł: 44

Witam ponownie.
A może faktycznie ta komórka EEPROM-a już umarła. Przesuń na próbę obszar danych w EEPROM-ie kawałek dalej i wtedy zobacz.

Pozdrawiam, QuadMan.



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: 7 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

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


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:  
cron
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO