打印
[AVR单片机]

求助:有关ATmega16的定时器设置问题

[复制链接]
1671|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转换和数据发送,中断程序占用时间长了对主程序是有影响的。

使用特权

评论回复
5
xia_kang|  楼主 | 2014-4-22 16:45 | 只看该作者
cyanitefire 发表于 2014-4-22 16:40
建议降低ADC转换频率,减少数据量,进行测试,看看在低频率下是否还是丢包;还有,建议不要在中断程序中进 ...

现在的问题是即使中断函数里面什么也不做,只是对一个全局变量执行加1操作,然后在主函数里发送此变量,还是会丢数据,这该怎么解释呢?

使用特权

评论回复
6
zhenjiang7412| | 2014-4-22 17:01 | 只看该作者
DATA要定义成数组,用发送指针和采样指针来处理才能保证不丢数据,除非发送要远远快于采样

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

17

帖子

0

粉丝