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



Teraz jest 5 lis 2024, o 07:40


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ł: Majestic-12 [Bot] 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