Skocz do zawartości

ATmega8 timer 1 w trybie CTC


miszczu18

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
Link do komentarza
Share on other sites

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
Link do komentarza
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!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

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

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.