打印
[AVR单片机]

T0 输出的频率咋不准了呢

[复制链接]
2273|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jsll86|  楼主 | 2013-5-7 23:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
目的:通过PA1输出0.993KHz方波,用PD6采集该输出方波频率。
问题:当注释掉T1计频中断timer1_capt_isr后,PA1口可以产生0.993KHz的信号;当启用timer1_capt_isr中断后,PA1口只有0.224KHz,这咋回事呢:dizzy:
/*
LCD12864液晶屏显示实验。
PA1输出0.993KHz方波,通过PD6采集,并显示
*/

#include <iom16v.h>
#include "font.h"
#include "lcd12864.h"
#include <macros.h>
int contN;
unsigned char flow_flag=0; //用于标记定时器溢出,如果溢出了,只记录到TCNT的值就不对了哦,需要进行处理,应该是TOP*flow_flag+TCNT
unsigned int icpnum=0; //记录每次采集的TCNT差值,注意整个过程中不要操作TCNT,以免引入误差
unsigned char timerover_error=0;
unsigned int last_icrvalue=0; //记录上次的ICR值
unsigned int value;
void timer1_init(void)
{
TCCR1B = 0x00; //stop
TCNT1H = 0x00;
TCNT1L = 0x00;
ICR1H = 0x00;
ICR1L = 0x00;
TCCR1A = 0x00;
TCCR1B|=(1<<ICNC1)|(1<<ICES1)|(1<<CS11)|(1<<CS10);
}

#pragma interrupt_handler timer1_capt_isr:12
void timer1_capt_isr(void)
{
PORTA|=(1<<7);
//CLI();
value=ICR1L;
value|=(int)ICR1H << 8;

if(flow_flag==0)
{
icpnum=value-last_icrvalue;
}
else
{
if(flow_flag==1)
{
flow_flag=0;
icpnum=0xFFFF-last_icrvalue+value;
}
else
{
timerover_error=1;
flow_flag=0;
}
}
last_icrvalue=value;
SEI();
}

void timer0_init(void)
{

TCCR0 = 0x00;
TCNT0 = 0xc6;
OCR0 = 0xc6;

TIMSK |= 0x03;

TCCR0 |=0B00011;
}


void init_devices(void)
{
CLI();
MCUCR = 0x00;
MCUCSR = 0x80;//禁止JTAG
GICR = 0x00;

DDRA |= (1<<PA1);
DDRD &=~ (1<<PD6);
PORTD |= (1<<PD6);

timer0_init();
timer1_init(); //定时器1初始化
SEI();//开全局中断
}

//T0比较中断服务程序
#pragma interrupt_handler timer0_comp_isr:20
void timer0_comp_isr(void)
{
TCNT0 = 0xc6;
PORTA^=BIT(1);//
PORTD^=BIT(0);//
contN++;
}

//led show
void LCD_init(void)
{
DDRB = 0xFF;
DDRC |= (1<<PC7)|(1<<PC6);//0xC0;
DDRD |= (1<<PD7)|(1<<PD6);//0xD0;

PORTC |=(1<< PC6);// 0x40;
PORTD |= (1<< PD6);//0x40;
PORTD &= ~(1<<PD7);//~0x80;
}
void displaynum(unsigned char row,int aa)
{ int at;
unsigned char asi1,n;

at=aa;n=1;
while(at>0)
{
asi1=at%10+48;
at/=10;
disp_charNum((16-n)*8+1,row,asi1);
n=n+1;
}
}

void main(void)
{
unsigned int showN;
float Freque_value=0.00,T=0.00;//带小数位,精确度高
unsigned int Freque=0,t=0; //只显示整数,精确度低
unsigned int temp=0;

init_devices();
disp_init();
DDRA |=(1<<7) ;
PORTA &=~(1<< PA7);
DDRD |=(1<<0) ;
//PORTD &=~(1<< PA0);

disp_clear(0, 128, 0);
disp_clear(0, 128, 2);
disp_clear(0, 128, 4);
disp_clear(0, 128, 6);

while (1)
{
if(timerover_error==1)
{
//错误处理程序
}
temp = icpnum;
Freque_value=(float)((float)1000000/(float)temp);
//Freque=1000000/temp;
T = (float)((float)temp/(float)1000);
//t=temp/1000;
displaynum(5,Freque_value);//LCD 显示数值
}


}

相关帖子

沙发
qin552011373| | 2013-5-9 09:41 | 只看该作者
好奇怪

使用特权

评论回复
板凳
jsll86|  楼主 | 2013-5-9 22:09 | 只看该作者
qin552011373 发表于 2013-5-9 09:41
好奇怪

是内,注释掉timer1_capt_isr就没事了

使用特权

评论回复
地板
qin552011373| | 2013-5-10 09:43 | 只看该作者
jsll86 发表于 2013-5-9 22:09
是内,注释掉timer1_capt_isr就没事了

好奇怪  感觉是什么原因

使用特权

评论回复
5
jsll86|  楼主 | 2013-5-11 00:35 | 只看该作者
感觉T1的频率采集,影响了,T0的频率输出,按理说系统晶振为7.3728MHz,T0口输出1KHz的频率,应该不止于的呀

使用特权

评论回复
6
qin552011373| | 2013-5-11 21:34 | 只看该作者
jsll86 发表于 2013-5-11 00:35
感觉T1的频率采集,影响了,T0的频率输出,按理说系统晶振为7.3728MHz,T0口输出1KHz的频率,应该不止于的 ...

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

89

帖子

0

粉丝