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();发出的(或者说测得的)数据就不正确呢? 还请指点! http://www.ouravr.com/bbs/bbs_content.jsp?bbs_sn=1116671&bbs_page_no=1&bbs_id=1003
后面有具体介绍。
页:
[1]