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个周期
}
|