[AVR单片机] 求助:有关ATmega16的定时器设置问题

[复制链接]
2135|5
 楼主| xia_kang 发表于 2014-4-22 14:56 | 显示全部楼层 |阅读模式
本帖最后由 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);     //清除发送完毕标志位
}

希望得到大家的指导,感激不尽。


cyanitefire 发表于 2014-4-22 16:09 | 显示全部楼层
ADC转换的频率是1200,即使是8位采集,对应的数据量至少是1200*(8+2)BIT,即波特率至少为12K,才能不丢包。你设定的波特率是多少?
 楼主| xia_kang 发表于 2014-4-22 16:33 | 显示全部楼层
cyanitefire 发表于 2014-4-22 16:09
ADC转换的频率是1200,即使是8位采集,对应的数据量至少是1200*(8+2)BIT,即波特率至少为12K,才能不丢包 ...

波特率设定的是9600,换更高的波特率还是会丢的。实际上我设定了一个全局变量,让此变量在中断函数里面执行自增操作,然后在主函数里用串口发送,结果还是丢了大概有一半的数据,实在搞不懂为什么。
cyanitefire 发表于 2014-4-22 16:40 | 显示全部楼层
建议降低ADC转换频率,减少数据量,进行测试,看看在低频率下是否还是丢包;还有,建议不要在中断程序中进行AD转换和数据发送,中断程序占用时间长了对主程序是有影响的。
 楼主| xia_kang 发表于 2014-4-22 16:45 | 显示全部楼层
cyanitefire 发表于 2014-4-22 16:40
建议降低ADC转换频率,减少数据量,进行测试,看看在低频率下是否还是丢包;还有,建议不要在中断程序中进 ...

现在的问题是即使中断函数里面什么也不做,只是对一个全局变量执行加1操作,然后在主函数里发送此变量,还是会丢数据,这该怎么解释呢?
zhenjiang7412 发表于 2014-4-22 17:01 | 显示全部楼层
DATA要定义成数组,用发送指针和采样指针来处理才能保证不丢数据,除非发送要远远快于采样
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

17

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部