Witam,
xardes napisał(a):
Witam. Mam pytanie odnośnie tego fragmentu kodu czyli wykonania podprogramu przerwania :
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Kod:
1 linijka: Rejestrowanie zmiennej statycznej uint16_t licznik (na starcie wyzerowana, można przypisanie zera pominąć. Tak jest przy zmiennych statycznych oraz globalnych)
2 linijka: Podczas przerwania zwiększ zmienną licznik o 1.
3 linijka: Jeżeli zmienna licznik jest większa od 1000 to:
a) wykonaj MIGAJ_LED;
b) wyzeruj zmienną licznik (czyli tak jakby wracamy do punktu 1).
xardes napisał(a):
Gdyż według BB i instrukcji tam zawartych głównie na temat odszukania niezbędnych informacji w nocie katalogowej na temat uruchomienia przerwania, nie zauważyłem informacji na temat trybu CTC oraz odpowiednich nazw bitów dla atmegi8 - ale okej możliwe że mój angielski i moja niewiedza mnie zaskoczyła.
Datasheet to podstawa

Po pierwsze jeżeli kolega szukał przy Timerze0 to jak ktoś wcześnej napisał - Mega8 nie posiada trybu CTC w Timer0.
W Timerze1 np. można już znaleźć taki tryb w tabeli nr 39 (wg DS który posiadam) która jest opisana jako:
Waveform Generation Mode Bit Description.
xardes napisał(a):
Jednak bardziej chciałem się upewnić czy dobrze rozumiem co się dzieje w tym podprogramie czyli :
Przerwanie z tego co wyczytałem działa tak że leci sobie licznik jeśli osiągnie jakąś tam wartość (w BB było ona ładnie dobierana i zapisana w "OCR0" , tutaj nie wiem jaka jest ? ) następuje wyzerowanie tego licznika i wykonanie podprogramu , czyli tutaj stworzona jest jakaś zmienna która całkiem osobno liczy nam tutaj do wartości 1000 , i jeśli osiągnie wartość 1000 następuje zmiana stanu diody - zgadza się ?
Kolega dobrze myśli tylko OCR0 - w Medze8 nie ma jak już wspomniałem. Tutaj korzysta się z TCNT0, który trzeba ustawiać od nowa w każdym przerwaniu. Odsyłam do BB - w II wydaniu strona nr 39.
xardes napisał(a):
I teraz tak się zastanawiam jeśli dalej sami sobie odliczamy jakiś tam czas za pomocą zmiennej "licznik" czy to jest odpowiednie wykorzystanie odliczania czasu przerwania ? Czy powszechny sposób zwiększenia możliwości czasu w jakim sie wykona przerwanie, ponieważ na 8-bitowym Liczniku chyba się nie da z tego co się nagłowiłem osiągnąć czasu 1s ?
I jeszcze jedno już krótkie pytanie, czy jest możliwość wykonania wewnętrznego przerwania w zależności od stanu zmiennej (np: wystąpienie przerwania gdy "volatile zmienna = 1") ??
Przepraszam za ten esej ale będę wdzięczny za każdą pomoc

Czas możesz uzyskać dowolny, np. przerwanie wykona się co 1 ms, czekamy aż licznik naliczy do 1000, więc dioda mignie co 1s - z dokładnością jaką oferuje źródło taktowania. Wewnętrzny oscylator nie grzeszy dokładnością, więc jak by chciał kolega na bazie tego zegarek stworzyć, to życzę powodzenia

Przerwanie od zmiany zmiennej nie słyszałem

Można w przerwaniu zmienić zmienną np. na 1 i w kodzie programu na to zareagować. Wtedy to nazywasz flagami
z Niebieskim pozdRowieniem,
Doman89