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 31 maja 2025, o 23:21


    Strefa czasowa: UTC + 1





    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 8 ] 
    Autor Wiadomość
    PostNapisane: 21 mar 2018, o 09:21 
    Offline
    Nowy
    Avatar użytkownika

    Dołączył(a): 21 mar 2018
    Posty: 4
    Pomógł: 0

    Witam wszystkich.

    Napisałem program w którym steruję jasnością LED za pomocą enkodera, a wartość maksymalna licznika od PWM jest wyświetlana na LCD. Wszystko działa super z jednym wyjątkiem.

    Gdy pokręcę enkoderem by zmniejszyć wartość OCR2A z 1 do 0, dioda gaśnie całkowicie. Wyłącza się PWM, pin przełącza się w stan niski. Gdy jednak OCR2A ma wartość 255 i przekręcę enkoderem w prawo, tak by zmienna uint8_t pwm przyjęła wartość 255+1 czyli 0, dioda nadal pozostaje zapalona z pełną jasnością. W tym czasie LCD wyświetla wartość zmiennej pwm i faktycznie wynosi ona 0. Nie rozumiem czemu w takim razie nie zadziałało wyłączenie PWM.

    Do celów testowych dopisałem funkcję która przypisuje zmiennej pwm wartość 0, wyłącza timer, ustawia pin PB3 na 0 i wysyła wartość zmiennej do LCD. W ten sposób zauważyłem, że jestem w stanie wyłączyć diodę tylko, gdy OCR2A ma wartość poniżej 210. Od 210 jest zero reakcji na przycisk.

    Skąd się bierze takie zachowanie? To jakieś zabezpieczenie przed zbyt gwałtowną zmianą wartości? Timer działa w trybie fast-PWM.


    ATMega328p 16Mhz
    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.



    Ostatnio edytowano 21 mar 2018, o 14:06 przez PUTINTIN, łącznie edytowano 3 razy

    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 21 mar 2018, o 09:46 
    Offline
    Użytkownik

    Dołączył(a): 27 lip 2017
    Posty: 61
    Lokalizacja: Polska
    Pomógł: 0

    Czy dobrze ustawiasz ? Zamiast pinb3 użyj PB3

    ------------------------ [ Dodano po: 2 minutach ]

    I zaniast unt8_t pusz uint8_r

    ------------------------ [ Dodano po: 3 minutach ]

    A sprawdz debugerem na 1 diodzie led czy sie procek nie zawiesza

    ------------------------ [ Dodano po: 6 minutach ]

    Wiem o tym że to dział rybny ale sprawdz oscyloskopem czy pwm sie nie zawiesza lub debugerem na 1 diodzie led lub na uart



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 21 mar 2018, o 10:05 
    Offline
    Nowy
    Avatar użytkownika

    Dołączył(a): 21 mar 2018
    Posty: 4
    Pomógł: 0

    Heh, literówka się wkradła, oczywiście powinno być uint8_t. Kod przepisywałem ręcznie.

    Procek się nie zawiesza, gdyż dalej mogę sterować diodą. Do debugowania mam ten LCD, przez co wiem, że jednak coś się tam dzieje i jaki jest stan OCR2A jeśli podmienię LCD_send_int(pwm) na LCD_send_int(OCR2A).

    Widać wtedy, że o ile zmienna pwm przyjmuje wartość 0 to OCR2A dalej ma wartość 255. Dopiero kolejne 'tyknięcie' enkodera zmieniai zmienną OCR2A na 1 i wtedy cofając enkoder dioda wygasza się.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 21 mar 2018, o 11:36 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 11 mar 2014
    Posty: 1475
    Pomógł: 167

    PUTINTIN napisał(a):
    ATMega328p 16Mhz
    A przypadkiem w tym procesorze to nie ma rejestrów dla Timera2 TCCR2A i TCCR2B?

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


    --
    Pozdrawiam,
    Robert



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 21 mar 2018, o 14:01 
    Offline
    Nowy
    Avatar użytkownika

    Dołączył(a): 21 mar 2018
    Posty: 4
    Pomógł: 0

    Jasne, już poprawione. Nie wiem czemu przy przepisywaniu uroiłem sobie, że można to łączyć. W każdym razie problem dalej istnieje.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 21 mar 2018, o 14:37 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 11 mar 2014
    Posty: 1475
    Pomógł: 167

    Dlaczego używasz tryb 7 (TOP = OCR2A) a nie 3 (TOP = 0xFF)?
    Działa Ci po tych poprawkach jakakolwiek regulacja?

    --
    Pozdrawiam,
    Robert



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 21 mar 2018, o 21:18 
    Offline
    Nowy
    Avatar użytkownika

    Dołączył(a): 21 mar 2018
    Posty: 4
    Pomógł: 0

    No tak. Czemu miałaby nie działać? Gdy TCNT2 ma wartosc ponizej OCR2A mam na wyjsciu logiczne 1, a gdy licznik osiągnie wartość OCR2A to mam na wyjściu 0 aż licznik doliczy do 0xff. Tak jest w nocie atmegi i tak działa.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 22 mar 2018, o 01:04 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 11 mar 2014
    Posty: 1475
    Pomógł: 167

    PUTINTIN napisał(a):
    No tak. Czemu miałaby nie działać? Gdy TCNT2 ma wartosc ponizej OCR2A mam na wyjsciu logiczne 1, a gdy licznik osiągnie wartość OCR2A to mam na wyjściu 0 aż licznik doliczy do 0xff. Tak jest w nocie atmegi i tak działa.
    Nie wiem jaki kod testujesz, ale na pewno nie ten co wkleiłeś. Po pierwsze to ma on kilka błędów uniemożliwiających jego skompilowanie. Po drugie to tryb 7 timera 2 jest to fast PWM ze zliczaniem od BOTTOM (czyli 0) do wartości OCR2A. A u Ciebie właśnie na wartości OCR2A ma nastąpić zmiana stanu. Dlatego nie będzie Ci działać! Musisz przestawić timer 2 na tryb 3 - fast PWM ze zliczaniem do 0xFF, wtedy uzyskasz zamierzony efekt.
    Co do wyłączania / nie wyłączania przy wartościach 255 / 0, to nie wiem dlaczego stosujesz takie dziwne mechanizmy.
    Ale przyczynę tego twojego problemu wyjaśnia poniższy obrazek:
    Obrazek

    Jak włączysz wyjście OC2A jako wyjście PWMa, to nie da się nim sterować jako zwykłym portem. Wyłączenie zegara dla PWMa też tego nie zmieni. Jak chcesz tak robić to musisz wyłączyć wyjście OC2A i przywrócić normalne sterowanie pinem:
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



    --
    Pozdrawiam,
    Robert



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

    Strefa czasowa: UTC + 1


    Kto przegląda forum

    Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 3 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:  
    cron
    Sitemap
    Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
    phpBB SEO