哪位熟悉80C196 的朋友能帮个忙,请教2个小问题,谢谢了
关于80c196 KC 以下问题,哪位熟悉196的朋友能帮个忙?
请问以下问题:
问题1:
80c196KC 的 Timer2 定时器 采用外部时钟,产生溢出中断。
资料上讲:Timer2 定时器产生溢出中断的向量是:0x2038
该中断申明表达式,到底怎样写?
(1)#pragma interrupt (Timer2_isr=12)
(2)#pragma interrupt (Timer2_isr=0x2038)
(3)#pragma interrupt (Timer2_isr=28)
又有朋友说:2038h-----38h=56d 于是这里应该是 Timer2_isr=28
这里到底该是多少?我一直没有彻底搞明白?
因为:其他中断,书上都找到了明确的例子,所以也没有出现问题,例如:
#pragma interrupt(ExtInt=7) 外部中断 表述正确,其序号确实为:7
#pragma interrupt( HSO=0x2006) HSO中断 表述正确,其向量确实为:2006
这样都对。我也没有仔细思考过,这是为什么?
那个地方,保证了着2种方式,都对?
——————————————————————————————
对于定时器2中断的以上3种声明,都编译通不过,提示:
目标文件地址错。
具体源程序如下:
程序目的:
Timer2 定时器 采用外部时钟,Timer2随便搞个初值,例如0xF000,于是计量,够了FFFF,
产生溢出中断,在中断服务程序中,断点可以停住就行了。
#include <kc_sfrs.h>
#include <kc_funcs.h>
#pragma interrupt (Timer2_isr=12) /* Timer2 定时器*/
//#pragma interrupt (Timer2_isr=0x2038) /* Timer2 定时器*/
//#pragma interrupt (Timer2_isr=12) /* Timer2 定时器*/
/*以上这3种方式,都不行*/
void main()
{
unsigned int TempT2;
wsr = 0x0;
ioc0=0x02; /*Timer2 定时器 外部时钟 复位源 是:t2rest 不是:HSO.0*/
/*禁止外部复位源 每次写Timer2 复位*/
ioc1 |=0x08; /* 朋友提醒要加这一句,但不明白 */
//ioc3=0; /*Timer2 定时器 外部时钟*/
int_mask1=0x10; /*允许 Timer2 定时器 中断*/
timer2 = 0xF000; /*随便一个初值*/
while (1)
{
TempT2 = timer2; // 读取T2CLK脚上的上升/下降沿
/*随机的把程序停下来,可以看到这个TempT2值,是跟着变化的*/
/*用更严格的办法,也可以证明,TempT2值,是跟着外部时钟变化正确的*/
}
}
void Timer2_10ms_isr()
{
timer2 = 0; /*断点打在这里,永远也停不住,即永远进入不了中断*/
}
#################################################
问题2:用HSO查询方式使HSO.0与HSO.1输出相同波形,以下程序已经实现,而且正确。
但我希望:用HSO查询方式使HSO.0与HSO.1输出相反波形。如何实现?
因为:hso_command的低4位为6时,则HSO.0与HSO.1同时相同动作。于是产生相同波形好办。
但如果是产生相反波形,如何实现?可以允许,2者之间有些滞后。
这样也可以:
____│▔▔▔▔▔▔│________│▔▔▔▔▔▔│________│▔▔▔▔▔▔│____
▔▔▔│____________│▔▔▔▔│____________│▔▔▔▔│____________│▔▔
主要是我那几个 hso_command hso_time 搞的有些乱,哪位如果有时间,能否帮我试试?
#include <kc_sfrs.h>
#define TimerC 3000 //定时常数
#define RatioH 2000 //高电平时间
#pragma interrupt(pwm_out=0x2006)
void pwm_out() /* 中断服务程序输出将输出引脚状态反转指示 */
{
if(ios0 & 0x01)
{
hso_command = 0x16; // 预置低电平
hso_time = timer1 + RatioH; // 高电平时间宽度
}else
{
hso_command = 0x36; // 预置高电平
hso_time = timer1 + TimerC-RatioH; // 低电平时间宽度
}
}
void main ()
{
hso_command = 0x36; /* 0 0 1 1 , 0000 */
/*无关 定时器1 置位HSO引脚 中断 HSO.0 */
hso_time = timer1 + 250;
int_mask = 0x08;
int_pend = 0;
enable();
while(1);
}
哪位如果能将以上2个程序,帮我调通,坦克 更是感激了。
谢谢了。
发表时间:2003年5月25日13:45:31