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 1 maja 2025, o 00:15


    Strefa czasowa: UTC + 1





    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 8 ] 
    Autor Wiadomość
    PostNapisane: 1 wrz 2018, o 21:48 
    Offline
    Użytkownik

    Dołączył(a): 04 kwi 2015
    Posty: 26
    Pomógł: 0

    Witam, chciałem podłączyć drugą parę pinów pod przerwanie w timerze 16bit. w trybie CTC w taki sposób aby pracowały na przemian razem z pinami sprzętowymi PB1 i PB2 wykorzystując przerwania TIMER1_COMPA_vect i TIMER1_COMPB_vect. Nie udaje się mi to osiągnąć, cały czas przerwania pracują razem z pinami PB1 lub PB2 zależnie od ustawienia bitu: FOC1A lub FOC1B.

    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 wrz 2018, o 11:06 
    Offline
    Użytkownik

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

    Wybacz, ale z Twojego tłumaczenia niewiele zrozumiałem:
    bmenot napisał(a):
    ...aby pracowały na przemian razem z pinami sprzętowymi PB1 i PB2...

    bmenot napisał(a):
    Nie udaje się mi to osiągnąć, cały czas przerwania pracują razem z pinami PB1 lub PB2


    Jeśli oczekujesz pomocy, spróbuj może to jakoś usystematyzować, bo obawiam się, że nie tylko ja mam problem ze zrozumieniem.
    Spróbuj może w ten sposób:
    1. początkowy stan pinów: PB1=x, PB2=x, PD2=x, PD3=x (gdzie x to oczywiście oczekiwany stan pinu 0 lub 1)
    2. po określonym czasie równym n [mikro/mili]sekund piny powinny zmienić swój stan na: PB1=x, PB2=x, PD2=x, PD3=x
    3. po określonym czasie równym n [mikro/mili]sekund piny powinny zmienić swój stan na: PB1=x, PB2=x, PD2=x, PD3=x
    4. powrót do punktu 1

    Na co mógłbym zwrócić uwagę w tej chwili?

    Piny PB1 i PB2 są ustawiane sprzętowo, a piny PD2 i PD3 programowo (w procedurze obsługi przerwania) więc będziesz miał pewne przesunięcie czasowe między nimi.

    Nie ustawiasz w ogóle rejestrów OCR1A i OCR1B, więc obydwa przerwania występują w tym samym momencie (kiedy TCNT1 osiąga 0). Procedury obsługi przerwania zostaną wykonane prawie jednocześnie, jedno po drugim (w krótkim odstępie czasu około 30 taktów), więc to co zostanie zmienione przez jedną procedurę obsługi przerwania, za chwilę zostanie cofnięte przez drugą...

    Może kiedy opiszesz Twój problem dokładniej, można będzie coś bardziej konkretnego doradzić...



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 2 wrz 2018, o 13:28 
    Offline
    Użytkownik

    Dołączył(a): 04 kwi 2015
    Posty: 26
    Pomógł: 0

    chcę aby pin PD2 był kopią pinu PB1, a pin PD3 był kopią pinu PB2...

    Piny sprzętowe pracują na przemian tak jak oczekiwałem...
    Piny programowe (PD2 i PD3) pracują w razem z pinem PB1,
    Pin PB2 nie udaje się połączyć z jednym z pinów programowych



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 2 wrz 2018, o 14:49 
    Offline
    Użytkownik

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

    Wystarczy Ci jedno przerwanie:
    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.


    Pamiętaj jednak o tych przesunięciach czasowych o których pisałem wcześniej. Nie wiem, do czego ten kod potrzebujesz, ale jeśli na przykład do sterowania mostkiem H, to nie jest to zbyt dobre rozwiązanie.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 2 wrz 2018, o 15:42 
    Offline
    Użytkownik

    Dołączył(a): 04 kwi 2015
    Posty: 26
    Pomógł: 0

    Myślałem nad tym rozwiązaniem ale jednak wolałbym przez dwa przerwania: TIMER1_COMPA_vect i TIMER1_COMPB_vect.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 2 wrz 2018, o 16:37 
    Offline
    Użytkownik

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

    Podałem Ci sposób (gotowy kod), jak rozwiązać Twój problem. Próbowałem wytłumaczyć, dlaczego rozwiązanie z dwoma przerwaniami jest w tym przypadku gorsze. Jeśli pomimo tego chcesz to zrobić na dwóch przerwaniach (choć ja kompletnie nie rozumiem, z jakiego powodu), to przecież Twój wybór. Zrobisz jak zechcesz.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 4 wrz 2018, o 19:47 
    Offline
    Użytkownik

    Dołączył(a): 04 kwi 2015
    Posty: 26
    Pomógł: 0

    andrews 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.



    U mnie to nie działa mrugają dwa ledy razem.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 4 wrz 2018, o 20:16 
    Offline
    Użytkownik

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

    A ustawiłeś jeden z pinów portu D w stan wysoki we funkcji inicjującej timer_16bit_init(), tak jak Ci podałem w przykładowym kodzie?
    Gdybyś tak zrobił to na pewno by działało.

    Jeśli jeden z pinów wstępnie ustawisz w stan wysoki (np. wewnątrz funkcji timer_16bit_init())
    PORTD |= (1<<PD2);
    pozostawiając drugi w stanie niskim, to później instrukcja w procedurze obsługi przerwania
    PORTD ^= ( (1<<PD2) | (1<<PD3) );
    spowoduje miganie na przemian.


    Autor postu otrzymał pochwałę


    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 2 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