|
第十一章中的。频率测量和简单频率计的设计。频率不是固定的吗。我做出来是一直向上加的。成了计数器。分析程序,应该是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, 杜汶泽)
|