簡體   English   中英

PSoC定時器中斷

[英]PSoC timer interrupt

在我看來,我的計時器中斷無法正常工作。 問題是中斷功能內部的計數器僅增加一次。 這是我的主要和計時器設置的代碼。

#include <m8c.h>
#include "PSoCAPI.h"
#include <stdio.h>
#include <stdlib.h>

char theStr[] = "PSoC LCD";
static char tmp[3];
static int counter = 0;

void main(void){

    LCD_Start();
    LCD_Position(0,5);
    LCD_PrString(theStr);
    M8C_EnableGInt;
    Timer8_EnableInt();
    Timer8_Start();
    while (1);
}

#pragma interrupt_handler myTimerInt
void myTimerInt(void){
    counter ++;
    LCD_Position(1,0);
    itoa(tmp, counter, 10);
    LCD_PrString(tmp);
}

大多數中斷服務程序都需要重新准備調用該中斷的中斷(有時稱為“確認中斷”)。否則,ISR僅被調用一次。通常,這是在ISR的關鍵部分完成之后完成的。

對於503418,我認為重新啟用是通過讀取計數器寄存器來完成的。 看到代碼在底部

您可能遇到的一個問題是Timer8INT.asm中的中斷服務例程配置錯誤。 使用指令#pragma interrupt_handler ,需要確保使用正確的指令來調用Timer8INT.asm ISR中的C中斷服務程序。

如果定義了該指令,則將在該函數的末尾添加一個reti指令,如果您使用lcall從Timer8INT.asm調用該C函數,則該指令不正確。 在這種情況下,您實際上需要對該C函數使用簡單的ljmp指令。

使用指令#pragma interrupt_handler Timer8INT.asm應該具有

_Timer8_ISR:

    ljmp _myTimerInt

    reti

沒有指令#pragma interrupt_handler Timer8INT.asm應該具有

_Timer8_ISR:

    PRESERVE_CPU_CONTEXT
    lcall _myTimerInt
    RESTORE_CPU_CONTEXT

    reti

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM