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



这是一个关于在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 必须清理计时器持有的旧值,以免影响以前的测量

相关内容

  • 没有找到相关文章

最新更新