EM78系列单片机中程序跳 PAGE 的用法设计

控制/MCU

1876人已加入

描述

5.1.1. 查表指令与用法

EM78 系列八位微控器是利用 (1)“call“,(2) 改变PC (或“tbl”),(3)“retl k“ 三个步骤来查表的。其中“retl k” 是将常数 k 的值传至工作寄存器 “A” 中。

步骤 (2) 中若利用“mov 0x2,a“,或“add 0x2,a” 等等指令来改变PC,则因为此等指令会將 PC (R2) 的位 8、9 清除 (在 EM78056 只清除位 8),所以查表的内容只能放在程序每个 PAGE 的較低的 256 个位址。步骤 (2) 中若利用“tbl“ 指令来改变PC,则因为此指令不会將PC (R2) 的位 8、9 清除,而保留“tbl” 所在位址的位 8、9,所以查表的内容可以放在程序每个 PAGE 中的任何位址。

例:查表

table add 0x02,a ;將相对位置加入 PC 而改变了PC

retl @0x19 ;传回常数内容 19h 至 “A”

retl @0x74 ;传回常数内容 74h 至 “A”

retl @0x2e ;传回常数内容 2eh 至 “A”

retl @0x54 ;传回常数内容 54h 至 “A”

retl @0x4b ;传回常数内容 4bh 至 “A”

inc 0x18

mov a,0x18 ;欲查的内容的相对位置放在“A”

call table ;查表

mov 0x10,a ;查表得到的内容移至 R10 中

5.1.2. 分 PAGE 的用法

1. 程序跳 PAGE 的用法:

EM78 系列八位微控器將其 Program Memory (ROM) 分成数个 PAGE,每个 PAGE 的长度是 1K (EM78056 除外)。R3 寄存器的位 5 (6) 是 “PAGE 选择位”,当执行 “jmp” 或 “call” 指令时,“PAGE 选择位” 会被载入 Program Counter 的位 10 (11),因此当程序超过 1K (EM78056 为 0.5K)时,执行 “jmp” 或“call” 指令时,“PAGE 选择位” 正确的设定是非常重要的。下面将以 EM78256 为例来说明跳 PAGE 的方法。

例:从PAGE 1 跳转到PAGE 0

; PAGE 0, begin at 000h

049 add 0x11,a

050 mov a,@0x55

051 mov 0x05,a ;port5《-- 0x55

052 bs 0x03,5 ;select PAGE 1

053 jmp lab1 ;PAGE jump

054

; PAGE 1, begin at 400h

447

448 mov a,@0x3f

449 xor 0x12,a

450 Lab1 bc 0x06,3

451 mov a,0x05

说明:

052: 将 R3 寄存器的位 5 设为 “1” (选择 PAGE 1)。

053: Lab1 会被编译 为 “50”,程序跳转至 PAGE 1 中 “Lab1” (450) 的位址。

注意:

此例中 “052” 和 “053” 是用来跳 PAGE 的,假如沒有 “052” 这行指令,则程序将跳转至“050” 的位址 (在 PAGE 0中),如此將沒有达到預期的目的。

2. 不同 PAGE 子程序呼叫的方法:

如第 1 项所述,当程序超过 1K 時,执行 “call” 指令时,“PAGE 选择位” 的设定就必须加以考虑。下面將以 EM78256 为例来说明呼叫不同 PAGE 子程序的方法。

例: 从PAGE 0调用PAGE 1中的子程序

; PAGE 0, begin at 000h

049 add 0x11,a

050 mov a,@0x55

051 mov 0x05,a ;port5《-- 0x55

052 bs 0x03,5 ;select PAGE 1

053 call Lab2 ;PAGE jump

054 bc 0x03,5 ;restore

055 jbs 0x15,2

056

; PAGE 1, begin at 400h

417

418 mov a,@0x3f

419 xor 0x12,a

450 Lab2 bc 0x06,3

451 mov a,0x05

45f ret

說明:

052: 將 R3 寄存器的位 5設为 “1” (选择 PAGE 1)。

053: Lab2 將会被編译为 “50”,呼叫 PAGE 1 中 “Lab2” 子程序。

054: 將 R3 寄存器的位5 还原为 “0”。

注意:

此例中 “052” 和 “053” 是用来呼叫 PAGE 1 中 “Lab2” 的子程序,假如果沒有 “052” 這行指令,則程序將呼叫 “050” 的位址 (在 PAGE 0中),而非 “450” 的位址 (在 PAGE 1中),如此將发生錯誤。

5.1.3. “BS”,“BC” 等指令对 I/O Port 的作用:

“BS”,“BC” 等指令会先有 “读” 再 “写” 的动作,例如 “bc 0x06,3” 指令是將整个 Port 6 (8 PIN) 读進 CPU,执行位运算后再写至 Port 6 上。假如 Port 6 有一些 pin 是双向 I/O pin (如 P65) 時,假設当执行 “bc 0x06,3” 時P65 是输入 pin,則 P65 pin 上的内容会被读入再写至 Latch 上,覆蓋原先 Latch 上的内容。因此只要 P65 一直是输入 pin 將不会有問題,一旦 P65 切換为输出,則 Latch 上的内容將是不可預知的。

5.1.4. I/O Port读取的路径:

若仔細研究EM78系列八位微控器的I/O Port构造,就可发現在做“读”I/O Port的动作時(如“mov a,0x06”),所读入内容有两个路径来源,一是I/O pin上的内容,另一是输出Latch上的内容,而由I/O控制寄存器決定此读入的路径。

例如I/O pin设计为输入pin時(对应的I/O控制寄存器为“1”),对I/O Port做“读”的动作時,是读到pin上的内容。若I/O pin设计为输出pin時(对应的I/O控制寄存器为“0”),对I/O Port做“读”的动作時,是读到输出Latch上的内容。

5.1.5. WDT (Watchdog Timer)的使用:

WDT是微控器內部RC自振的计時器,其超時溢位(Time-out)的基本周期約18ms,WDT有与TCC共用的倍除器,使得超時溢位(Time-out)的最大周期可至約2.2sec。WDT计時的使能或禁止是可隨時由指令控制的(控制位在IOCE寄存器)。当WDT使能時,其超時溢位將使微控器发生RESET(或喚醒),“wdtc”指令是用来清除WDT,令WDT再从头计時,因此适当的使用“wdtc”指令,可使WDT不会发生RESET。当WDT被禁止時,WDT不会使微控器RESET或喚醒。要特別注意的是,Power-on之後WDT是使能的,如果該应用中並沒有使用WDT,必須在程序的前头用指令將WDT计時禁止。EM78156/256/456就是依上述所設计。

在EM78247/447/248/448/056/P156除了上述的設计外,另有一Code Option決定使能或禁止WDT,其功能如下:

1. 假如应用中有使用WDT,WDT必須以Code Option使能,則在程序中隨時可以用指令使能或禁止WDT计時。注意:Power-on之後WDT是使能的。

2. 假如应用中並沒有使用WDT,WDT可以以Code Option禁止,則WDT是永遠被禁止的,如此可省去須在程序的前头用指令將WDT计時禁止的麻煩。

5.2. 基本设计规则

5.2.1. 设定I/O口的模式:

用户可以单独设定任一支I/O脚为输出模式(Output Mode),或是输入模式(Input Mode)。只要將每个I/O的设定写入累加器(A)中,再將累加器的内容写到I/O控制寄存器中,设定就算完成了。

例1:將PORT6设定为OUTPUT PORT。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分