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



Teraz jest 23 wrz 2019, o 08:35


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 20 ] 
Autor Wiadomość
PostNapisane: 18 sie 2019, o 22:25 
Offline
Użytkownik

Dołączył(a): 14 sty 2018
Posty: 108
Pomógł: 0

Czołem! ;)
Mam pamięć 24c512 podpiętą pod Atmega16 i chciałbym w niej zapisywać i odczytywać pewne dane. Chodzi mi o takie rozwiązanie (starałem się rozrysować czytelnie):

Obrazek

na jednej stronie (zielone cyfry) chcę przechowywać cztery ustawienia (czerwone cyfry), a w jednym takim ustawieniu wspomniane dane. Najprościej mówiąc są to stany 0/1 z 10 rejestrów przesuwnych. Część schematu wygląda tak:

Obrazek

Dane do zapisania to stany wyjść dziesięciu rejestrów, przy czym 9/10 rejestrów przełączają się w sposób binarny (a jeśli to ułatwi sprawę, to od strony sterowania nimi jako liczniki od 0 do 21), a prócz tego stany 0/1 dziewięciu wyjść.

Mógłby ktoś podsunąć pomysł w jaki sposób takie dane zapisać? Czy te stany muszę sprowadzić do hexa i wtedy zapisywać? Mile widziane jakieś kody do przeanalizowania z komentarzami, byle nie teoria od podstaw bo niestety nie należę do osób, które potrafią uczyć się z suchej teorii :oops:



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 sie 2019, o 08:29 
Offline
Użytkownik

Dołączył(a): 18 sie 2019
Posty: 52
Pomógł: 2

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

Do eepromu wyślesz element struktury (można i calą strukturę)
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

gdzie kolejne parametry to
0 - adres w eeprom I2C
eeprom+rekord*nrRekordu- adres danych w ram
sizeof(rekord) - liczba danych do zapisu

Strony pamięci nie przekraczasz (24C512 ma 128bajtów), więc zapis zajmie max 5ms. Aby program nie wisiał w czasie transferu danych użyj przerwań TWI.

Dlaczego zewnętrzny EEPROM a nie wbudowany w AVR? Mega16 ma 512bajtów eeprom. Potrzebujesz 40x4x2 bajty = 320. Warto aby dane były chronione przez CRC (np CRC8), więc 40x4x(2+2) = 480bajtów.


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 sie 2019, o 19:12 
Offline
Użytkownik

Dołączył(a): 14 sty 2018
Posty: 108
Pomógł: 0

Ogromne dzięki za wskazówkę! Nie mam o tym pojęcia więc trochę czasu mi zajmie ugryzienie tego ;)

Cytuj:
Dlaczego zewnętrzny EEPROM a nie wbudowany w AVR?

Pytałem kiedyś, na którymś forum jakie rozwiązanie lepsze to polecono mi zewnętrzną kość bo jest mniej awaryjna (bezpieczniejsza) i ma 10-krotnie większą żywotność jeśli chodzi o zapis. Zasugerowałem się tym i takie rozwiązanie zastosowałem. 24c512 jest sporo za duże, ale chciałem coś z dużym zapasem, żeby nie musieć wymieniać w razie jakby się okazało, że jednak brakuje. Obecnie cały program piszę dla Atmega16, ale domyślnie będzie to Atmega1284 z tego samego powodu co EEPROM ;)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 sie 2019, o 13:34 
Offline
Użytkownik

Dołączył(a): 18 sie 2019
Posty: 52
Pomógł: 2

felinutti napisał(a):
Ogromne dzięki za wskazówkę! Nie mam o tym pojęcia więc trochę czasu mi zajmie ugryzienie tego ;)

Cytuj:
Dlaczego zewnętrzny EEPROM a nie wbudowany w AVR?

Pytałem kiedyś, na którymś forum jakie rozwiązanie lepsze to polecono mi zewnętrzną kość bo jest mniej awaryjna (bezpieczniejsza)

Z tym się nie zgodzę. Każdy dodatkowy element powoduje ryzyko zwiększenia awaryjności. Co się częściej psuje, rower czy samochód?

felinutti napisał(a):
i ma 10-krotnie większą żywotność jeśli chodzi o zapis.

