首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

请教一个关于16位向下计数器的问题

请教一个关于16位向下计数器的问题

我用MC9S12DG128B的16位向下计数作为内部定时器,其计数脉冲是否是总线时钟(即每来一个总线时钟脉冲16位向下计数器中的初值减一)?
时间我始终算不对。
它的时钟源是总线时钟,但可以通过MCPR1和MCPR0的设置进行1~16的分频。
海纳百川  有容乃大
#include /* common defines and macros */
#include /* derivative information */


#pragma LINK_INFO DERIVATIVE "mc9s12dg128b"

long int i=0;

void clk_Init(void) //overspeed
{
REFDV=0X01;
SYNR=0X04;
while((CRGFLG&0x08)==0x00)
{
}
CLKSEL=0x80;
} //overspeed对PLL操作后总线时钟变为40MHz

void Port_Init(void)
{
DDRB = 0xFF;
PORTB = 0xF0;
PEAR=0x00; //可测出总线时钟
DDRM=0xFD;
}

void Timer_Init(void) //向下计数器初始化
{
MCCNT=0x0FFFF;
MCCTL=0xC4;
}

#pragma CODE_SEG NON_BANKED

interrupt 26 void Timer_load() //向下溢出中断
{i++;
if(i==600000)
{
PORTB=~PORTB;
i=0;
}
}

#pragma CODE_SEG DEFAULT

void main(void) {
EnableInterrupts;
clk_Init();
Port_Init();
Timer_Init();
for(;;) {} /* wait forever */
}

理论时间计算:65536*600000/40M=983.04秒
但是实际上PORTB取反的时间在1秒左右(目测)
S12的最高总线频率为25M。你试试20M的总线频率下是否正常。
海纳百川  有容乃大
我发现问题了,必须手动清中断标志位,而且要重新赋计数初值。
现在运行正常了,谢谢
中断标志是应该要清。但是否重新赋初值应由MODMC位决定。
海纳百川  有容乃大
怎么我用楼主的程序连中断都不能产生呢?楼主说是目测1秒取反,我这里根本不能取反,八个小灯的状态维持不变,这是怎么回事呢?补充一点,我用的是清华的片子
程序写入芯片并开始运行了吗?时钟频率是多少?
海纳百川  有容乃大
程序是运行了啊,4灯亮4灯灭,但就是不发生变化,应是没发生中断吧。
我用的是清华的MC9S12DG128,按楼主程序里面的锁相环操作后频率就是40HZ
你的芯片里面有bootloader程序吗?如果有,那么中断地址是要重新映射的。
海纳百川  有容乃大
bootloader程序,你说的是监控程序吧,是有的,我没有用BDM,是用串行口的,因此必须写监控程序。但是重新映射是什么意思?怎么弄啊?

是在PRM文件中用VECTOR定义吗?

先回去看看再说

[此贴子已经被作者于2007-7-5 19:05:56编辑过]

我用BDM试了一下,还真的出现了期望的结果。真是郁闷,我同学都抢先用了BDM,只剩下我用串行口,害我浪费这么长时间.
不过我还是想知道怎么重新映射,找到一个帖子,http://bbs.eccn.com/dispbbs.asp?boardID=3&RootID=114590&ID=114590,虽然讲得很详细,但还是对有些地方不清楚,比如里面说将把函数放在0xEFF0处,怎么放?放在哪里?是放在C程序中还是放在PRM中.
请参考这个帖子:
http://bbs.eccn.com/dispbbs.asp?BoardID=3&RootID=118663&id=119119&star=1&skin=
海纳百川  有容乃大
问题已经解决.
我们的监控程序里面也对中断向量重新映射过了.谢谢楼主
返回列表