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