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



Teraz jest 25 kwi 2024, o 16:44


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 ]
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 
Online
Moderator
Avatar użytkownika

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

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