NEC Electronics (China) NEC ELECTRONICS (CHINA)
日电电子 NEC
主  页
应  用
产  品
技  术
支  持
购  买
最  新  消  息
关  于  我  们
header
产品名称搜寻
关键字搜寻
文档搜寻
参数搜寻
    网页指南  联系我们  

FAQ



编程
内容    
FAQ-ID = 78prog-nnnn
0001: 关于没有十进制调整指令的CPU中标准算法操作程序的问题。  
0002: 关于当不常使用的中断发生时所需采取的安全措施的问题。
0003: 寄存器库分配的处理方法。
0004: 关于液晶显示器显示RAM位设置和复位的问题。
0005: 关于端口位清理的问题。
0007: 关于针对堆栈指示器重新赋值的指令的问题[78K/0S]
0008: 在CC78K0中,是否有必要区分大写字母和小写字母?
0009: 当设计超过10000H时,我们应该注意哪些是需要慎重应用的?[78K/4]
0010: 可否利用一个固定周期将设置型寄存器重新写入?

78prog
-0001
关于没有十进制调整指令的CPU中标准算法操作程序的问题。
1 uPD789415没有十进制调整指令,所以十进制的操作显得有一点复杂。
那么是有有一个标准程序针对十进制操作,例如简单的加减乘除?
1 请参考以下所举的例子。

ADJBA是通过一个宏来定义的针对加法的十进制调整指令。十进制调整是通过加法结束以后执行ADJBA宏指令来完成的。
ADJBS是通过一个宏来定义的针对减法的十进制调整指令。十进制调整是通过减法结束以后执行ADJBS宏指令来完成的。
;
;       definition of macro
;
ADJBA   MACRO
        CALLT   [ADJBAT]
ENDM
        ADJBS   MACRO
CALLT   [ADJBST]
ENDM
;
;       definition of CALT table
;
CALTTBL CSEG    AT 40H
ADJBAT: DW      ADJBAS
;
;       decimal adjust for addtion
;
ADJBAS: PUSH    BC
        MOV     C,#0
        BNC     $NEXT0          ; IF C=1 ADJUST 60H
        MOV     C,#0B0H
NEXT0:  BT      PSW.4,$NEXT1    ; JUMP IF AC=1
        MOV     B,A             ; SAVE DATA
        AND     A,#0FH          ; MASK UPPER NIBBLE
        CMP     A,#0AH
        MOV     A,B             ; RESTORE DATA
        BC      $NEXT3          ; JUMP IF NOT ADJUST
NEXT1:  ADD     A,#6            ; ADJUST
        MOV     B,A             ; SAVE DATA
NEXT2:  BNC     $NEXT3
        MOV     C,#0B0H
NEXT3:  CMP     A,#0A0H
        BC      $NEXT4
        MOV     C,#0B0H
NEXT4:  ADD     A,C
        ADD     A,C
        POP     BC
        RET
;
;       decimal adjust for subtraction
;
ADJBSS: PUSH    BC
        MOV     C,#0
        BNC     $NEXT5
        MOV     C,#0D0H
NEXT5:  BF      PSW.4,$NEXT6
        SUB     A,#6
NEXT6:  BNC     $NEXT7
        MOV     C,#0D0H
NEXT7:  ADD     A,C
        ADD     A,C
        POP     BC
        RET
(2002/07)
78prog
-0002
关于当不常使用的中断发生时所需采取的安全措施的问题。
问1 如果一个不曾使用的中断发生了,并且导致一些错误甚至是CPU硬件崩溃,CPU会采取怎样的措施?
1 计算机不可能断然地规定当不曾使用的中断被承认时该采取怎样的操作, 因为当CPU承认一个中断地时候,它会读取向量表数据中的分支目的地址(向量)以及针对每个地址的分支,该表由各个中断所决定。 
然后CPU会将写在该地址上的代码作为一条指令执行。
所以所执行的操作的类型取决于读到的这句代码。
2 当一个不曾使用的中断发生的时候,如果我想进行这样的操作将语句跳转到 @cstart.
我该做些什么?
2 在C源函数中简单的定义中断的函数,同时将那个处理函数命名为@cstart。
如果要按照这种方法使用INTP0,就需要写一个声明,例如

#pragma interrupt INTP0 noint rb1

这样所有不曾使用的中断都会用noint处理一下。
用这种方法时,所有不曾使用的中断向量都会变成noint类型。
此时,将以下函数作为noint型来定义。
Void noint()
        {
#asm
        ; Initialization of interrupt-related flag
        movw ax!0
        br ax
#endasm
}
既然实际的处理必须用到汇编编程,那么就使用一个带扩展内联#asm的汇编。
78prog
-0003
寄存器库分配的处理方法。
问1 当有三个或者更少的中断函数的时候,我认为应该将每个中断都分别分配到寄存器库RB1到3中;但是如果有4个或者5个不同的中断存在的时候我该如何解决呢?(包括寄存器解决方案等等)
1 没有必要把所有的中断都分配到不同的寄存器库中。
处理方法的不同取决于是否你想使用多重中断(嵌套)。

