搜索
bottom↓
回复: 2

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

[复制链接]

出0入0汤圆

发表于 2009-7-17 21:46:43 | 显示全部楼层 |阅读模式
我是一个初学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();发出的(或者说测得的)数据就不正确呢?

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

 楼主| 发表于 2009-7-18 16:15:28 | 显示全部楼层
还请指点!

出0入0汤圆

发表于 2009-7-19 11:49:46 | 显示全部楼层
http://www.ouravr.com/bbs/bbs_content.jsp?bbs_sn=1116671&bbs_page_no=1&bbs_id=1003

后面有具体介绍。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-15 20:50

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表