PIC18F上的定时器0中断

PIC18F上的定时器0中断,c,microcontroller,pic,pic18,xc8,C,Microcontroller,Pic,Pic18,Xc8,我正在尝试制作一个程序,该程序使用定时器0的中断。问题是我必须添加一个带有2个变量的函数。 计时器配置将通过定义一个具有以下原型的函数来执行:void int_tmr0(int conf_int,int conf_T0),我就是这样做的: void conf(int p1, int p2) { T0CON=p1; INTCON=p2; } 我试着把记录T0CON,INTCON放在这两个变量中:p1和p2。 我不确定是否可以通过以下方式调用主函数中

我正在尝试制作一个程序,该程序使用定时器0的中断。问题是我必须添加一个带有2个变量的函数。 计时器配置将通过定义一个具有以下原型的函数来执行:void int_tmr0(int conf_int,int conf_T0),我就是这样做的:

void conf(int p1, int p2)
    {
        T0CON=p1;
        INTCON=p2;
    }
我试着把记录T0CON,INTCON放在这两个变量中:p1和p2。 我不确定是否可以通过以下方式调用主函数中的这两个变量:

    void main()
    {
        WDTCONbits.ADSHR = 1;
        MEMCONbits.EBDIS = 1;
        TRISD = 0x0;
        INTCONbits.GIE = 1;
        p1=0b10001000;
        INTCONbits.TMR0IE = 0;
    }
以下是全部代码:

#include <xc.h>

unsigned char counter;

void interrupt f1()
{
    if(INTCONbits.TMR0IE && INTCONbits.TMR0IF)
    {
        counter++;
        INTCONbits.TMROIF=0     
    }

void conf(int p1, int p2)
    {
        T0CON=p1;
        INTCON=p2;
    }

    void main()
    {
        WDTCONbits.ADSHR = 1;
        MEMCONbits.EBDIS = 1;
        TRISD = 0x0;
        INTCONbits.GIE = 1;
        p1=0b10001000;
        INTCONbits.TMR0IE = 0;
    }
    while(1){
        LATD= counter;
    }
}
#包括
无符号字符计数器;
无效中断f1()
{
if(INTCONbits.TMR0IE&&INTCONbits.TMR0IF)
{
计数器++;
INTCONbits.TMROIF=0
}
无效形态(整数p1,整数p2)
{
T0CON=p1;
INTCON=p2;
}
void main()
{
WDTCONbits.ADSHR=1;
MEMCONbits.EBDIS=1;
TRISD=0x0;
INTCONbits.GIE=1;
p1=0b10001000;
INTCONbits.TMR0IE=0;
}
而(1){
LATD=计数器;
}
}

如果我理解正确

  • 您需要一个由定时器0中断调用的函数
  • 您的SDK将此函数定义为
    void int\u tmr0(int-conf\u-int,int-conf\u-T0)
  • 您需要函数来接收其他任意参数
解决方案是根据SDK的需要创建函数,并将参数存储在全局变量中。然后,可以使用以下变量作为参数从“回调”函数内部调用函数:

int volatile param_1 = 0, param_2 = 0;

void int_tmr0(int conf_int, int conf_T0)
{
  conf(param_1, param_2);
}

void conf(int p1, int p2)
{
  T0CON=p1;
  INTCON=p2;
}

int main()
{
  WDTCONbits.ADSHR = 1;
  MEMCONbits.EBDIS = 1;
  TRISD = 0x0;
  INTCONbits.GIE = 1;
  param_1=0b10001000;
  INTCONbits.TMR0IE = 0;

  while(1){
      LATD= counter;
  }
}

你想干什么?我没有得到它,并且您的代码中从未调用过'conf'函数。计时器中断0。计时器配置将通过定义如下函数来执行:void int_tmr0(int conf_int,int conf_T0)。该函数将使用与计时器0对应的寄存器。如果我想在这两个寄存器T0CON和INTCON之间切换,我使用了void conf(int p1,int p2),而不是void int_tmr0(int conf_int,int conf_T0)。我可以这样修改void conf吗:``void conf(intp1,intp2){T0CON=p1;INTCON=p2;if(!p1){T0CONbits.TMR0ON=1}else{INTCONbits.TMR0ON=0}else if(!p2){T0CONbits.TMR0ON=0}`?