即使你打算使用多个中断,只要你不使用多重中断的话,对于主群组处理来说使用一个寄存器库已经足够了,另外还需要一个寄存器库来负责中断运行。
(既然当一个中断运行时,别的中断时不允许运行的,那么不同的中断就可以共享同一个寄存器库。)

如果使用多重中断的话,那么就有必要在运行一个中断的时候确认另一个中断,此时针对这些中断就必须使用不同的寄存器库了。

既然这样,只有为那些中断结合分配好寄存器库才能防止冲突发生。
如果存在很多层次的嵌套并且寄存器库无法处理好这些嵌套,就不要使用针对较低优先级的中断的寄存器库, 取而代之可以将寄存器存入堆栈区域。

当使用针对中断定义的#pragma中断命令时,不用描述寄存器库的规格,这种处理也能自动被完成。(同样也不需要指定NOBANK)

如果用户想要知道更详细的信息,请查阅CC78K0(语言)菜单中CHAPTER 11 EXTENDED FUNCTIONS里“11.5如何使用拓展函数”中“(10)中断函数限量”这一部分的解释。
78prog
-0004
关于液晶显示器显示RAM位设置和复位的问题。
问1 uPD789488中,液晶显示器显示RAM能否按照位设置和复位?
答1 应该尽量避免使用汇编语言的位设置和复位。
之所以这样的理由是因为二进制数字处理指令是通过使用读-修改-写的方法来执行的。

因为液晶显示器显示RAM没有4个较高的位,数据在读出的时候就变得无法确定,所以较高的4位都必须填0。
(参阅用户手册中“CHAPTER 13 LCD CONTROLLER/DRIVER”一章中“13.5液晶显示器显示数据存储器”中的图13.6的警示)

当使用C语言的时候,通过将位区域设置成4位同时使用位与运算操作,这样的描述应该还是可能的。
请查阅C语言手册然后创建一个程序。
78prog
-0005
关于端口位清理的问题。
1 我该如何清理uPD789012的P2.0端口?
我认为应该使用"AND P2,#11111110B"这条指令,但结果是与指令对SFR没有效果。
1 当你使用交替函数的时候,请务必在RAM中储存每个端口的数据。
如果你想要改变端口的内容,你可以修改RAM中的值(在你举的这个例子中,就可以把0位清除)并且将新的值输出到P2端口,当你想把数值写回到RAM时也可以这样做。
用这样的方法你就可以掌握每一个位的值。
78prog
-0007
关于针对堆栈指示器重新赋值的指令的问题。[78K/0S]
1 uPD789415的用户手册中没有提及到关于直接对SP赋值的指令。
那么我是否可以使用这样的指令?
        MOV     SP,#0FEFFH
 
1 因为用户不能直接对SP赋值,所以我们可以先将值赋给AX寄存器,然后通过它转赋给SP。
        MOVW    AX,#0FEFFH
        MOVW    SP,AX
78prog
-0008
在CC78K0中是否有必要区分大写字母和小写字母?
问1 直到现在,我仍然觉得在CC78K0中不需要区分大写字母和小写字母,但是这样的观点在升级版本中就不再适用了。
答1 CC78K0是在3.10版本中开始区分大写字母和小写字母的。
当大小写字母之间的区别逐渐明显,你这样的观点会慢慢消除的。
78prog
-0009
当设计超过10000H地址时,我们应该注意哪些是需要慎重应用的?[78K/4]
问1 uPD784038内置有一个60KB的区域(从00000H到0EDFFH)和一个64KB的区域(从10000H到1FFFFH)。
当我的设计区域超过10000H地址时,我该注意要观察些什么或者是设置哪些条目?
答1 唯一你要注意的是你的设计可能会被分割开。
因此,如果你使用这种存储器构造的时候,你必须在链接指示文件中将从10000H到1FFFH部分的名字改为类似ROM1这样,将程序的部分指定放置在该区域,并将部分放入ROM1中。

如果想要知道更多信息,请参阅RA78K4操作手册中“章节6 链接程序”中的“6.4 连接指示”。
然而,与其使用这样的一个储存器结构,我更推荐使用LOCATION 0FH来替代内置的RAM 1MB同时在程序中使用从0到1FFFFH的连续空间。
78prog
-0010
可否利用一个固定周期将设置型寄存器重新写入?
问1 在uPD789022中,我想每隔一个固定周期就刷新一下以下的寄存器。
有什么要注意的吗?

PM0 / PM1 / PM2 / PM3 / PM4 / PM5 / PUO / TCL2 / WDTM / TMC20 / CR20 / IF0 / MK0 / IF1 / MK1
1 的确这其中有不少问题。
用户不应该在定时操作中设置CR20,因为这样会在所定的时候引发一个中断的产生。

此外重新设置型的IFO和IF1可能会在它们消失的时候产生中断。
这就是之所以要在执行寄存器操作的时候考虑到所有会产生的结果的重要性。

基本上,如果不是必须的话,我不推荐使用重新设置型寄存器。
(2002/02)



   LEGAL    最新之产品资料, 请参阅英文版
 请用Internet Explorer浏览本网站以达最佳效果。
  © 2005-2008  NEC Electronics China Limited