Przerwanie Timera w ATmega

Witam,

Mam proste pytanko, na które jednak nie umiałem znaleźć odpowiedzi w specyfikacji (jest gruba więc mogłem przegapić - jak tak to proszę o namiary) Piszę program na ATmega128, w głównej pętli sprawdzam cyklicznie stan portów i w momencie zmiany zapisuje stan i czas do pamięci. Zliczanie czasu jest zrealizowane na 16bitowym Timerze1 z dzielnikiem 8 co na 16MHz zegarze daje zliczanie co 0,5 mikrosekundy. By móc zmierzyć kilka sekund dołożyłem dodatkowy rejestr inkrementowany w przerwaniu Timera1

Przepelnienietimera: in r20, SREG inc r22 out SREG, r20 reti

A pytanko jest takie: Czy może się zdażyć tak, że najpierw przepełni się licznik Timer1, później w głównej pętli zostanie zapisany czas, a dopiero później zostanie obsłużone przerwanie? Inaczej mówiąc - czy mogą wystąpić jakieś przekłamania czy też skok do przerwania występuje dokładnie z przejściem Timera z max na bottom ? Doświadczalnie niczego takiego nie stwierdziłem ale wolałbym się upewnić.

I przy okazji drugie pytanko - opóźnienie czasu zapisania zdarzenia w głównej pętli o obsługę przerwania to: 3 takty na zawartość procedury przerwania, 4 takty na powrót z przerwania (reti) a ile taktów na skok do przerwania ? Inaczej - ile taktów zajmie cała przedstawiona procedura ?

Reply to
Jacek_FH
Loading thread data ...

Dnia 2006-01-22, "Piotrek Sz." snipped-for-privacy@WYTNIJ.gazeta.pl> pisze:

Wiem i nie o tym piszę.

cli <- załóżmy że TCNT1 = 65535, przerwanie jeszcze się nie wywołało in r16,TCNT1L <- przerwanie wyłączone, a TCNT1 = 0, zatrzaskiwany w buforze in r17,TCNT1H mov r18,r22

Może źle myślę ale wytłumacz czemu.

Reply to
Jacek_FH

Dnia 2006-01-22, "Piotrek Sz." snipped-for-privacy@WYTNIJ.gazeta.pl> pisze:

Teraz wszystko pasuje, wczoraj odpowiadałem późno w nocy i z lenistwa nie przyjrzałem się końcówce kodu :(

Ale zastosuję swój kod bo jest o 2-3 takty szybszy:

mov r18,r22 in r16,TCNT1L in r17,TCNT1H cmp r18,r22 brne change st Y+2,r18 st Y+1,r17 st Y+0,r16 ret change: st Y+2,r22 st Y+1,r23 ; r23 = 0 st Y+0,r23 ret

Reply to
Jacek_FH

Dnia 2006-01-22, "Piotrek Sz." snipped-for-privacy@WYTNIJ.gazeta.pl> pisze:

Teraz wszystko pasuje, wczoraj odpowiadałem późno w nocy i z lenistwa nie przyjrzałem się końcówce kodu :( Ale działa tylko dla prescalera = 1 więc zastosuje swój (zresztą o 2-3 takty krótszy):

mov r18,r22 in r16,TCNT1L in r17,TCNT1H cmp r18,r22 brne change st Y+2,r18 st Y+1,r17 st Y+0,r16 ret change: st Y+2,r22 st Y+1,r23 ; r23 = 0 st Y+0,r23 ret

Reply to
Jacek_FH

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.