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



Teraz jest 21 lis 2024, o 21:18


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 ]
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 ]
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:  
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO