本帖最后由 熊仔 于 2023-9-8 19:32 编辑
1,仿真不能单步调试,可以设置断点F5全速,或者F10 整个函数运行。
2,DPTR1是可以读取code区的内容的。
官方例子方案烧录进板子去运行。结果对的。只是不能仿真,调试发现,执行MOV DPTR,#1000H 后,不会自动切换到DPTR1
; MOV DPS,#00100000B ;使能TSL,并选择DPTR0
; MOV DPTR,#1000H ;将1000H写入DPTR0中,执行完成后选择DPTR1为DPTR
; MOV DPTR,#0103H ;将0103H写入DPTR1中
2种解决方法
方案1:
MOV DPS,#00000000B ;选择DPTR0,默认就是DPTR0,可以屏蔽
MOV DPTR,#1000H ;将1000H写入DPTR0中
MOV DPS,#00000001B ;选择DPTR1
MOV DPTR,#0103H ;将0103H写入DPTR1中
方案2:
MOV DPTR,#1000H ;将1000H写入DPTR0中
MOV DPL1,#03H
MOV DPH1,#01H ;将0103H写入DPTR1中
3,如果对DPTR1传数据最好使用DPL1和DPH1 这样可以不用理会DPS的设置,仿真调试也可以成功。
MOV DPL1,#03H
MOV DPH1,#01H ;将0103H写入DPTR1中
4,使用双DPTR 后,对于中断函数使用有注意事项。需要对DPS,DPL1。DPH1进行现场保护。
对DPS,DPL1。DPH1入栈必须在中断函数前面,如果有使用变量,加上花括号就可以。参考下面的例子:
- unsigned int interruptcnt;
- unsigned char second;
-
- void timer0 (void) interrupt 1{
- _push_(DPS);
- _push_(DPL1);
- _push_(DPH1);
-
- {
- char xdata buf [] = "01";
-
- if (++interruptcnt == 10) {
- second++;
- interruptcnt = 0;
- }
-
- }
- _pop_(DPH1);
- _pop_(DPL1);
- _pop_(DPS);
- }
复制代码
5,改写string.h的函数,拷贝数据code到xdata或者xdata到xdata 速度加快了2到3倍。
6,若需要单独使能AU1 或者AU0,则必须使用TA寄存器触发DPS 的保护机制。
不建议单独控制。不然中断对DPS出栈的时候需要单独处理,太麻烦了。通过修改string.h里面的函数测试,AU1 和AU0 同时使能方式,完全没有问题。
7,keil不支持STC8系列的双数据指针,不能在软件里面选Use multiple DPTR registers,当然也不能使用#pragma modp2
8,STC8的双DPTR可以自动反转,自动++或者自动--,比Atmel设计的双DPTR速度更快,更加合理。可惜keil不支持,需要使用汇编改写对应的函数。
|