如何使用PIC18f87k22定时器作为中断

时间:2018-07-04 08:36:52

标签: c timer embedded pic xc8

这是关于在PIC上使用timer0的方式的通用问题。

我正在尝试使用PIC18f87k22和arduino pro饰品构建直流电动机控制系统。

在我的程序中,我有一个名为get_courant()的函数。 此函数将请求发送到饰品,并读取(由uart收到的)答案,并将该值存储在我的全局变量之一中,从而将其实现。

我想做的是使用计时器,如下所示:

如果get_courant()花费的时间超过10us,请跳过该步,直接进入我的主程序中的其余说明。

我知道我应该在调用该函数之前启动一个计时器,并以某种方式读取计时器值来决定是否跳过它。

但是,如果我在调用函数后检查定时器值 ,那么如果`get_courant()的执行超过10us,则我的时间可能会缩短,在这种情况下,定时器将无用。< / p>

有什么秘诀可以帮助我实现我想要实现的目标(如果我的英语水平很差的话就可以识别IDK)? 如果可以帮上忙,下面是get_courant()的代码:

int16_t get_courant()
{
 uint8_t courant1;
 uint8_t courant2;
 int16_t courant;

 if(EUSART1_is_tx_ready())
        {
            EUSART1_Write(0b00000001);
        }
 if(EUSART1_is_rx_ready())
        {
        courant1= EUSART1_Read(); 
        }

 if(EUSART1_is_tx_ready())
        {
            EUSART1_Write(0b00000010);
        }
 if(EUSART1_is_rx_ready())
        {
        courant2= EUSART1_Read(); 
        }
 if (CheckBit(courant1,7))
 {
    bit_clr(courant1,7);
    courant = (courant1 << 8) | courant2;
    courant = - courant;
 }
 else 
 {
    courant = (courant1 << 8) | courant2;
 }

 return courant;   
 }

这是我调用get_courant()的主要功能的一部分:

while(!Stop_flag)
{   
    int i=0;
    do
    {


        Mesure_courant=get_courant();
        Tension_initiale = PID_Courant(Mesure_courant,Erreur_courant,Consigne_courant,Integrale_courant,Kp_courant,Ki_courant,Kd_courant,Wind_up_flag_courant);
        i++;
        Put_Rapport_Cyclique(Tension_initiale, Choix_Mode);

    } while(i<10);

1 个答案:

答案 0 :(得分:1)

根据PIC18f87k22数据表第193页的T0CON寄存器的第7位,TMR0ON正在激活定时器以对其进行计数或停止。 请注意,您可以在要测量停留时间的功能中将TMR0ON设置为10uS,然后在退出功能后(无论是在10uS还是在10uS之后)都必须将其复位,在清除TMR0ON之后也应确保或在设置TMR0ON之前,您必须清除计时器保持的旧值,以免受到先前测量的影响