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