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
Didn't find your answer? Ask the community — no account required.
M
Marcin Stanisz
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
T
T.M.F.
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.
P
Piotr Wyderski
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
J
J.F.
Nie bardzo rozumiem co chcesz osiagnac .. ale z przerwaniami uwazaj.
To po co przerwanie ? :-)
J.
P
Piotr Wyderski
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
Report Content
You are reporting this content to the moderators. They will look at it
ASAP.