dergege 发表于 2009-7-17 21:46:43

AVR初学者想请问马老师一个定时计数的问题!

我是一个初学AVR的学生,这是我写的一个测频程序,T0定时,T1计数(好浪费,用两个……),用的ICC,但是出现的问题我实在无法理解,请指点!
#include <iom16v.h>
#include <macros.h>
#include <UART.h>   //串口发数

#define uchar unsigned char
#define uint unsigned int

uint frequence;
uchar count;                        //计数,定时10ms

void Port_init()
{
DDRB&=~(1<<PB1);
PORTB&=~(1<<PB1);
}

void Timer_Init()
{
TCCR0= 0x00;                //停止定时器0
TCCR1B= 0x00;                //停止定时器1
TCNT0= 0x83;                //定时器0定时1ms
TIMSK |= 0x01;                //定时器0溢出中断允许
TCCR1A = 0x00;
TCNT1 = 0x00;
TCCR0= 0x03;                //启动定时器0,64分频
TCCR1B = 0x07;                //启动定时器1,时钟源为外部T1引脚,上升沿驱动
}

void Init_Devices()
{
CLI();
MCUCR= 0x00;
MCUCSR = 0x80;
GICR   = 0x00;
uart0_init();
Port_init();
Timer_Init();
SEI();
}

#pragma interrupt_handler timer0_ovf_isr:10
void timer0_ovf_isr(void)
{
SEI();//加个SEI();在这测出的频率就没错
TCNT0 = 0x83;
count++;
if(count==10)    //定时10ms
{
count=0;
frequence = TCNT1;
TCNT1 = 0x00;                                                   
//put_number(frequence);    //这是一个串口发数函数,把它写到这,测出的频率就出错
}                                                                              
}

void main()
{
Init_Devices();
while(1) put_number(frequence);//把发数函数写到这测出的频率也没错
}


我现在是用的查询标志位然后在主函数中发送数据的,下面是我的串口发数程序:

void put_char(unsigned char c)
{
UDR = c;
while(!(UCSRA&(1<<UDRE)));
}

void put_number(unsigned int dat)
{
put_char(dat/10000+48);
put_char(dat/1000%10+48);
put_char(dat/100%10+48);
put_char(dat/10%10+48);
put_char(dat%10+48);
put_char(32);
}

为什么当我把串口发数的函数写进中断后,不加SEI();发出的(或者说测得的)数据就不正确呢?

dergege 发表于 2009-7-18 16:15:28

还请指点!

machao 发表于 2009-7-19 11:49:46

http://www.ouravr.com/bbs/bbs_content.jsp?bbs_sn=1116671&bbs_page_no=1&bbs_id=1003

后面有具体介绍。
页: [1]
查看完整版本: AVR初学者想请问马老师一个定时计数的问题!