2017-05-28 58 views
0

我現在的問題是,自從我啓用中斷後,程序停滯在無限循環中。如果我禁用中斷,那麼程序正常執行。在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 

回答

0

你確定中斷服務程序實際上清除中斷?如果沒有,核心將不斷嘗試爲他們服務,因此明顯的鎖定。

檢查出datasheet頁碼。 17:

定時器2中斷由寄存器T2CON中的位TF2和EXF2的邏輯或產生。 Nei- 當服務例程被引導時,這些標誌位被硬件清零。事實上, 服務程序可能必須確定是否是產生中斷的TF2或EXF2,該位必須用軟件清零。

因此,如果標誌未被重置,您的中斷將繼續觸發。

爲什麼你在程序集中編寫代碼?當然,對於這個功能,你可以使用普通的C代替。

+0

彙編是我所擁有的,它提供了更多的控制。我已經考慮過你顯示的片段,而R0表示地址0的內容,因爲當R0達到零時DJNZ不會繼續,因此我將循環中地址1到7Fh的值賦予0,並且在退出時,地址零爲0。我讀過中斷執行時自動清除定時器中斷標誌,除非8052.com上的文獻不正確? – Mike

+0

我也嘗試將我的中斷處理程序例程轉換爲只有RETI命令,這就是它和程序仍然產生擰緊結果。不知何故,我認爲atmel沒有提供它需要提供的信息。 – Mike

+0

當跳入isr時,確定中斷被暫時禁用。但是,如果您不清除中斷的原因,將會重新發布。我更新了我的答案,以包含數據表中的一段引文。 – FRob