ATNEL tech-forum
https://forum.atnel.pl/

[atmega328p] przerwanie timera w trybie ctc
https://forum.atnel.pl/topic21212.html
Strona 1 z 1

Autor:  bmenot [ 1 wrz 2018, o 21:48 ]
Tytuł:  [atmega328p] przerwanie timera w trybie ctc

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.

Autor:  andrews [ 2 wrz 2018, o 11:06 ]
Tytuł:  Re: [atmega328p] przerwanie timera w trybie ctc

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

Autor:  bmenot [ 2 wrz 2018, o 13:28 ]
Tytuł:  Re: [atmega328p] przerwanie timera w trybie ctc

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

Autor:  andrews [ 2 wrz 2018, o 14:49 ]
Tytuł:  Re: [atmega328p] przerwanie timera w trybie ctc

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.

Autor:  bmenot [ 2 wrz 2018, o 15:42 ]
Tytuł:  Re: [atmega328p] przerwanie timera w trybie ctc

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

Autor:  andrews [ 2 wrz 2018, o 16:37 ]
Tytuł:  Re: [atmega328p] przerwanie timera w trybie ctc

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.

Autor:  bmenot [ 4 wrz 2018, o 19:47 ]
Tytuł:  Re: [atmega328p] przerwanie timera w trybie ctc

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.

Autor:  andrews [ 4 wrz 2018, o 20:16 ]
Tytuł:  Re: [atmega328p] przerwanie timera w trybie ctc

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.

Strona 1 z 1 Strefa czasowa: UTC + 1
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/