打印

单片机定时器问题,急!!!

[复制链接]
1992|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yanfengren|  楼主 | 2012-7-18 15:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
利用定时器2产生3MHz脉冲,程序如下,但是用示波器测试频率是600khz,不知什么问题,请高手指教!!

#include<c8051f410.h>
#define uchar unsigned char
#define uint unsigned int

sbit pwm=P0^6;
sbit en1=P0^0;
sbit en2=P0^1;
void sysclock_init()
{
  OSCICN    = 0x87;
}
void gpio_init()
{
    P1MDIN    = 0xB7;
    P0MDOUT   = 0xFF;
    P1SKIP    = 0x48;
    XBR1      = 0x40;

}
//-----------------------------------------------------------------------------
//  定时器2产生3mkhz的方波
//-----------------------------------------------------------------------------
void C8051F410_Timer2_Init (void)
{  
    CKCON     = 0x10;
    TMR2RLL   = 0xC3;
    TMR2RLH   = 0xFF;
    TMR2L     = 0xC3;
    TMR2H     = 0xFF;

}
//-----------------------------------------------------------------------------
//  定时器2中断程序,每次产生方波翻转
//-----------------------------------------------------------------------------
void C8051F410_Timer2_ISR(void) interrupt 5
{  

       pwm=~pwm;    //翻转输出方波200khz        

                    

}
void main()         
{

PCA0MD&=0xBF;//关看门狗
sysclock_init();
gpio_init();
  C8051F410_Timer2_Init ();
EA=1;
TR2=1;//                              //开定时器2
  ET2=1;
while(1);

}

相关帖子

沙发
shell.albert| | 2012-7-18 15:59 | 只看该作者
去单片机版块吧。

使用特权

评论回复
板凳
vrgood| | 2012-7-18 16:48 | 只看该作者
你这个3M是怎么算的?
最快也只有24.5M/(256-0XC3)=400K

使用特权

评论回复
地板
lyjian| | 2012-7-18 18:40 | 只看该作者
用中断产生3MHz的脉冲?闲着没事做了吧?
放着PCA不用,自找麻烦

使用特权

评论回复
5
yanfengren|  楼主 | 2012-7-19 17:34 | 只看该作者
pca 的端口不能随意指定,定时器是16位自动重载的,应该可以产生啊

使用特权

评论回复
6
lyjian| | 2012-7-19 20:16 | 只看该作者
void C8051F410_Timer2_Init (void)
{  
    CKCON     = 0x10;
    TMR2RLL   = 0xC3;
    TMR2RLH   = 0xFF;
    TMR2L     = 0xC3;
    TMR2H     = 0xFF;
*****************
你这设置值不是出200K吗,何来出3M?

使用特权

评论回复
7
lyjian| | 2012-7-19 20:51 | 只看该作者
pca 的端口不能随意指定,定时器是16位自动重载的,应该可以产生啊
yanfengren 发表于 2012-7-19 17:34

要出3M的话,定时器就要1/6uS中断一次,也就是说要4个指令周期中断一次(=24.5/6),也就是说你要在4个指令周期完成中断调用+中断处理+中断返回。但这是不可能的:C8051F从中断触发到进入中断最小需要5个指令周期,执行一条"pwm=~pwm"需要2个指令周期,中断返回需要5个指令周期,再执行一条"while(1)"需要3个指令周期,也就是说完成一次定时器中断最少需要5+2+5+3=15个指令周期,也就是说最快最快能做到的频率是24.5/(15*2)=0.817MHz。

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
Tinnal + 1 是应该这样分析的
8
lyjian| | 2012-7-19 20:54 | 只看该作者
pca 的端口不能随意指定,定时器是16位自动重载的,应该可以产生啊
yanfengren 发表于 2012-7-19 17:34

对C8051F410来说,pca的端口正好可以随意到任意一个IO

使用特权

评论回复
9
yanfengren|  楼主 | 2012-7-19 23:08 | 只看该作者
谢谢,关于pca 好像只能按照优先级来分配端口,比如说p0.0端口被其他功能占用,那么pca的CEX0才会分配到p0.1端口,这样按顺序进行,假如想直接分配给p0.6这样能实现吗?

使用特权

评论回复
10
sinonion| | 2012-7-20 10:22 | 只看该作者
要出3M的话,定时器就要1/6uS中断一次,也就是说要4个指令周期中断一次(=24.5/6),也就是说你要在4个指令周期完成中断调用+中断处理+中断返回。但这是不可能的:C8051F从中断触发到进入中断最小需要5个指令周期, ...
lyjian 发表于 2012-7-19 20:51


这位兄台分析的有理

使用特权

评论回复
11
sinonion| | 2012-7-20 10:36 | 只看该作者
3M,周期0.33us,机器周期0.0408us,中断从产生到LCALL至少10个完整机器周期,那么这时就是是0.408us了,还不算中断ISR执行,所以呀,楼主你的这个愿望不能实现!

使用特权

评论回复
12
lyjian| | 2012-7-20 12:46 | 只看该作者
谢谢,关于pca 好像只能按照优先级来分配端口,比如说p0.0端口被其他功能占用,那么pca的CEX0才会分配到p0.1端口,这样按顺序进行,假如想直接分配给p0.6这样能实现吗? ...
yanfengren 发表于 2012-7-19 23:08

可以实现
用SKIP跳到P0.6

使用特权

评论回复
13
yanfengren|  楼主 | 2012-7-23 21:22 | 只看该作者
跳到0.6,期间的引脚还有其他的功能,只好改板了,谢谢大家!

使用特权

评论回复
14
Tinnal| | 2012-7-23 22:41 | 只看该作者
要出3M的话,定时器就要1/6uS中断一次,也就是说要4个指令周期中断一次(=24.5/6),也就是说你要在4个指令周期完成中断调用+中断处理+中断返回。但这是不可能的:C8051F从中断触发到进入中断最小需要5个指令周期, ...
lyjian 发表于 2012-7-19 20:51


对,不能单从TIMER单方面考虑问题。就算TIMER能产生这么快的中断,单片机也处理不了这么的中断。这是两个问题而不是一个问题,单片机能不能处理这么快的中断,要考虑中断处理程序需要的指令周期,以后单片机转入中段服务程序需要的指令周期数。

使用特权

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

本版积分规则

62

主题

151

帖子

1

粉丝