Ile zapisów potrzebujesz? Jaki czas "życia" urządzenia jest wymagany? Może lepszy będzie FRAM?

felinutti napisał(a):
Zasugerowałem się tym i takie rozwiązanie zastosowałem. 24c512 jest sporo za duże, ale chciałem coś z dużym zapasem, żeby nie musieć wymieniać w razie jakby się okazało, że jednak brakuje. Obecnie cały program piszę dla Atmega16, ale domyślnie będzie to Atmega1284 z tego samego powodu co EEPROM ;)

Jak masz dużo FLASH a potrzebujesz dużej liczby zapisów, to emuluj EEPROM w FLASH. W ten sposób może sobie zwiększyć liczbę zapisów do 10 czy słynnych wałęsowych 100 mln niskim kosztem. W praktyce, w mikrokontrolerach często nie ma pamięci EEPROM, jest ona emulowana w FLASH.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 sie 2019, o 18:01 
Offline
Użytkownik

Dołączył(a): 14 sty 2018
Posty: 108
Pomógł: 0

Cytuj:
Co się częściej psuje, rower czy samochód?

Z co najmniej dwóch powodów samochód :lol:

Urządzenia będzie działać dopóki któreś z nas wymięknie :D Ilość odczytów i zapisów nie będzie jakaś ogromna (myślę, że jeśli przekroczę 1000 to będzie cud), ale chcę do minimum ograniczyć możliwą awaryjność. Częstotliwość zapisywania też będzie niewielka bo na przy pierwszych ustawieniach może to być ok 100 zapisów, później jakieś sporadyczne na przestrzeni wielu lat. Reszta to tylko odczyty wybranych ustawień.

24c512 tak czy inaczej mam już na PCB, więc wybór pamięci to jedynie kwestia programowa. Myślałem nad czymś w stylu back'upu wszystkich ustawień, ale nie wiem czy miałoby to sens. Chciałbym też zrobić zapamiętywanie ostatnio wybranego ustawienia, tak żeby po ponownym uruchomieniu urządzenia (zasilanie) nie musiałbym go ręcznie wybierać.

------------------------ [ Dodano po: 17 minutach ]

Zacznę na początek od stworzenia tej struktury. Zastanawiam się jak ogarnąć jedną rzecz. Z tego co zrozumiałem to w strukturze powinienem podać zmienne które chcę zapisać do pamięci, w moim przypadku byłyby to takie zmienne:

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


Na chwilę obecną te zmienne są w obsłudze klawiszy. Dobrze rozumiem, że powinienem je przenieść do struktury?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 sie 2019, o 19:37 
Offline
Użytkownik

Dołączył(a): 14 sty 2018
Posty: 108
Pomógł: 0

Nie mogę edytować już posta. Tak to powinno wyglądać?
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: 20 sie 2019, o 19:55 
Offline
Użytkownik

Dołączył(a): 18 sie 2019
Posty: 52
Pomógł: 2

felinutti napisał(a):
Urządzenia będzie działać dopóki któreś z nas wymięknie :D Ilość odczytów i zapisów nie będzie jakaś ogromna (myślę, że jeśli przekroczę 1000 to będzie cud), ale chcę do minimum ograniczyć możliwą awaryjność.

I myślisz, że osiągniesz to dodając zewnętrzne układy? Mylisz się, już pisałem, w ten sposób awaryjność zwiększa się.

felinutti napisał(a):
Myślałem nad czymś w stylu back'upu wszystkich ustawień

Dobry pomysł ale połącz to z CRC o którym pisałem. Możesz dodatkowo trzymać pozą kopia w EEPROM kopię w FLASH.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 sie 2019, o 18:07 
Offline
Użytkownik

Dołączył(a): 14 sty 2018
Posty: 108
Pomógł: 0

