本帖最后由 xia_kang 于 2014-4-22 14:58 编辑
刚学AVR单片机,写了个定时器中断触发AD采集信号的程序,然后用串口发送到上位机软件,但是发送的数据总会出现丢包的现象。主要代码如下:
int main(void)
{
cli();
USART_Init();
AD_Init();
// 计时/定时器中断初始化
TCCR1B=0x02;// 8分频
TCNT1H=0xF8;
TCNT1L=0xAC;
TIMSK|=0x04;
sei(); //使能全局中断
while(1)
{
if(flag)
{
//flag=0;
USART_Send(data);//data为全局变量,也就是AD采集到的数据
}
flag=0;
}
}
下面是中断函数:
//中断函数,AD数据采集,每隔1/1200 s采集一次数据
ISR(SIG_OVERFLOW1)
{
flag=1;
TCNT1H=0xF8;
TCNT1L=0xAC;
ADCSRA|=(1<<ADIF); //清除ADC转换结束位
ADCSRA|=(1<<ADSC); //AD转换开始
while(!(ADCSRA&((1<<ADIF))));
//ADCSRA|=(1<<ADIF);
data=ADCH; //读取ADC数据寄存器高八位
}
串口发送函数:
void USART_Send(uchar Data)
{
while(!(UCSRA&(1<<UDRE))); //数据寄存器UDR是否为空
UDR=Data; //UDR赋值
while(!(UCSRA&(1<<TXC))); //数据是否已经发送完毕
UCSRA|=(1<<TXC); //清除发送完毕标志位
}
希望得到大家的指导,感激不尽。
|