AVR我从一无所知学到现在也懂了些皮毛 我想用M16制作一个频率计,我的设计思路是这样的:在精确定时的一秒中内对输入的脉冲方波进行计数;在这一秒钟内对计数器的溢出次数进行累计,那么,输入脉冲的频率=溢出次数X计数器最高计数+最后一次计数器内的计数值!------------可是怎样才能制作一个能同时开启计数器ATTR0和定时器ATTRB的闸门,闸门的触发由输入方波的某一上升沿触发???
我编了一个简单的程序 可是可是经Proteus仿真总是相差几微妙不能同步开启 还有 没有能用输入上升沿触发定时和计数。
//ICC-AVR application builder : 2011-6-4 22:14:10
源代码如下:
// Target : M16
// Crystal: 8.0000Mhz
#include <iom16v.h>
#include <macros.h>
#define uchar unsigned char
#define uint unsigned int
uint num=0,n=0;
#pragma interrupt_handler miao:9 mm:10;
//#pragma interrupt_handler miao:9
//中断向量10为TCCR0的,中断向量9为TCCR1的
#pragma data:code
///-----------------------延时函数---------------------------------------
void delay(uint ms)
{
uint i;
for(i=0;i<ms;i++);
}
//------------------------------计数函数---------------------------------------*/
void mm()
{
TCNT0=0X9C;
PORTD|=BIT(0);
PORTD&=~BIT(0);
}
//-----------------------------定时函数-----------------------------------
void miao()
{
TIMSK|=BIT(0);
if (n==1)
{
TIMSK=0X00;
num=TCNT0;
}
else
TCNT1H=0X85;
TCNT1L=0XEF;
PORTA|=BIT(3);
PORTA&=~BIT(3);
n++;
//TIMSK&=~BIT(2);
}
//---------------------------------初始化函数---------------------------------------
void csh()
{
TCNT0=0X9C;
TCNT1H=0X85;
TCNT1L=0XEF;
delay(20); //改变延时凑足总中断为一秒
TCCR0=0X07; //T/C0 为输入上升沿驱动
TCCR1B=0X04; //T/C1B为256分频
TIMSK|=BIT(2); //T/C1溢出中断使能
SREG|=BIT(7); //总中断使能
}
//-----------------------主函数-------------------------------------
void main()
{
DDRA|=0XFF;
DDRD=0XFF;
DDRC=0XFF;
csh(); //此句占用1个周期
}
我不是想立即检测到,而是想让计数和定时在同一起点开始,这个起点由输入信号的上升沿启动!
欢迎光临 (http://www.51hei.com/bbs/) | Powered by Discuz! X3.1 |