Jakby mi ktoś to wcześniej powiedział to bym nie robił na płytce zewnętrznego EEPROMa :(

Mam pytanie co do adresowania. Przeszukałem internety i nie mogę znaleźć odpowiedzi. W jaki sposób się adresuje kości? Jeśli mam wyjścia A0, A1 i A2 podłączone na stałę do GND to jaki jest adres do wysyłki danych?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 sie 2019, o 18:19 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 paź 2014
Posty: 832
Lokalizacja: Trójmiasto
Pomógł: 155

Jeśli kostka ma możliwość zmiany adresu i piny masz na masie to do adresu w miejsca A0, A1 i A2 trafiają zera czyli adres to 0b10100000 (w heksie 0xA0) lub w stylu arduinowców 0b01010000 (w heksie 0x50).
Obrazek
Jeśli dany pin jest na masie to w miejsce numeru pinu w adresie wskakuje "0", jeśli pin jest do Vcc to wskakuje "1"

------------------------ [ Dodano po: 10 minutach ]

Semi napisał(a):
I myślisz, że osiągniesz to dodając zewnętrzne układy? Mylisz się, już pisałem, w ten sposób awaryjność zwiększa się.
Kolega trochę demonizuje. Dużo producentów różnorakiego sprzętu umieszcza ustawienia w zewnętrznych pamięciach eeprom. Tylko może bardziej jest to podyktowane prostotą załadowania ustawień do takiej pamięci niż względami jej większej niezawodności. Łatwiej jest zaprogramować zewnętrzną kostkę niż dobierać się do uC który zazwyczaj jest zabezpieczony przed odczytem, a co za tym idzie i przed zapisem. Więc w takim przypadku trzeba by wykasować całą pomięć procka by ponownie wrzucić zawartość wsadów. A tak wystarczy zaprogramować eeprom i po sprawie.


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 wrz 2019, o 20:11 
Offline
Użytkownik

Dołączył(a): 14 sty 2018
Posty: 108
Pomógł: 0

Próbuję ogarnąć zapis i odczyt czegokolwiek, mam coś takiego:

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


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


reakcja jest taka, że po wciśnięciu przycisku wartości zmiennych cnt_value wynoszą 0. Czy ten fragment kodu jest poprawny/ powinien działać?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 wrz 2019, o 07:30 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 paź 2014
Posty: 832
Lokalizacja: Trójmiasto
Pomógł: 155

trudno powiedzieć czy wszystko ok nie widząc ciała funkcji "TWI_write/read_bufor" ale pierwsze co rzuca sie w oczy to to:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
kod BCD służy do zapisu pojedynczych cyfr dziesiętnych w jednym bajcie, ty prubujesz upchać np 19 w jednym bajcie co jest niemożliwe bo są to dwie cyfry dziesiętne więc muszą zajmować dwa bajty w BCD, oczywiście są implementacje umożliwiające zapis BCD dwóch cyfr dziesiętnych w jednym bajcie, ale nie wiem czy w tym przypadku to jest możliwe (obsługiwane przez funkcję dec2bcd).

Tak czy inaczej pierwsze dwie komórki tablicy bufora powinny zostać napełnione prawidłowo, a skoro nie są to problemu bym szukał w funkcjach zapisu/odczytu eeproma.
Te funkcje naskrobałeś sam czy masz z jakiegoś źródła? Bo widzisz z tymi pamięciami jest pewien problem, a mianowicie ich cała rodzina nie ma jednorodnego protokołu komunikacji ze względu na różną długość adresu potrzebnego do zaadresowania całej przestrzeni pamięci. I tak np kość 24c02 ma pojemność 2048 bitów, a komórki są 8 bitowe więc komórek jest 256, wiec adres ostatniej komórki to 255, czyli dokładnie jeden bajt. Pamięć której użyłeś ma pojemność 512*1024=524288, dzieląc przez 8 otrzymujemy 65536 komórek pamięci, a do zaadresowania ostatniej potrzeba dwóch bajtów. A to nie koniec niespodzianek. Pamięci których pojemność wymaga niepełnych dwóch bajtów są tak pokręcone że część adresu komórki która "wystaje" poza pierwszy bajt jest upychana w miejsce adresu sprzętowego (te kości mają albo ograniczoną możliwość zmiany adresu albo nie mają tej możliwości wcale).
Podsumowując, może być tak, że funkcje których używasz, były napisane pod inny rozmiar pamięci i twoją kostko nie chcą poprawnie gadać.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 wrz 2019, o 18:28 
Offline
Użytkownik

Dołączył(a): 14 sty 2018
Posty: 108
Pomógł: 0

Fakt, zapomniałem dodać funkcji :)

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


