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 10 lip 2025, o 23:28


    Strefa czasowa: UTC + 1





    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 4 ] 
    Autor Wiadomość
    PostNapisane: 2 maja 2014, o 01:17 
    Offline
    Użytkownik

    Dołączył(a): 18 kwi 2014
    Posty: 25
    Pomógł: 0

    Witam.
    Chcę skorzystać z trybu CTC timera0 do obsługi dwóch różnych przerwań na uC atmega328P. Posiada on dwa 8-bitowe rejestry porównania: OCR0A oraz OCR0B. Chciałbym aby pierwsze przerwanie uruchomiło się gdy rejestr TCNT0 == OCR0A, definiuję je w następujący sposób:
    Kod:
    ISR(TIMER0_COMPA_vect)

    tutaj wszystko działa bez zarzutów, natomiast drugie przerwanie chciałbym uruchomić gdy rejestr TCNT0 == OCR0B i jest ono zdefiniowane:
    Kod:
    ISR(TIMER0_COMPB_vect)

    jednak to już nie działa. W przypadku gdy wrzucę kod drugiego przerwania do pierwszego to program działa poprawnie z czego wnioskuję że sama procedura jest dobrze napisana. I tutaj moje pytanie czy mogę jednocześnie (nie do końca jednocześnie bo OCR0A nie jest równe OCR0B w moim przypadku) rejestr TCNT0 porównywać z OCR0A i OCR0B? Poniżej inicjalizacja timera:
    Kod:
    TCCR0A |= (1<<WGM01);
    TCCR0B |= (1<<CS02);
    OCR0A = 234;
    OCR0B = 250;
    TIMSK0 |= (1<<OCIE0A) | (1<<OCIE0B);



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 2 maja 2014, o 01:53 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 05 sie 2013
    Posty: 1154
    Lokalizacja: Lublin / Kraków
    Pomógł: 72

    Nigdy tak nie robiłem. Ale z tego co widzę w nocie to rejestr OC0RA zawiera wartość TOP. Po jej osiągnięciu zawartość TCNT0 jest zerowana. Więc jeśli OCR0B > OCR0A (tak jak u Ciebie) to przerwanie od bitu OCIE0B nie ma szansy się wykonać bo ten bit nigdy nie zostanie ustawiony ponieważ po osiągnięciu wartości OCR0A licznik zostanie wyzerowany i nigdy nie osiągnie wartości OCR0B.
    Dlatego myślę, w rejestrze OCR0B musi znajdować się mniejsza wartość.
    OCR0B < OCR0A.

    Spróbuj... ;)


    Autor postu otrzymał pochwałę


    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 2 maja 2014, o 02:03 
    Offline
    Użytkownik

    Dołączył(a): 18 kwi 2014
    Posty: 25
    Pomógł: 0

    Działa :D Dziękuję bardzo za pomoc.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 2 maja 2014, o 02:05 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 05 sie 2013
    Posty: 1154
    Lokalizacja: Lublin / Kraków
    Pomógł: 72

    Wystarczy tylko zamienić procedury przerwań miejscami ;)
    Fajnie że działa. Powodzenia.



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

    Strefa czasowa: UTC + 1


    Kto przegląda forum

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