2005-10-14 程序移植到89C420的工作基本完成

来源:互联网 发布:淘宝达人头像 编辑:程序博客网 时间:2024/04/30 03:57

经过几天的努力,程序移植到89C420的工作基本完成了,进入测试阶段。在89C420新功能的开发过程中也遇到了不少问题,走了一些弯路,不过都还算顺利的解决了。

首先是配置串口的问题,以前都是使用单串口的MCU,没有双串口的相关经验。开始想过是两只串口使用同一个Timer来控制波特率,但Datasheet上没有介绍这么做,提到了一点,Serial port 1只能使用Timer1来控制,而 Serial port 0 既可以用Timer1,又可以用Timer2来配置。照着这种方式配置了很久,波特率是配好了,但发现只要向SBUF0或者SBUF1写任何东西,程序就停在那里不动了,没有找出问题来,后来在美信的网站上找到了一个使用串口的文章,正好有使用双串口的范例,居然是共用Timer方式写的,正好!把范例的汇编改写成SDCC的C51代码,测试几次后就搞定问题了!分开配置不能运行的问题没有解决,不过不重要了,双串口可以在不同波特率下工作,只是有倍数限制。
串口还遇到一个小错误是Serial port 1 在SDCC中的中断号是 interrupt 7,我开始粗心的推算成 interrupt 6了。

第二个问题的是外部中断无法响应的问题,旧MCU是使用正常的,代码查了几遍没有发现任何问题,还查了HEX文件的中断部分代码,可以肯定的是没有发生中断,用示波器测外部中断脉冲,不大好查,脉冲宽度很小,而且只有一个,不过还是发现中断源好像没有初始化,功能没有执行,查看线路图发现外部芯片的时钟信号来源于MCU的ALE信号,对比测新旧芯片的ALE信号,果然是89C420预设关断ALE输出,很多芯片都有这项设定,以降低干扰。置位PMR.3就OK了。

第三个问题是内存的使用问题,在新MCU中RAM加大了,但使用时无法存取地址为0xff以上的RAM,查资料发现PMR.0预设为0,使用外部RAM,所以无法使用on chip RAM了,置位后还是发现部分RAM可用,但是xdata的数组就不可用了,初始化数据无效。后来发现了问题,就是PMR.0置位是在main函数中的,数组初始化是在main函数运行之前,必须是先将PMR.0置位才可以。我在reg420.h头文件中PMR的定义修改成同时初始化数据,结果执行时发现,使用固定地址的方式定义时,部分数组初始化正常,但还是有一部分初始化无效,而没有固定地址的方式定义,则跟先前一样,查看ASM文件,发现xdata数组与data数组的初始化ASM代码是一样的,然而xdata是无法直接寻址的,这可能就是SDCC的问题吧。至于为什么固定地址的方式定义同时初始化数组有部分正常而部分不正常还有等待进一步研究,有一点值得注意,有一个数组一半数据初始化是正常的,难道在头文件中初始化xdata数组有容量限制,哈哈,不在这个问题上浪费时间了,最后是写了一个数组初始化内联函数,解决所有数组的初始化问题,这样就没问题了。