在ATMEGA128 uc的接收中断中实现超时

时间:2016-01-11 10:58:24

标签: c embedded

我正在为我的项目使用ATMEGA128微控制器和AVR工作室。我使用接收中断ISR_USART0接收8字节数据作为数据包,并在完成接收数据后调用该中断,数据用于激励某些执行器。这是中断例程。 现在我想在这个例程中添加10毫秒的超时,这样一旦接收到第一个字节,它就会开始计算超时并持续10毫秒,然后软件跳过等待字节并返回主循环。 作为一个新手,我发现在中断例程中实现这种超时的中断数据非常少......任何人都可以建议实现它的最佳方法。?

ISR(USART0_RX_vect)
{   
    uint8_t u8temp;
    u8temp=UDR0;
    data_count++;    
    //UDR0=u8temp;
    //check if period char or end of buffer
    if    (BufferWrite(&buf, u8temp)==1){
           Buffer_OverFlow_ERROR=1; TRANSMISSION_ERROR [6]=Buffer_OverFlow_ERROR;
           MT_ERROR_FLAGS_INIT();BufferInit(&buf);data_count=0;REC_ERROR_FLAG=0;}  

    if (u8temp==0x58){
         BufferSort(&buf);BufferInit(&buf);
         REC_ERROR_FLAG=0;data_count=0;//PORTA|=(1<<PORTA3);
        }

        /*else if{
        REC_ERROR_FLAG=0;BufferInit(&buf);*/


}

1 个答案:

答案 0 :(得分:-1)

我会使用这样的函数从UART实现8字节的接收,超时为 n ms。

char buf[8], c = 0;
unsigned int t = 65535, th = 65535;

do {
    if (UCSRA & (1 << RXC))
        buf[c++] = UDR;
    if (!th--) t--;
} while ((c < 8) && t);

我在这里使用两个变量tth,因为减少一个整数可能不足以获得10ms的延迟。
现在你只需要将t调整为一个值,使循环在大约10ms内完成(这主要取决于你的时钟)。您可以使用宏F_CPU开发一些公式,即t2 = F_CPU/1000;或类似的。