搜索
bottom↓
回复: 6

问个《AVR单片机嵌入式系统原理与应用实践》一书中的一个频率计的问题

[复制链接]

出0入0汤圆

发表于 2009-8-1 11:15:40 | 显示全部楼层 |阅读模式
第十一章中的。频率测量和简单频率计的设计。频率不是固定的吗。我做出来是一直向上加的。成了计数器。分析程序,应该是TCNT0没有清0的问题吗?
书中的例子是GCAVR,我用的是ICCAVR。我改过如下。不知道在哪里清TCNT0.高手给分析一下。
#include <iom16v.h>
#include <macros.h>
#define uchar unsigned char
#define uint unsigned int
#pragma interrupt_handler t2ok:4
#pragma data:code
const uchar table[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
const uchar tab[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
#pragma data:data
char buffer[8];
char posit;
uchar timeok,disok;
char timeold,timenew,freqtime;
uint freq;
void display(void)      // 8 位 LED 数码管动态扫描
{
   PORTC = 0xff;
   PORTA = table[buffer[posit]];
   if (posit==5) PORTA = PORTA | 0x80;  
   PORTC = tab[posit];  
   if (++posit >=8 ) posit = 0;
}
void t2ok()
{
         timenew=TCNT0;
         timeok=1;
         disok=~disok;
         if(disok) display();
}
void freq_to_buffer()
{

char i,j=7;

for(i=0;i<=4;i++)
{
  buffer[j-i]=freq%10;
  freq=freq/10;
}
buffer[2]=freq;
}
void init()
{
DDRA=0XFF;//out
DDRC=0XFF;//out
//T0初始化
TCCR0=0X06;//外部T0下降沿触发,普通模式
TCNT0=0X00;
OCR0=0X00;
//T2初始化
TCCR2=0X0B;
TCNT2=0X00;
OCR2=0X7C;//7C=124,124+1/125=1ms

TIMSK=0X80;//允许T2比较匹配中断
}
void main()
{
char i;
init();
for(i=0;i<8;i++)
buffer=0x00;
timeold=0;
SREG|=0X80;

while(1)
{
  if(timeok)
  {
                            if(timenew>=timeold) freq=freq+(timenew-timeold);
                else freq=freq+(256-timenew-timeold);
                timenew=timeold;
               
                if(++freqtime>=100)
                {
       
                 
                 freqtime==0;//100ms到
                 freq_to_buffer();
                 freq=0;
                 
                }
               
                timeok=0;
               
  }
};
}

学AVR 断断续续的一年了。但一直没有好的教材。知道AVR是从郭天详的十天学会avr的视频教程。不得不说,入门的都爱看视频教程。到后来,做点实际的东西时,发现视频教程上的内容太太少了。特别是avr中的定时器的内容。由于视频教程的先入为主,便学M16.工具用ICCAVR。
图书馆的avr书原来只有3本。是90s的。老师提供M8和M16.

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

 楼主| 发表于 2009-8-1 11:17:06 | 显示全部楼层
自己顶个先

出0入0汤圆

发表于 2009-11-3 16:09:46 | 显示全部楼层
主程序里 while(1)
{
  if(timeok)
  {
      if(timenew>=timeold) freq=freq+(timenew-timeold);
else freq=freq+(256-timenew-timeold);
timenew=timeold; //这里有问题

if(++freqtime>=100)
{

  
freqtime==0;//100ms到
freq_to_buffer();
freq=0;
  
}

timeok=0;

  }
};


timenew=timeold;有问题,应该是timeold=timenew;

频率变化应该是正常的,可以通过求平均值解决。

出0入0汤圆

发表于 2010-4-17 13:33:06 | 显示全部楼层
我还想问个问题,当我把if(++freqtime>=100)  的100改成1000的时候,为什么会导致频率计的示数会错误呢?比如我本来显示的是50,也就是真正的频率为500,但当我改成1000时,就变成116

出0入0汤圆

发表于 2010-4-17 16:33:43 | 显示全部楼层
单纯的拷贝代码是学不到东西的。本例子在书中后面有明确的解释,希望能真正理解实现的方法。

没有那个代码是万能的,这个代码的测试精度和最高频率已经给出了(小于255K),如果你真正懂和理解了,应该能够根据实际的需要做相应的修改。

1。LZ位的问题没有说明白,他测试的频率是多少?本代码中不需要对T0做清另的。另外程序中的代码移植有问题(2楼已经给出),原代码是time0_old=time0_new,而lz却写成timenew=timeold。此外上一句中的运算符号也不对(这样原文的移植都错了,还问正确性?!)

2。2楼找出了LZ移植代码中的一个问题,但解释是不正确的,这段关键的代码(已经对LZ移植代码中的错误做了修改,原书中是没有错误的!)
if(timenew>=timeold)
  freq = freq + (timenew - timeold);
else
  freq=freq+(256 - timenew + timeold);    //《===移植代码错误1,后面应该是+!
timeold = timenew;                        // <===移植代码错误2,两个变量反了!

    不是为了求平均,它是累加了100ms中T0的中断的总次数!!!这个次数乘上10就是频率了,代码中没有做乘10的计算,只是在显示时,把小数点向右移了一位,这就相当乘10了。

3。3楼的朋友也根本没有读懂代码,不知道是如何测量和计算的。你把100改成1000,那么假定T0在1ms中中断的次数为100,那么1000ms就是100000。这个数据已经大于65536了,而变量freg定义的为INT型,能正确记录保存100000这个数吗?

===============================================================
楼上的3位,谢谢你们能参考我编写的教材。但我还是要拜托你们,以及那些想真正学习和掌握这个专业知识和技术本领的各位,不要采用应试教育的学习方法参考我的书,不要盲目的拷贝或修改例程代码。没有任何的代码是万能的,最重要的是方法和思路。

出0入0汤圆

发表于 2010-4-17 23:13:35 | 显示全部楼层
啊?不是1ms中断一次吗?

出0入0汤圆

发表于 2010-4-19 01:12:25 | 显示全部楼层
楼上的,再次拜托,请仔细看书,里面说的够明白了。里面没有用到高等数学,都是加减乘除的算法。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 04:19

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表