【问题标题】:PSoC timer interruptPSoC 定时器中断
【发布时间】:2014-03-30 10:58:38
【问题描述】:

在我看来,我的定时器中断不能正常工作。问题是中断函数内的计数器只增加一次。这是我的主要和计时器设置代码。

#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);
}

【问题讨论】:

  • 中断处理程序的特点是它们应该小而快,尤其是不会导致嵌套中断发生。
  • @JoachimPileborg - 是的,'LCD_Position' 听起来不像我会从中断处理程序中调用的东西。
  • 确实,打印到 LCD 可能有点费时。定时器中断多久触发一次?如果定时器中断率大幅降低,代码是否开始工作?
  • 问题已解决!谢谢你们的cmets。

标签: c embedded interrupt psoc


【解决方案1】:

大多数中断服务例程需要重新武装调用它的中断(有时称为“确认中断)。否则,ISR 只会被调用一次。通常,这是在 ISR 的关键部分完成后完成的。

对于 503418,我认为重新启用是通过读取计数器寄存器来完成的。见this底部的代码。

【讨论】:

  • 没错,interrupt 只调用了一次。仅使用标志使其更容易,并且现在可以使用。谢谢。
【解决方案2】:

您可能遇到的一个可能问题是 Timer8INT.asm 中的中断服务程序配置错误。 使用指令 #pragma interrupt_handler 时,您需要确保使用的是 在 Timer8INT.asm ISR 中调用 C 中断服务程序的正确指令。

如果定义了该指令,则reti 指令将添加到该函数的末尾,如果您使用lcall 从 Timer8INT.asm 调用该 C 函数,则该指令不正确。在这种情况下,您实际上需要对该 C 函数执行简单的 ljmp 指令。

当使用指令#pragma interrupt_handlerTimer8INT.asm 时应该有

_Timer8_ISR:

    ljmp _myTimerInt

    reti

如果没有指令#pragma interrupt_handlerTimer8INT.asm 应该有

_Timer8_ISR:

    PRESERVE_CPU_CONTEXT
    lcall _myTimerInt
    RESTORE_CPU_CONTEXT

    reti

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-26
    • 1970-01-01
    相关资源
    最近更新 更多