Skocz do zawartości
miszczu18

ATmega8 timer 1 w trybie CTC

Pomocna odpowiedź

Cześć. Próbowałem przećwiczyć przerwania migając diodą co 0.5 sekundy ale dioda nie zmienia stanu. Znalazłem w nocie katalogowej, że dla mojej  ATmegi8, timer1 ma tryb CTC i ma dwa kanały(niezbyt wiem co to znaczy). W channel a nie ma preskalera do ustawienia więc postanowiłem użyć channel b ale nie działa mi to.

#include <avr/io.h>
#include <avr/interrupt.h>

int main(void){
	DDRC|=(1<<PC3);
	PORTC|=(1<<PC3);

	TCCR1B|=(1<<WGM13)|(1<<WGM12); //USTAWIAM TRYB CTC
	TCCR1B|=(1<<CS12);//PRESKALER NA 256
	OCR1B=62499;//ZEBY WYSZLO 0.5Hz
	TIMSK=(1<<OCIE1B);//ODBLOKOWANIE PRZERWANIA

	sei();

	while(1){}
}

ISR(TIMER1_CAPT_vect){
	PORTC^=1<<PC3;
}

 

Rozwiązałem problem. 

1. Zamiast Hz w obliczeniach dałem 0.5 sekundy więc obliczenia bez sensu i zła wartość do OCR1x. Powinno wyjść 15624.

2.Zła nazwa wektora przerwania w ISR(), powinno być TIMER1_COMPA_vect.

3. Ogólnie ustawianie trybu pracy i preskalera jest a kanale B ale wpisywanie wartości do porównania, odblokowanie i wektor przerwania są na kanale A. Nie mam pojęcia dlaczego. Mógłby mi to ktoś wytłumaczyć?

#include <avr/io.h>
#include <avr/interrupt.h>

int main(void){
	DDRC|=(1<<PC3);
	PORTC|=(1<<PC3);

	TCCR1B|=(1<<WGM12); //USTAWIAM TRYB CTC
	TCCR1B|=(1<<CS12);//PRESKALER NA 256
	OCR1A=15624;//ZEBY WYSZLO 0.5Hz
	TIMSK=(1<<OCIE1A);//ODBLOKOWANIE PRZERWANIA

	sei();

	while(1){}
}

ISR(TIMER1_COMPA_vect){
	PORTC^=(1<<PC3);
}

 

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites
(edytowany)
Cytat

Ogólnie ustawianie trybu pracy i preskalera jest a kanale B ale wpisywanie wartości do porównania, odblokowanie i wektor przerwania są na kanale A. Nie mam pojęcia dlaczego. Mógłby mi to ktoś wytłumaczyć?

Zaznaczam, że jestem zupełnie początkujący w temacie AVR i bardzo chętnie sam przeczytam ewentualne sprostowanie tego co napisze. TCCR1A i TCCR1B (tj. sufiks A i B) nie dotyczą kanałów to tylko oznaczenie typu 'pierwszy' i 'drugi'. Dzięki dwu kanałom w zegarze możemy porównywać stan zegara z dwoma wartościami i mieć różne OCR1A i OCR1B i odpowiadające im przerwania. Niemniej w trybie CTC, jak nazwa trybu wskazuje, licznik ulega wyzerowaniu po dotarciu do ustawionej wartości TOP, dlatego w tym wypadku nie ma czegoś takiego jak niezależny tryb CTC dla drugiego kanału. 

Edytowano przez Saalin
  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Gość
Napisz odpowiedź...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.


×
×
  • Utwórz nowe...