Opuszczanie handlera w AVR

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

Reply to
Piotr Wyderski
Loading thread data ...

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

Reply to
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.

Reply to
T.M.F.

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

Reply to
Piotr Wyderski

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

To po co przerwanie ? :-)

J.

Reply to
J.F.

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

Reply to
Piotr Wyderski

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.