我現在的問題是,自從我啓用中斷後,程序停滯在無限循環中。如果我禁用中斷,那麼程序正常執行。在8052上啓用中斷導致鎖定
我甚至確保我通過將函數推入堆棧並在函數退出時彈出它們來保護函數中的寄存器(變量),但這並沒有幫助。
我甚至採取了甚至用iret替換函數名(以退出中斷),我仍然面臨同樣的問題。
我現在解決問題的唯一方法是通過不執行mov TCON,#50h
來禁用中斷。這讓我認爲在互聯網上發佈的中斷向量地址是不正確的,而實際上,正在執行的代碼正在被執行。
我使用的微控制器是AT89S52。
我用我的矢量在這裏解決?我需要一些建議,因爲當啓用定時器中斷時,我目前使用的代碼目前不工作。
org 000h
;entry point when program first runs
ljmp sysinit ;seems to execute
sjmp $
org 00Bh
;Timer 0 interrupt executes every 65536 machine cycles even if timer 1 interrupt executes
ljmp crit
sjmp $
org 01Bh
;Timer 1 interrupt executes every 256 machine cycles
ljmp processkey
sjmp $
org 030h
start:
;rest of program goes here.
sysinit:
mov TL0,#0h
mov TH0,#0h
mov TH1,#0h
mov TL1,#0h
mov PSW,#0h
mov R0,#7Fh
;make all ram addresses 0h to 7Fh contain value 0
sysreset:
CLR A
mov @R0,A
djnz R0,sysreset
mov T2CON,#0h ;8052 register
mov AUXR,#0h ;8052 register
mov AUXR1,#0h ;8052 register
mov PCON,#80h ;Make baud divisor=192
mov TMOD,#21h ;Timer1=0-255,Timer2=0-65535
mov IP,#02h ;priority to timer 0
mov TCON,#50h ;timers on
mov SP,#050h ;stack=50h
mov IE,#8Ah ;ints enabled
ljmp start
彙編是我所擁有的,它提供了更多的控制。我已經考慮過你顯示的片段,而R0表示地址0的內容,因爲當R0達到零時DJNZ不會繼續,因此我將循環中地址1到7Fh的值賦予0,並且在退出時,地址零爲0。我讀過中斷執行時自動清除定時器中斷標誌,除非8052.com上的文獻不正確? – Mike
我也嘗試將我的中斷處理程序例程轉換爲只有RETI命令,這就是它和程序仍然產生擰緊結果。不知何故,我認爲atmel沒有提供它需要提供的信息。 – Mike
當跳入isr時,確定中斷被暫時禁用。但是,如果您不清除中斷的原因,將會重新發布。我更新了我的答案,以包含數據表中的一段引文。 – FRob