fragment z BCD i ogólnie obsługa TWI jest z płyty blubuka, w której fragment kodu wygląda właśnie tak:
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: 11 wrz 2019, o 22:32 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 paź 2014
Posty: 832
Lokalizacja: Trójmiasto
Pomógł: 155

Funkcje TWI_write_buf i TWI_read_buf są niewłaściwe dla pamięci 24C512, tak jak pisałem wcześniej, w obecnej postaci nadają się do obsługi pamięci 24C01 i 24C02.
Z kolei funkcje EI2C_write_buf i EI2C_read_buf są już bliższe prawdy, ale jeszcze nie to, te nadają się do obsługi pamięci 24C04, 24C08 i 24C16.

Tu masz właściwą postać dla 24C512:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 wrz 2019, o 19:51 
Offline
Użytkownik

Dołączył(a): 14 sty 2018
Posty: 108
Pomógł: 0

Wow! Dziękuję bardzo! W wolnej chwili spróbuję powalczyć z zapisywaniem ;)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 wrz 2019, o 20:40 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 paź 2014
Posty: 832
Lokalizacja: Trójmiasto
Pomógł: 155

Masz bluebooka?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 wrz 2019, o 20:50 
Offline
Użytkownik

Dołączył(a): 14 sty 2018
Posty: 108
Pomógł: 0

Tak



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 wrz 2019, o 21:52 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 paź 2014
Posty: 832
Lokalizacja: Trójmiasto
Pomógł: 155

To ustaw sobie w stopce ikonę bb (można to zrobić w ustawieniach profilu). Dzięki temu jak ktoś będzie chciał Ci pomóc od razu widzi czym dysponujesz, i lepiej może dopasować odpowoedź.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 wrz 2019, o 21:17 
Offline
Użytkownik

Dołączył(a): 14 sty 2018
Posty: 108
Pomógł: 0

UDAŁO SIĘ :!:
Częściowo, ale się udało :twisted: Mam coś takiego:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Zapis i odczyt ogólnie działa, co jest dla mnie ogromną wygraną. Próbowałem zrobić zapis powiązany z licznikiem 1-4, ale jak widać po kodzie adres danych jest ustawiany na wartość licznika 1,2,3 lub 4, więc przy odczycie po prostu się wartości liczników 'values' przesuwają o jeden, zamiast o 7. I tak ma to działać nieco inaczej. Zastanawiam się jak zrobić zapis do czegoś w rodzaju adresu głównego i subadresu (pierwszy obrazek w tym temacie). W funkcji wysyłki eepromu powinna być dodatkowa zmienna, czy można to zrobić poprzez modyfikację obecnej zmiennej odpowiadającej za adres (na powyższym kodzie to preset_buf)?
Nie użyłem struktury, bo na razie próbowałem w ogóle uruchomić zapis i odczyt.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 wrz 2019, o 00:21 
Offline
Użytkownik

Dołączył(a): 14 sty 2018
Posty: 108
Pomógł: 0

Udało mi się zrobić zapisywanie zgodnie z rysunkiem! Wszystko działa w sposób z powyższego posta, bez struktury. Teraz muszę powalczyć nad sprowadzeniem stanów 4 zmiennych do formy bitowej, żeby zapisywać wartość w hexie. Myślę, że to najsensowniejszy sposób



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 15 wrz 2019, o 15:19 
Offline
Użytkownik

Dołączył(a): 14 sty 2018
Posty: 108
Pomógł: 0

No nie wiem jak się za to zabrać. Wiem na jakiej zasadzie to działa, ale nie mogę tego przelać na kod. Potrzebuję zapisać i odczytać stan 0/1 czterech zmiennych, które załączają wyjścia w rejestrze przesuwnym. Fragment kodu ze zmiennymi wygląda tak:

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


Próbowałem wspomóc się filmikiem z tworzenia biblioteki do klawiatury matrycowej, bo tam na takiej zasadzie jest przechowywany stan przycisku. Mile widziana wskazówka :oops:



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

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 0 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