写一个16F73做的测试仪器产品程序
用了9个中断:
; INT外部秒脉冲中断
; TMR0外部脉冲计数器溢出中断
; PORTB(D7---D4)电平变化
; A/D转换完成;电压测量
; TMR1内部定时器溢出即500MS定时/显示/Buz)
; TMR2匹配
; SCI异步发送
; SCI异步接收
初始化完成后,以上9个中断全部开放(使能)
主程序在循环时,经常由于在某个CALL 调用子程序时发生中断,造成堆栈溢出
而且溢出的堆栈内容有时怪怪的
如:
00AD
00CE
012A ;中断发生
0079 ;中断发生 0079 ????前一中断处理刚RETFIE出又进其它中断了?
0079 ;中断发生 0079 ????前一中断处理刚RETFIE出又进其它中断了?
0079 ;中断发生 怎么压栈地址还是0079 ????前一中断处理刚RETFIE出又进中断了?
0079 ;中断发生 是否是CALL 瞬间发生 ???
0079 ;压栈地址对应于 CALL SendLCDdata 下句PC地址 ---- 正常主程序CALL
我的程序涉及到以下事情:
6种开关量跳变检测、计数、处理;模拟量电压A/D;
定时显示LCD(LCDDriver=HT1621);报讯(BUZ接在HT1621上);
MCU与IIC(24LC08 / 硬件时钟IC 4553)读写通讯;
IR/485两种USART通讯(异步串口)
外部元件断口控制(磁保持继电器/微电机)
所以,主程序在循环时,以上9个中断全部开放(使能)
但调试时经常堆栈溢出(仿真器:贝能MICRICE )
分开(仅仅开放某1个/2个中断)调试一般正常
请问高手大虾:
(1)主程序在循环时,以上9个中断全部开放不行吗?
(我觉得应该是可以的,但老乡不同莫名其妙地堆栈溢出)
(2)另外在LCD显示送数/SCI串口通讯/查表 等情形是否一定要关闭某个中断或全部中断?
请高手传授经验,多谢!
(3)如果中断源比较多,而且中断比较频繁(如1ms一次中断),中断处理程序中是否不能语句太多?
否则外围主程序可能老得不到执行。??
(4)考虑中断发生,CALL子程序中到底可以嵌套几级CALL ? 2 / 3 / 5 级 ?
中断处理程序中是否可以再 CALL...[CALL...(CALL...)] ???
另外用了几年PIC单片的8级堆栈总觉得不好用,太少了。
用HYNIX HMS87Cxxxx 写了几个产品程序,觉得很舒服,几乎可以随便地CALL (CALL...)
多层嵌套,只要留的堆栈寄存器多一些就可以了。因为我一直用汇编写,所以能多用些CALL嵌套,
程序思路框架比较清晰些。
PIC单片机恰恰不能多用嵌套的CALL,怎么办?
通过跟踪窗口慢慢查找,发现在16F73程序中 ORG 0004H之后的
BCF PLATCH,3 ;选PAGE0 影响了RETFIE返回出栈的PCLTH值
原来写法为:
ORG 000H
GOTO MAINSTART
ORG 0004H
BCF PLATCH,3 ;选PAGE0 ********多了此句!!!
GOTO INTSRV
...............
MAINSTART:
..........
INTSRV: ;PAGE0
......... ;W,STSTUS,PLATCH 备份
ORG 0800H
..............
改为将INTSRV程序段直接放到 ORG 0004H之后就OK了。
但还有以下问题,请问高手大虾谈谈经验体会:
(1)主程序在循环时,以上9个中断全部开放好不好?
(2)另外在LCD显示送数/SCI串口通讯 等情形是否一定要关闭某个中断或全部中断?
请高手传授经验,多谢!查表前时是关闭了全局中断 GIE 的。
(3)如果中断源比较多,而且中断比较频繁(如1ms一次中断),中断处理程序中是否不能语句太多?否则外围主程序可能老得不到迅速执行。??
(4)考虑中断发生,CALL子程序中到底可以嵌套几级CALL ? 2 / 3 / 5 级 ?
中断处理程序中是否可以再 CALL...[CALL...(CALL...)] ???
另外用了几年PIC单片的8级堆栈总觉得不好用,太少了。
用HYNIX HMS87Cxxxx 写了几个产品程序,觉得很舒服,几乎可以随便地CALL (CALL...)
多层嵌套,只要留的堆栈寄存器多一些就可以了。因为我一直用汇编写,所以能多用些CALL嵌套,程序思路框架比较清晰些。
PIC单片机恰恰不能多用嵌套的CALL,怎么合理解决?
在此提醒用p
我的程序已经OK
在此提醒用picrice 仿真的同行,
要善于使用 *.lst 文件和 *.tac(跟踪窗口文件)
调试有问题要静下心来仔细分析
通过跟踪窗口结合 *.lst 文件
总是可以找出问题的原因的。
关键是要仔细看,看明白了。
转贴 贝能网站的zhangwf回答如下,给刚入门的guest
(1)9个中断全部开放没问题。
(2)不一定要屏蔽中断。
(3)中断处理程序的总的执行时间不要超过1ms,中断程序尽量简短。
(4)中断+CALL的个数不要> 8。
一般程序8级堆栈足够了。