打印
[AVR单片机]

Mega128令我头痛的问题(关于计数器)!

[复制链接]
3716|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hc0|  楼主 | 2007-4-6 12:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
唉呀,好久一个问题一直困扰着我。 
本来一个产品已经相当成熟了,可是就是两个计数器搞的我精疲力尽了! 

用定时器0来定时,1和2来计数。 

可是计数怎么计也不准确,然而我用外部中断0做计数器也相当精确。 

反复试验,反复查询最后无结果,最后甚至怀疑是不是我的mega128是假的。 

于是调整系统频率,当系统频率降至1Mhz时,一切OK了。 

但是我不明白其中的道理,同时我还有一个问题便是使用1M的频率,那么通讯的误差竟然达到了 
7.6%,这样让我如何使用,请大家无论如何也帮帮忙哦! 

万分感谢!!!!再次感谢!

相关帖子

沙发
coldra| | 2007-4-6 12:21 | 只看该作者

说得太模糊

你怎么设置的计时器?软件怎么写的?信号频率,电平宽度,干扰情况,去噪措施怎么样?通讯波特率要求怎么样?都没交代呢,让人怎么回答呀?

使用特权

评论回复
板凳
zsmbj| | 2007-4-6 12:26 | 只看该作者

M 128没有假的。

是你的时钟没有配置吧,还是内部1MRC的吗

使用特权

评论回复
地板
hc0|  楼主 | 2007-4-6 12:46 | 只看该作者

谢谢回复!

我的设置不会有太大问题的。
  首先我来解释通讯吧,由于我们两个部分控制,一部分用来做键扫描和液晶显示,
  另一部分做实时数据采集,采集速度,温度,等。
  
  软件的写法也非常简单的,用定时器0使用外部晶振32768,实现定时。
计数器1和计数器2定义为计数器,TCCR1B=0x06,0x07,06为下降沿,07为上升沿。
  在定时器中断后,读取tcnt1和TCNT2的计数值,如
    a=TCNT1L; b=TCNT1H;
    c=TCNT2;
    TCNT1H=0; TCNT1L=0;  TCNT2=0;
   就这么简单的几句话,实现起来竟然有问题。
 然后将读回的数据传送出去,PC监视竟然不正确。

 系统时钟只有为1Mhz时,读取才正确。

使用特权

评论回复
5
hc0|  楼主 | 2007-4-6 12:48 | 只看该作者

回三楼!

系统的熔丝设置没有问题的,因为我设置为内部1是好的,248Mhz都不行,请帮忙分析!

使用特权

评论回复
6
liuswallow| | 2007-4-6 20:47 | 只看该作者

我刚刚也是这样用的,没有问题,我用的外部晶振

使用特权

评论回复
7
liuswallow| | 2007-4-6 20:48 | 只看该作者

内部晶振肯定有偏差,具体没测过

使用特权

评论回复
8
hc0|  楼主 | 2007-4-7 08:42 | 只看该作者

谢谢各位的支持和回复!

to liuswallow:
 你好,我最近非常烦恼为此,我实在没有办法搞定了。
 能留个联系方式吗?给我指点一下。或者把你的程序简单的贴一段,万分感谢了。
  有的芯片下载进去,能正常工作,有的则不能。

   我甚至怀疑芯片是不是有问题,主要是我们公司的采购不是从双龙买的,不知道从哪里买的,所以我怀疑芯片的问题,这种问题有可能发生吗?
   
  

使用特权

评论回复
9
hc0|  楼主 | 2007-4-7 08:43 | 只看该作者

请多多支持,实在没有办法了!

to netjob:
  我的定时不会有问题,因为我的定时器不够用,我还用外部中断零来扩展了一个。测量同样的频率,中断没有问题,计数器就有问题!
 请帮忙继续分析一下,万分感谢!

使用特权

评论回复
10
hc0|  楼主 | 2007-4-8 12:23 | 只看该作者

试过了,没用.

如果说是测量信号的问题,我把同样的信号加到外部中断零上就可以.

为什么加在计数器上就不行呢/

我快郁闷死了!

使用特权

评论回复
11
hc0|  楼主 | 2007-4-10 16:20 | 只看该作者

