位置:51电子网 » 技术资料 » 测试测量

EH78系列单片机的编程技巧

发布时间:2008/5/26 0:00:00 访问次数:606

        

    

     笔者在某智能水表开发中使用了em78p447芯片,对em78系列芯片有了较深认识,在实践中总结了一些开发此类芯片应注意的问题,同时给出了应用中的编程技巧。

    市面上常见的介绍em78系列的参考书中,都给出了一些应用实例,但这些实例一般程序代码量较小,功能单一。虽然这些实例对于新手确实起到了很好的作用,但一个产品可能功能很复杂,程序可能达到几千行,这就会出现一些短程序中没有遇见的问题。以笔者的开发为例,程序总共5千多行,有效的汇编语句代码有3千多行。由于义隆没有提供c的编译环境,只能以汇编进行编码,而汇编的结构、条理性与c语言比较不是很清晰,再加上em78单片机结构的独特性,所以当程序代码量较大的时候总会出现一些新的问题。下面将实践中遇到的问题及其解决方法总结一下,以供参考。

    1 ram数据的读取方法

    em78系列的ram既可以认为是普通单片机中的ram,也可以认为是寄存器(通用和专用寄存器)。以em78p447为例,ram共148×8位,其结构如图1所示。

    其中地址为20h一3eh,共有124(31×4)个,分布在4个ram“体”(bank)上。4个体分别标记为“banko(体o)”、“bankl(体1)”、“bank2(体2)”、“bank3(体3)”。当程序中用到的变量不多或者数据量不是很大时,这种ram结构对程序不会有什么影响,即程序变量能够分配在一个bank中;但是当变量较多时,操作起来将会有些麻烦,同时有可能因为程序中bank选择不当导致程序出错。笔者觉得当数据量较大时,只要是对数据操作,就要先进行bank的选择。特别是对子程序而言,一进入子程序就要进行bank的选择,从而控制所操作数据的范围,时刻要清楚自己操作的数据在哪个bank内。通过改变“体选码”,即rsr寄存器的最高2位,来选择所要访问的数据bank。下面给出一个程序来说明。

    bs rsr,7 :到bank2

    mov a,0x2f

    and a,@ob00111111

    mov ox2e,a

    call lcd _lear ;调用显示屏清零程序

    lcd clear:

    bc rsr,7 ;到bank0

    bc rsr,6

    mova,@ob00000000

    mov lcd address,a

    ……

    如上面程序所示,在调用lcd_ clear之前访问了bank2数据区,接着调用lcd-clear子程序。此时在子程序内,若没有注意数据的bank问题,即没有设置选择banko,则原本要对banko的数据操作则会发生在bank2的相应数据地址上,从而程序发生错误。所以进入子程序后,马上选择要使用数据的bank,从而防止发生误操作em78系列单片机的开发语言为汇编语言,所以当编写汇编程序时,一定要养成一个良好的编程习惯,这非常有利于程序的开发和维护。笔者建议程序中对变量按如下操作。

    ①定义变量表。在程序开始的地方定义好变量表,为每一个变量取名,分配地址空间。

    ②相关变量最好定义在同一bank内,这样当对这些相关变量操作时就可以免去选择bank的麻烦。

    ③以变量名进行操作。不要对变量的地址直接操作,最好以变量名进行操作,这样当变量需要改变名字或者需要更改分配地址时,直接更改变量表即可,而不用更改具体的程序。这点对于较大的程序非常有利,不但可以增加程序的可读性,更重要的是提高程序的编写便利性和维护性。

    以上几点对于编写较高质量的代码都非常重要,应在具体实践中仔细体会。

    2 程序跨页跳转和跨页调用技巧

    首先需要介绍一下em 78系列单片机的程序存储器rom结构。em78系列的程序存储器rom容量为4k×13位,采用page(“页”)分配原则,就是将4k的程序空间分为4页,每个页容量为1k。其结构如图2所示,其中page0(000h~3ffh)、pagel(400h~7ffh)、page2(800h~bffh)、page3(cooh~fffh)。指令系统中的两条长距离跳转指令jmp和call,所携带的地址码仅仅有lo位,210=lk地址空间,即只能在1k的空间内跳转。当使用jmp指令时,装入目标地址到pc程序指针的低10位;使用call指令时,装入目标地址至pc程序指针的低10位,且pc+l压栈,调用同1k页面内的任何程序。pc程序指针(寄存器r2)和堆栈的位数是12位,即寻址空间分别为4k,一个程序页面为lk。页面选择通过设定状态寄存器r3的bit6(ps1)、bit5(pso)来完成。

    在em447中,当需要跳转或调用不同页

        

    

     笔者在某智能水表开发中使用了em78p447芯片,对em78系列芯片有了较深认识,在实践中总结了一些开发此类芯片应注意的问题,同时给出了应用中的编程技巧。

    市面上常见的介绍em78系列的参考书中,都给出了一些应用实例,但这些实例一般程序代码量较小,功能单一。虽然这些实例对于新手确实起到了很好的作用,但一个产品可能功能很复杂,程序可能达到几千行,这就会出现一些短程序中没有遇见的问题。以笔者的开发为例,程序总共5千多行,有效的汇编语句代码有3千多行。由于义隆没有提供c的编译环境,只能以汇编进行编码,而汇编的结构、条理性与c语言比较不是很清晰,再加上em78单片机结构的独特性,所以当程序代码量较大的时候总会出现一些新的问题。下面将实践中遇到的问题及其解决方法总结一下,以供参考。

    1 ram数据的读取方法

    em78系列的ram既可以认为是普通单片机中的ram,也可以认为是寄存器(通用和专用寄存器)。以em78p447为例,ram共148×8位,其结构如图1所示。

    其中地址为20h一3eh,共有124(31×4)个,分布在4个ram“体”(bank)上。4个体分别标记为“banko(体o)”、“bankl(体1)”、“bank2(体2)”、“bank3(体3)”。当程序中用到的变量不多或者数据量不是很大时,这种ram结构对程序不会有什么影响,即程序变量能够分配在一个bank中;但是当变量较多时,操作起来将会有些麻烦,同时有可能因为程序中bank选择不当导致程序出错。笔者觉得当数据量较大时,只要是对数据操作,就要先进行bank的选择。特别是对子程序而言,一进入子程序就要进行bank的选择,从而控制所操作数据的范围,时刻要清楚自己操作的数据在哪个bank内。通过改变“体选码”,即rsr寄存器的最高2位,来选择所要访问的数据bank。下面给出一个程序来说明。

    bs rsr,7 :到bank2

    mov a,0x2f

    and a,@ob00111111

    mov ox2e,a

    call lcd _lear ;调用显示屏清零程序

    lcd clear:

    bc rsr,7 ;到bank0

    bc rsr,6

    mova,@ob00000000

    mov lcd address,a

    ……

    如上面程序所示,在调用lcd_ clear之前访问了bank2数据区,接着调用lcd-clear子程序。此时在子程序内,若没有注意数据的bank问题,即没有设置选择banko,则原本要对banko的数据操作则会发生在bank2的相应数据地址上,从而程序发生错误。所以进入子程序后,马上选择要使用数据的bank,从而防止发生误操作em78系列单片机的开发语言为汇编语言,所以当编写汇编程序时,一定要养成一个良好的编程习惯,这非常有利于程序的开发和维护。笔者建议程序中对变量按如下操作。

    ①定义变量表。在程序开始的地方定义好变量表,为每一个变量取名,分配地址空间。

    ②相关变量最好定义在同一bank内,这样当对这些相关变量操作时就可以免去选择bank的麻烦。

    ③以变量名进行操作。不要对变量的地址直接操作,最好以变量名进行操作,这样当变量需要改变名字或者需要更改分配地址时,直接更改变量表即可,而不用更改具体的程序。这点对于较大的程序非常有利,不但可以增加程序的可读性,更重要的是提高程序的编写便利性和维护性。

    以上几点对于编写较高质量的代码都非常重要,应在具体实践中仔细体会。

    2 程序跨页跳转和跨页调用技巧

    首先需要介绍一下em 78系列单片机的程序存储器rom结构。em78系列的程序存储器rom容量为4k×13位,采用page(“页”)分配原则,就是将4k的程序空间分为4页,每个页容量为1k。其结构如图2所示,其中page0(000h~3ffh)、pagel(400h~7ffh)、page2(800h~bffh)、page3(cooh~fffh)。指令系统中的两条长距离跳转指令jmp和call,所携带的地址码仅仅有lo位,210=lk地址空间,即只能在1k的空间内跳转。当使用jmp指令时,装入目标地址到pc程序指针的低10位;使用call指令时,装入目标地址至pc程序指针的低10位,且pc+l压栈,调用同1k页面内的任何程序。pc程序指针(寄存器r2)和堆栈的位数是12位,即寻址空间分别为4k,一个程序页面为lk。页面选择通过设定状态寄存器r3的bit6(ps1)、bit5(pso)来完成。

    在em447中,当需要跳转或调用不同页

相关IC型号

Warning: Undefined variable $stockkeys in G:\website_51dzw\www.51dzw.com\code\tech\view.php on line 152

热门点击

 

推荐技术资料

音频变压器DIY
    笔者在本刊今年第六期上着重介绍了“四夹三”音频变压器的... [详细]
版权所有:51dzw.COM
深圳服务热线:13692101218  13751165337
粤ICP备09112631号-6(miitbeian.gov.cn)
公网安备44030402000607
深圳市碧威特网络技术有限公司
付款方式