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

(edytowany)
Dnia 18.02.2019 o 11:37, miszczu18 napisał:

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

Ująłbym to inaczej (bo własnie jestem na etapie bliższego zapoznawania się z tym tematem). 
Rejestr TCCR1A owszem nazywa się Rejestrem sterującym A timera/licznika 1 ale znajdujące się w nim poszczególne bity odnoszą się do sterowania modułami output compare A i B.  A konkretnie:
Bity [7:6] – COM1A  – Tryb Compare Output dla Kanału A
Bity [5:4] – COM1B  – Tryb Compare Output dla Kanału B
Bit 3 – FOC1A – Wymuszenie Output Compare w kanale A
Bit 2 – FOC1B – Wymuszenie Output Compare w kanale B
Podczas gdy w rejestrze TCCR1B który również ma podobną nazwę tj.  Timer/Counter1 Control Register B – Rejestr sterujący B timera/licznika 1, ale znajdują się bity dotyczące np. preskalera czy wyboru zegara bądź zbocza na pinach wyjściowych.
 

Dnia 23.02.2019 o 16:31, Saalin napisał:

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. 

A z tym wpisem nie koniecznie się zgodzę, choć moja wiedza w tym temacie jeszcze tak daleko nie sięga. Bo jednak są w rejestrze TIMSK bity odpowiadające za tryb zgłoszenie przerwania OCIE1A i OCIE1B i dalej rejestr TIFR... Gdzieś w literaturze niedawno wyczytałem, że w ten sposób uzyskuje się przesunięcie fazowe generowanych impulsów na pinach wyjściowych? Ważnym jednak jest że wartości wpisane OCR1A i OCR1B muszą być różne. Jak mi wpadnie w oko to dopiszę gdzie to widziałem. 

Pozdrawiam Krzysztof. 

I znalazłem: Język C dla mikrokontrolerów AVR od podstaw do zaawansowanych aplikacji p. Tomasz Francuz napisał:
"... Efektem ubocznym wykorzystania rejestru OCR1A jest generowanie zdarzeń Compare Match każdorazowo, kiedy licznik timera osiągnie wartość równą rejestrowi OCR1A. Rejestr OCR1B można wykorzystać do przesuwania fazy sygnału pojawiającego się na pinie OC1B w stosunku do fazy OC1A. 
Jeśli wartość rejestru OC1B będzie większa niż OC1A, to zdarzenie Compare Match B nigdy nie wystąpi.
..."

Edytowano przez KaDe
Link do komentarza
Share on other sites

Chcę się nauczyć programowania w C AVRy i potrzebuję wskazówek. Jakie książki kupić , jakie oprogramowanie , jakie programatory. Itp. X góry dziękuję za odpowiedź.

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Dla mnie to poprostu świetna zabawa. Pisłem 30 lat temu w Paskalu teraz ch ę  w C. Jak dobrze opanuję AVRy to być może dalej. Ucze sie z kursów Forbota i są dobre, jednak ja chcę sam pisać, a nie instalować biblioteki, które robią całą robotę za mnie. Tak jak w modlarstwie , bardziej cieszy zbudowanie modelu statku od zera niż  poskładanie go z gotowych elementów. Dzieki za link.

Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • 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.