miszczu18 Napisano Luty 18, 2019 Udostępnij Napisano Luty 18, 2019 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); } 1 Cytuj Link do komentarza Share on other sites More sharing options...
Saalin Luty 23, 2019 Udostępnij Luty 23, 2019 (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 Luty 23, 2019 przez Saalin 1 Cytuj Link do komentarza Share on other sites More sharing options...
Pomocna odpowiedź
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!