Opuszczanie handlera w AVR

Jun 13, 2004 5 Replies

Witam,



czy na AVR 8515 mozna w bezpieczny sposob opuscic procedure obslugi przerwania za pomoca ret albo rjmp (oczywiscie po odpowiednim poprawieniu ramki stosu), czy tez ma on wbudowane mechanizmy koniecznie wymagajace reti?



Podrawiam Piotr Wyderski


W artykule <cahb2k$i65$ snipped-for-privacy@news.dialog.net.pl> Piotr Wyderski napisal(a):

Oprócz zdjęcia adresu powrotu ze stosu włącza przerwania (ustawia flagę I w SREG). I tyle.

Marcin Stanisz

RETI rozni sie od RET wylacznie tym, ze ponownie wlacza przerwania. Sekwencja RETI od SEI; RETI; rozni sie tym, ze po reti wykonany zostanie przynajmniej jeden rozkaz przed przyjeciem kolejnego przerwania, natomiast w tym drugim przypadku nie - tym drugim rozkazem bedzie ret. Wykorzystanie rjmp sensu nie ma bo przeciez nie wiesz w ktorym miejscu wystapilo przerwanie, musialbys ten adres pobierac ze stosu.

Wiec moge bezpiecznie zrobic sztuczke polegajaca na umieszczeniu procedury obslugi przerwania wewnatrz innej procedury; dzieki wam obu za wyjasnienie watpliwosci.

Rzecz w tym, ze prawie dokladnie wiem, bo to przerwanie z komparatora, uruchamiane w scisle okreslonym miejscu.

Pobieram, ale nie jako adres powrotny, lecz do uscislenia co to znaczy "prawie" w powyzszym akapicie i skorygowania zawartsci licznika. :-)

Pozdrawiam Piotr Wyderski

Nie bardzo rozumiem co chcesz osiagnac .. ale z przerwaniami uwazaj.

To po co przerwanie ? :-)

J.

Konwerter ADC dual slope z mozliwie dokladnym licznikiem. Konkretnie to w chwili obecnej wyglada tak:

; analog to digital conversion

adc_convert:

clr ZL clr ZH

; enable comparator interrupt source

sbi ACSR,ACIE

; enter capacitor charging mode

cbi DDRB,PB2 cbi PORTD,PD6

adc_loop:

; analog comparator interrupt will break the loop

adiw ZL,0x02 rjmp adc_loop

; analog comparator interrupt handler

irq_comparator:

; disable comparator interrupt source

cbi ACSR,ACIE sei

; enter capacitor discharging mode

sbi PORTD,PD6 sbi DDRB,PB2

; get the return address

pop tmp pop tmp

; check whether the value should be adjusted

cpi tmp,low(adc_loop + 0x01) brne adc_done

; adjust the counter value

sbiw ZL,0x01

adc_done:

ret

Wlasnie do przerwania... wiecznej petli. :-)

Pozdrawiam Piotr Wyderski

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required