gpt4 book ai didi

c - 为 ATMEGA128 uc 实现接收中断超时

转载 作者:行者123 更新时间:2023-11-30 18:12:31 25 4
gpt4 key购买 nike

我在我的项目中使用 ATMEGA128 微 Controller 和 AVR studio。我正在使用接收中断 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);*/


}

最佳答案

我将使用这样的函数来实现从 UART 接收 8 个字节,超时时间为 n 毫秒。

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,因为递减单个整数可能不足以获得 10 毫秒的延迟。
现在您只需将 t 调整为一个值,使循环在大约 10 毫秒内完成(这主要取决于您的时钟)。您可能可以利用宏 F_CPU 开发一些公式,即 t2 = F_CPU/1000; 或类似的公式。

关于c - 为 ATMEGA128 uc 实现接收中断超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34719776/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com