这是一个关于在PIC上使用timer0的通用问题。
我正在尝试使用 PIC18f87k22 和 arduino pro 饰品构建直流电机控制系统。
在我的程序中,我有一个名为get_courant()
的函数。 此函数将请求发送到 trinket 并读取收到的答案(通过 uart(,并将该值存储在我的一个全局变量中,从而实现它。
我想做的是按如下方式使用计时器:
如果get_courant()
需要超过 10us 才能继续,请跳过它,直接转到我的 main 中的其余说明。
我知道我应该在调用函数之前启动一个计时器,并以某种方式读取计时器值以决定是否跳过它。
但是,如果我在调用函数后检查计时器值,那么如果 'get_courant(( 的执行超过 10us,我的时间可能会被浪费,在这种情况下计时器是无用的。
有什么技巧可以帮助我实现我想要实现的目标(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);
根据 PIC18f87k22 数据表第 193 页在 T0CON 寄存器的第 7 位 TMR0ON 正在激活计时器以计数或停止它。 关于这一点,您可以在要测量停留时间的函数中设置 TMR0ON 并检查 10uS,您必须在离开该功能后重置它(在 10uS 或 10uS 之后(您还应该确保在清除 TMR0ON 后或设置 TMR0ON 之前 u 必须清理计时器持有的旧值,以免影响以前的测量