Board logo

标题: 请教一个关于16位向下计数器的问题 [打印本页]

作者: cArlIcon    时间: 2007-4-9 12:13     标题: 请教一个关于16位向下计数器的问题

我用MC9S12DG128B的16位向下计数作为内部定时器,其计数脉冲是否是总线时钟(即每来一个总线时钟脉冲16位向下计数器中的初值减一)?
时间我始终算不对。
作者: strongchen    时间: 2007-4-9 15:02

它的时钟源是总线时钟,但可以通过MCPR1和MCPR0的设置进行1~16的分频。
作者: cArlIcon    时间: 2007-4-9 15:32

#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秒左右(目测)

作者: strongchen    时间: 2007-4-9 16:04

S12的最高总线频率为25M。你试试20M的总线频率下是否正常。
作者: cArlIcon    时间: 2007-4-9 16:12

我发现问题了,必须手动清中断标志位,而且要重新赋计数初值。
现在运行正常了,谢谢
作者: strongchen    时间: 2007-4-9 16:48

中断标志是应该要清。但是否重新赋初值应由MODMC位决定。
作者: d9912345    时间: 2007-7-4 22:24

怎么我用楼主的程序连中断都不能产生呢?楼主说是目测1秒取反,我这里根本不能取反,八个小灯的状态维持不变,这是怎么回事呢?补充一点,我用的是清华的片子
作者: strongchen    时间: 2007-7-5 10:19

程序写入芯片并开始运行了吗?时钟频率是多少?
作者: d9912345    时间: 2007-7-5 12:35

程序是运行了啊,4灯亮4灯灭,但就是不发生变化,应是没发生中断吧。
我用的是清华的MC9S12DG128,按楼主程序里面的锁相环操作后频率就是40HZ
作者: strongchen    时间: 2007-7-5 17:02

你的芯片里面有bootloader程序吗?如果有,那么中断地址是要重新映射的。
作者: d9912345    时间: 2007-7-5 18:41

bootloader程序,你说的是监控程序吧,是有的,我没有用BDM,是用串行口的,因此必须写监控程序。但是重新映射是什么意思?怎么弄啊?
作者: d9912345    时间: 2007-7-5 19:05

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

先回去看看再说

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


作者: d9912345    时间: 2007-7-5 23:22

我用BDM试了一下,还真的出现了期望的结果。真是郁闷,我同学都抢先用了BDM,只剩下我用串行口,害我浪费这么长时间.
不过我还是想知道怎么重新映射,找到一个帖子,http://bbs.eccn.com/dispbbs.asp?boardID=3&RootID=114590&ID=114590,虽然讲得很详细,但还是对有些地方不清楚,比如里面说将把函数放在0xEFF0处,怎么放?放在哪里?是放在C程序中还是放在PRM中.
作者: strongchen    时间: 2007-7-6 09:24

请参考这个帖子:
http://bbs.eccn.com/dispbbs.asp?BoardID=3&RootID=118663&id=119119&star=1&skin=
作者: d9912345    时间: 2007-7-6 14:35

问题已经解决.
我们的监控程序里面也对中断向量重新映射过了.谢谢楼主




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0