把测试代码来,大家帮忙看看,我实在没有办法了!

#include <iom128v.h> 
#include <macros.h> 

unsigned int pulse; 
//UART1 initialize 
// desired baud rate:9600 
// actual baud rate:9615 (0.2%) 
// char size: 8 bit 
// parity: Disabled 
void uart1_init(void) 

 UCSR1B = 0x00; //disable while setting baud rate 
 UCSR1A = 0x02; 
 UCSR1C = 0x06; 
 UBRR1L = 0x0c; //set baud rate lo 
 UBRR1H = 0x00; //set baud rate hi 
 UCSR1B = 0x18; 


void tranmsit(unsigned char data) 

 while(!(UCSR1A&(1<<UDRE1)));   
 UDR1=data; 

//TIMER0 initialize - prescale:1024 
// WGM: Normal 
// desired value: 1Sec 
// actual value:  1.000Sec (0.0%) 
void timer0_init(void) 

 TCCR0 = 0x00; //stop 
 ASSR  = 0x08; //set async mode 
 TCNT0 = 0xc0; //set count 
 OCR0  = 0x20; 
 TCCR0 = 0x07; //start timer 

#pragma interrupt_handler int0_isr:2 
void int0_isr(void) 

 pulse=pulse+1;//external interupt on INT0 


#pragma interrupt_handler timer0_ovf_isr:17 
void timer0_ovf_isr(void) 

 unsigned char a,b,c; 
 unsigned int data; 
 TCNT0 = 0xc0; //reload counter value 
 data=TCNT1; 
 a=data>>8; b=data; c=TCNT2;  
 tranmsit(0xf2);  tranmsit(0x04); 
 tranmsit(a); tranmsit(b);    
 a=pulse>>8; b=pulse;  
 tranmsit(a); tranmsit(b);  
 tranmsit(c);    tranmsit(0xf2);  
 TCNT1=0;  pulse=0;  TCNT2=0;  


//TIMER3 initialize - prescale:8 
// WGM: 14) PWM fast, TOP=ICRn 
// desired value: 500Hz 
// actual value: 500.000Hz (0.0%) 
void timer3_init(void) 

 TCCR3B = 0x00; //stop 
 TCNT3 = 0x00; 
 OCR3A = 0x7c; 
 OCR3B = 0x7c; 
 OCR3C = 0x7c; 
 ICR3  = 0xF9; 
 TCCR3A = 0xF2; 
 TCCR3B = 0x1A; //start Timer 


void main(void) 

 unsigned int i; 
 CLI(); 
 TCCR1B=0x07; TCCR2=0x07; 
 EICRA = 0x02; //extended ext ints 
 EIMSK = 0x01; DDRE=0x3a; 
 timer0_init(); uart1_init(); timer3_init(); 
 TIMSK = 0x01; //timer interrupt sources 
 SEI(); 
 for(;;);  
}
代码贴上来,大家帮忙测试测试,谢谢!

使用特权

评论回复
12
AA_55| | 2007-4-10 23:48 | 只看该作者

很显然,你的信号边沿有狭窄的毛刺

当你降低主频以后,MPU跑的没有以前那么快了,计数器对很窄的毛刺就不会响应了。你采用了定时中断计数也不会产生错误,是因为中断响应远没有计数器快,所以也忽略了毛刺。解决的方法就如同楼上DX说的,要滤除毛刺杂波。

类似问题我以前就说过,可以去看看。要充分理解AVR这类高速的MPU的不同特性,而不能用以往的类似51这样的低速MPU使用经验来推论。

使用特权

评论回复
13
hc0|  楼主 | 2007-4-11 09:43 | 只看该作者

谢谢回复!

楼上的解释我也曾想过,然后我就试着用自己测自己。
方法:用PWM生成1:1占空比,然后输入到测频率端,可是高频率情况下仍然不精确。
而且即使在1Mhz下,仍然是只有部分正常,部分芯片还是不正常。

使用特权

评论回复
14
wxc5678| | 2015-7-14 23:40 | 只看该作者
问题解决了吗?谢谢

使用特权

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

本版积分规则

hc0

8

主题

113

帖子

0

粉丝