AVR我從一無所知學到現(xiàn)在也懂了些皮毛 我想用M16制作一個頻率計,我的設計思路是這樣的:在精確定時的一秒中內(nèi)對輸入的脈沖方波進行計數(shù);在這一秒鐘內(nèi)對計數(shù)器的溢出次數(shù)進行累計,那么,輸入脈沖的頻率=溢出次數(shù)X計數(shù)器最高計數(shù)+最后一次計數(shù)器內(nèi)的計數(shù)值!------------可是怎樣才能制作一個能同時開啟計數(shù)器ATTR0和定時器ATTRB的閘門,閘門的觸發(fā)由輸入方波的某一上升沿觸發(fā)???
我編了一個簡單的程序 可是可是經(jīng)Proteus仿真總是相差幾微妙不能同步開啟 還有 沒有能用輸入上升沿觸發(fā)定時和計數(shù)。

//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 ///-----------------------延時函數(shù)--------------------------------------- void delay(uint ms) { uint i; for(i=0;i<ms;i++); } //------------------------------計數(shù)函數(shù)---------------------------------------*/ void mm() { TCNT0=0X9C; PORTD|=BIT(0); PORTD&=~BIT(0); }
//-----------------------------定時函數(shù)----------------------------------- 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); } //---------------------------------初始化函數(shù)--------------------------------------- void csh() { TCNT0=0X9C; TCNT1H=0X85; TCNT1L=0XEF; delay(20); //改變延時湊足總中斷為一秒 TCCR0=0X07; //T/C0 為輸入上升沿驅(qū)動 TCCR1B=0X04; //T/C1B為256分頻 TIMSK|=BIT(2); //T/C1溢出中斷使能 SREG|=BIT(7); //總中斷使能 } //-----------------------主函數(shù)------------------------------------- void main() {
DDRA|=0XFF; DDRD=0XFF; DDRC=0XFF; csh(); //此句占用1個周期
}
|