TOP

FAQ 常見問答

    • .可以在Interrupt Service Routine內執行Call嗎?

      因爲sonix MCU Stack數目有限,在Interrupt中執行Call要特別注意,如果在進入Interrupt時Stack已經滿了,則會造成Stack溢出,而使 得程式無法返回。所以若要在Interrupt內執行Call,必需考慮在最差情况下Stack的使用數目,務必使在最差狀况下進入Interrupt仍 有Stack空間。
    • .程式不進入中斷,需要檢查哪些方面?

      用戶需要從以下幾個方面檢查:
      1. 檢查全局中斷FGIE是否使能;
      2. 相應中斷的中斷使能是否開啓;
      3. 確定程式是否可以産生中斷,如計時器初始化中的設置是否可以溢出;要産生外部中斷,P0、P1相 應的I/O口必須設置爲輸入模式,且有電平變化等。
    • .SONIX單片機有沒有中斷優先順序?如何設置?

      SONIX MCU系統,硬體沒有設計中斷的優先順序。但實際應用的過程中,可能需要應用中斷優先順序,可以根據SONIX MCU的特點用軟體來實現。
      對各中斷進行優先權的設置,幷根據IEN和IRQ的狀態决定系統是否回應中斷請求。用戶必須在中斷向量裏檢查中斷控制位元和中斷請求標志位元,因此可將具有高優先順序的中斷控制位元和中斷請求標志位元放在前面檢測。

      舉例說明:

      ISR:
      ;------------Save ACC--------------------------
      b0xch A,AccBuf ;B0xch instruction do not change C,Z flag
      b0mov A,PFLAG
      B0MOV PflagBuf,A
      ;---------interrupt first-------------------------
      INT0CHK:
      B0BTS1 FT0IEN
      JMP INTTC0CHK
      B0BTS0 FT0IRQ
      JMP INTT0

      INTTC0CHK: ; Check TC0 interrupt request
      B0BTS1 FTC0IEN ; Check TC0IEN
      JMP ISR90 ; Jump to exit of IRQ
      B0BTS0 FTC0IRQ ; Check TC0IRQ
      JMP INTTC0 ; Jump to TC0 interrupt service routine
      ;-------------exit interrupt-------------------------
      ISR90:
      B0MOV A, PflagBuf
      B0MOV PFLAG,A ;Restore the PFlag
      B0XCH A,AccBuf ;Restore the Reg. A
      ;B0xch instruction do not change C,Z flag
      RETI ;Exit the interrupt routine
      ;---------------------t0-----------------------------
      INTT0:
      B0BCLR FT0IRQ
      INTT090:
      JMP ISR90
      ;---------------------tc0-----------------------------
      INTTC0:
      B0BCLR FTC0IRQ
      INTTC090:
      JMP ISR90
    • .P00設置完全正確,爲何無法進入中斷?

      首先查看P00中斷的設置是否正確,比如P00IEN是否置1,PEDGE寄存器設置是否正確(控制觸發邊緣類型)。如果以上設定都沒有問題,接著檢查程序中是否在使用TC0或TC1計數或者産生中斷,如果是,請確認TC0或TC1的計數時鐘源選擇爲Fcpu,而不能將TC0或TC1的計數時鐘源選擇爲外部P00口,否則當P00口有觸發電平時,TC0或TC1的計數值會加1,但P00IRQ不會置1,從而導致P00無法進入中斷。
    • .爲什麽芯片無法進入中斷?

      首先查看P00中斷的設置是否正確,比如P00IEN是否置1,PEDGE寄存器設置是否正確(控制觸發邊緣類型)。如果以上設定都沒有問題,接著檢查程 序中是否在使用TC0或TC1計數或者産生中斷,如果是,請確認TC0或TC1的計數時鐘源選擇爲Fcpu,而不能將TC0或TC1的計數時鐘源選擇爲外 部P00口,否則當P00口有觸發電平時,TC0或TC1的計數值會加1,但P00IRQ不會置1,從而導致P00無法進入中斷。
    • .爲什麽程序中清FP00IEN後,本來應該禁止外部中斷INT0,但在程序運行時發現也可進入?

      SONIX 的8位MCU中斷機制是一旦在P0.0口接受到中斷條件,總會設置相應的中斷標志位FP00IRQ,但能不能進入中斷還要看FP00IEN是否允許(這樣 做是爲了客戶采用查詢方式的需要)。但是一旦中斷標志位FP00IRQ被外部中斷條件設定後,又有其他中斷産生,此時若中斷程序處理不當,則可能造成錯誤 進入INT0中斷。解决辦法:
      1.若中斷程序中不需要INT0中斷,則中斷程序中不要查FP00IRQ標志。
      2.若中斷程序中需要INT0中斷,應該配合FP00IEN一起使用,如下:
      B0BTS1 FP00IEN ;P00中斷是否打開
      JMP EXIT ;沒有P00中斷,退出
      B0BTS1 P00IRQ ;進一步查詢中斷請求標志
      JMP NEXT
      :
      NEXT: ;P00中斷服務程序
      :
      EXIT: ;退出中斷服務程序
      RETI