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? 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 17 cze 2025, o 19:04


    Strefa czasowa: UTC + 1





    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 6 ] 
    Autor Wiadomość
    PostNapisane: 2 lip 2021, o 11:39 
    Offline
    Nowy

    Dołączył(a): 25 kwi 2019
    Posty: 6
    Lokalizacja: Szczecin
    Pomógł: 0

    Witam, od kilku dni borykam się z problemem zapisu aktualnej wartości pwm do pamięci EEPROM. Przeszukałem forum, obejrzałem poradniki i napisałem w końcu swój program, wydaje mi się że dobrze, ale on nie działa i nie wiem dlaczego. Program jest prosty, mam 3 klawisze, jednym rozjaśniam diodę, drugim ściemniam a trzecim chcę zapisać aktualną wartość OCR1A do eeproma tak, żeby po ponownym załączeniu pwm miał wypełnienie takie, jak w momencie zapisu. Niestety po każdym restarcie pwm startuje od zera. Procek ATtiny44, poniżej kod. Jeśli ktoś mógłby mi coś podpowiedzieć będę wdzięczny.
    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.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 2 lip 2021, o 12:51 
    Offline
    Użytkownik

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

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

    W linijce 64 napisałeś jak powyżej.
    Po pierwsze nie możesz w ten sposób przypisać wartości do zmiennej w EEPROM, powinieneś użyć do tego funkcji (np. eeprom_write_word ()).
    Po drugie, podejrzewam, że chciałeś w tym miejscu skopiować wartość zmiennej pwm1 do zmiennej ram_cfg.pwm1, bo tak faktycznie nigdzie indziej tego nie robisz, więc jak zapisujesz ram_cfg do eem_cfg, to tam nie ma aktualnej wartości. Gdybyś więc w linijce 64 zamiast eem_cfg.pwm1 = pwm1; napisał ram_cfg.pwm1 = pwm1;, to zapis do EEPROM miałby szansę zadziałać prawidłowo, czyli zgodnie z Twoimi oczekiwaniami.
    Nie sprawdzałem dokładnie, czy nie masz innych błędów, na razie zacznij od tego, co napisałem.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 2 lip 2021, o 14:32 
    Offline
    Moderator
    Avatar użytkownika

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

    marian253 napisał(a):
        while(1) {
     
            eem_cfg.pwm1 = pwm1;


    Dobrze, że nie udał ci się ten zapis - bo próbowałeś go robić (zastanowiłeś się ile razy? .... no cały pierdyliard razy na sekundę - więc szybko zajechałbyś na śmierć biednego eeproma ! :(

    Panie pisałeś że pod klawiszem niby zapisujesz ? a gdzie to widać w kodzie ? ;)

    No właśnie tu musisz :
    Cytuj:
    if (!(K_PIN & KEY3)) {
    ram_cfg.pwm1 = pwm1; - toż zapis parametru do struktury w RAM .. a później zapis tej struktury do EEPROM ;)
    copy_ram_to_eem(); // kopiowanie ram do eeprom


    Autor postu otrzymał pochwałę

    _________________
    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  
    PostNapisane: 2 lip 2021, o 22:31 
    Offline
    Nowy

    Dołączył(a): 25 kwi 2019
    Posty: 6
    Lokalizacja: Szczecin
    Pomógł: 0

    Dziękuję za szybką odpowiedź.

    andrews napisał(a):
    Gdybyś więc w linijce 64 zamiast eem_cfg.pwm1 = pwm1; napisał ram_cfg.pwm1 = pwm1;, to zapis do EEPROM miałby szansę zadziałać prawidłowo, czyli zgodnie z Twoimi oczekiwaniami

    Zmieniłem zapis w linii 64 ale nic to nie dało.

    Zrobiłem tak jak Mirek sugerował, czyli pod klawiszem dorzuciłem: ram_cfg.pwm1 = pwm1; ale dalej nie działa, pwm cały czas startuje od zera.
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

    Może jeszcze brakuje czegoś przed pętlą while(1) żeby dane wczytały się ramu.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 3 lip 2021, o 11:16 
    Offline
    Użytkownik

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

    marian253 napisał(a):
    Może jeszcze brakuje czegoś przed pętlą while(1) żeby dane wczytały się ramu.

    Znasz przyczynę, tyko nie potrafisz znaleźć rozwiązania?

    Do rejestru OCR1A wpisujesz wartość zmiennej pwm1 (linijka 66).

    Zmienna pwm1 jest zadeklarowana globalnie i nie jest zainicjowana żadną wartością, więc podczas startu programu zostanie wyzerowana. Jeśli więc wpiszesz jej wartość do OCR1A (linijka 66), to PWM wystartuje od zera.

    Zapisaną w EEPROM wartość zmiennej eem_cfg.pwm1 wczytujesz przed pętlą while do zmiennej w RAM ram_cfg.pwm1 (linijka 60), a do rejestru OCR1A wpisujesz (wyzerowaną) zmienną pwm1. Nie masz za to nigdzie przypisania do zmiennej pwm1 odczytanej z EEPROM wartości ram_cfg.pwm1 i dlatego Ci to nie działa. Powinieneś po linijce 60 (copy_eem_to_ram();) dodać linijkę
    pwm1 = ram_cfg.pwm1;

    marian253 napisał(a):
    Zrobiłem tak jak Mirek sugerował, czyli pod klawiszem dorzuciłem: ram_cfg.pwm1 = pwm1;

    Skoro zrobiłeś tak, jak Mirek zalecił to jeszcze usuń tę linijkę 64 (eem_cfg.pwm1 = pwm1;)


    Autor postu otrzymał pochwałę


    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 3 lip 2021, o 13:13 
    Offline
    Nowy

    Dołączył(a): 25 kwi 2019
    Posty: 6
    Lokalizacja: Szczecin
    Pomógł: 0

    Panowie, dziękuję za pomoc, działa rewelacyjnie! :D

    Andrews
    Wszystko co piszesz ma logiczny sens. Niestety ja nie jestem programistą z wykształcenia, bazuję głównie na książkach i poradnikach Mirka, i jeszcze dużo muszę się nauczyć.
    W międzyczasie przeniosłem projekt na ATmege32, poniżej zamieszczam kod, który działa właśnie na ATmedze32, jest krótki i pozwala zrozumieć cały ten mechanizm. Myślę, że wielu osobom pomoże. Jeszcze raz dziękuję i pozdrawiam.
    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.



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

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