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

KURS HOME ASSISTANT

Chcesz zautomatyzować swój dom bez skomplikowanego kodowania?
Zastanawiasz się nad wyborem sprzętu, oprogramowania i aplikacji?
Od czego zacząć przygodę z HA w 2025? Co będzie najlepsze na start?

Nasz kurs Home Assistant nauczy Cię krok po kroku, jak łatwo zautomatyzować swój dom i oszczędzić na rachunkach za prąd i ogrzewanie. Bez chmur, bez zbędnych abonamentów. Twoja przygoda z Home Assistant zaczyna się tutaj!

↓↓↓

    Szanujemy Twoją prywatność. Możesz wypisać się w dowolnym momencie.




    Teraz jest 12 kwi 2025, o 21:54


    Strefa czasowa: UTC + 1





    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 9 ] 
    Autor Wiadomość
    PostNapisane: 19 sie 2019, o 08:29 
    Offline
    Użytkownik

    Dołączył(a): 18 sie 2019
    Posty: 69
    Zbananowany użytkownik

    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: 20 sie 2019, o 13:34 
    Offline
    Użytkownik

    Dołączył(a): 18 sie 2019
    Posty: 69
    Zbananowany użytkownik

    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 19:55 
    Offline
    Użytkownik

    Dołączył(a): 18 sie 2019
    Posty: 69
    Zbananowany użytkownik

    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:19 
    Offline
    Użytkownik
    Avatar użytkownika

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

    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: 11 wrz 2019, o 07:30 
    Offline
    Użytkownik
    Avatar użytkownika

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

    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 22:32 
    Offline
    Użytkownik
    Avatar użytkownika

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

    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 ] [ Zaznacz wszystko ]
    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 20:40 
    Offline
    Użytkownik
    Avatar użytkownika

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

    Masz bluebooka?



    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: 1033
    Lokalizacja: Trójmiasto
    Pomógł: 190

    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: 4 paź 2019, o 17:35 
    Offline
    Użytkownik
    Avatar użytkownika

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

    Nie wiem czy dobrze rozumiem Twój problem bo trochę chaotycznie to opisujesz.
    Rozumiem to tak, że masz rejestr który czymś steruje, i chcesz mieć możliwość odczytanie stanu pinów rejestru i zapisu ich w rozbiciu na zmienne, oraz w drugą stronę ze zmiennych chcesz mieć możliwość wysłać ich stan do rejestru
    Takie coś możesz zrobić na zwykłych warunkach if:
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    dodatkowe ale:
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
    nie wiem skąd Ci się to wzięło ale ten zapis ustawia 0 a nie jeden i na odwrót z drugim zapisem, chyba że potrzebujesz mieć wartość zanegowaną, bo np masz diody sterowane zerem...



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

    Strefa czasowa: UTC + 1


    Kto przegląda forum

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