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 25 kwi 2025, o 14:27


    Strefa czasowa: UTC + 1





    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 10 ] 
    Autor Wiadomość
    PostNapisane: 19 lut 2019, o 12:07 
    Offline
    Nowy

    Dołączył(a): 19 lut 2019
    Posty: 4
    Pomógł: 0

    Cześć. Chciałem skonfigurować sobie przerwanie (na razie zmiana stanu diody) na mojej ATmedze w oparciu o niebieską książkę tylko, że pojawił się problem. W nocie katalogowej znalazłem że mam tylko jeden timer z trybem CTC, który ma dwa kanały (nie bardzo wiem co to znaczy). No to patrzę dalej, chcę ustawić tryb. Na stronie 97 jest tabelka tylko, że tam są dwa tryby CTC ( też nie wiem zbytnio czemu) no ale wybrałem ten pierwszy. Chcę ustawić preskaler. W TCCR1A nie ma takiej możliwości ale jest w TCCR1B. No to skoro tu użyłem kanału B no to wszędzie go użyję. Wyszło na to, że wszędzie mogę mieć te rejestry z dopiskiem B ale wartość którą ma porównywać musi być w w OCR1A. Dlaczego nie w OCR1B?
    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: 19 lut 2019, o 12:46 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 26 sty 2016
    Posty: 1168
    Lokalizacja: Kraków
    Pomógł: 93

    Ale to nie do końca tak działa. TCCR1 jest podzielony na dwa rejestry, ponieważ jest zbyt dużo nastaw jak na jeden 8-bitowy rejestr.
    TCCR1A nie odnosi się tylko do kanału A!
    Zauważ: w rejestrze TCCR1A bity 7 i 6 dotyczą kanału A, bity 5 i 4 dotyczą kanału B.
    Bit 3 dotyczy kanału A, bit 2 - kanału B.
    Bity 1 i 0 razem z bitami 4 i 3 z rejestru TCCR1B! służą do wyboru trybu pracy.

    W Twoim przypadku, jeśli chcesz ustawić tryb 4 (CTC), ustawiasz bit WGM12, który jest w rejestrze TCCR1B.

    miszczu18 napisał(a):
    dwa tryby CTC ( też nie wiem zbytnio czemu)
    Różnią się maksymalną wartością - poczytaj dobrze.

    Tak mi przyszło do głowy, a nie możesz ustawić bitu COM1A0 (w rejestrze TCCR1A), żeby stan pinu sam się zmieniał? (To tylko taka luźna myśl, poprawcie mnie, jeśli się mylę).


    Autor postu otrzymał pochwałę


    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 19 lut 2019, o 13:07 
    Offline
    Nowy

    Dołączył(a): 19 lut 2019
    Posty: 4
    Pomógł: 0

    Okej ale w takim razie po co jest OCR1B skoro liczy do OCR1A bo nie bardzo czaje.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 19 lut 2019, o 13:52 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 31 mar 2015
    Posty: 310
    Pomógł: 18

    OCR1A bierze decydujący udział w pracy licznika i wynik porówna może wysłać do pinu OC1A jeśli wyjście jest ustawione.
    Porównanie TCNT1 z OCR1B obsługuje tylko drugi kanał, czyli OC1B.
    Należy pamiętać, by wartość OCR1A była większa od wartości OCR1B.
    Oto schemat blokowy Timera1:
    Obrazek



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 19 lut 2019, o 14:13 
    Offline
    Nowy

    Dołączył(a): 19 lut 2019
    Posty: 4
    Pomógł: 0

    Czyli tylko OCR1A reaguje na przerwanie i zeruje licznik?
    Bo próbowałem obsłużyć to tak że OCR1B<OCR1A ale tak jakby działało tylko na OCR1A a drugą wartość ignorowało. I nie wiem jak skorzystać z tej drugiej wartości. I co to są te kanały? Tak jakby licznik liczy ale mogę obsłużyć dwa różne przerwania?



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 19 lut 2019, o 14:32 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 26 sty 2016
    Posty: 1168
    Lokalizacja: Kraków
    Pomógł: 93

    Kanały oznaczają, że możesz sterować dwoma pinami - opisanymi jako OC1A, OC1B. To, o czym pisałem wcześniej:
    Marhef napisał(a):
    możesz ustawić bitu COM1A0 (w rejestrze TCCR1A), żeby stan pinu sam się zmieniał
    dotyczy właśnie pinu OC1A (PB1?).
    Licznik zlicza do wartości OCR1A. Jeżeli OCR1B będzie mniejsze niż OCR1A, to po osiągnięciu tej wartości wywołana zostanie funkcja obsługi przerwania TIMER1_COMPB_vect, którą możesz wykorzystać.

    Nazwy rejestrów i funkcji piszę bez dokumentacji, możliwe, że zrobiłem jakąś literówkę albo coś pomieszałem.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 19 lut 2019, o 14:44 
    Offline
    Nowy

    Dołączył(a): 19 lut 2019
    Posty: 4
    Pomógł: 0

    I po tym wywołaniu jak dojdzie do OCR1B muszę ręcznie kasować stan licznika tak? Bo tak próbowałem że dałem OCR1A na 60000 a OCR1B na 15000, był TIMER1_COMPB_vect ale liczyło cały czas do OCR1A



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 19 lut 2019, o 15:01 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 26 sty 2016
    Posty: 1168
    Lokalizacja: Kraków
    Pomógł: 93

    No tak, będzie zliczało do OCR1A.
    Jeśli chcesz, żeby licznik zerował się sam, użyj przerwania TIMER1_COMPA_vect



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 19 lut 2019, o 16:11 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 31 mar 2015
    Posty: 310
    Pomógł: 18

    W rejestrze TIFR jest flaga OCF1B od porównania OCR1B - nie wiem, jak ją odczytać.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 19 lut 2019, o 17:25 
    Offline
    Użytkownik
    Avatar użytkownika

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

    Cytuj:
    I po tym wywołaniu jak dojdzie do OCR1B muszę ręcznie kasować stan licznika tak? Bo tak próbowałem że dałem OCR1A na 60000 a OCR1B na 15000, był TIMER1_COMPB_vect ale liczyło cały czas do OCR1A

    To do jakiej wartości będzie zliczał licznik ściśle zależy od wybranego trybu pracy.
    Obrazek
    Tryby CTC dla tego licznika są dwa, w jednym licznik zlicza do wartości "OCR1A" w drugim do wartości "ICR1" więc tylko w tych dwóch przypadkach licznik jest resetowany w momencie porównania.
    Porównanie od rejestru OCR1B NIE resetuje licznika. Może jedynie wywołać osobne przerwanie od porównanie OCR1B.
    Generalnie licznik ten ma dwa porównania głównie z zamysłem o trybach PWM - w oparciu o ten licznik dzięki dwum porównaniom można uruchomić 2 kanały PWM.



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

    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