打印

中断后计时出错的

[复制链接]
701|23
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
chuxh|  楼主 | 2020-10-11 16:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
中断修改返回PC,从中断返回之后,执行延时程序的时候总是出错,发现STATUS的Z位经常无法置1,然后导致程序出错(硬件电路表现是无反应,仿真是错误退出)。经过多种方法验证以及步进调试,发现了一个规律:如果延时非常短,STATUS的Z位可以正常置1,但是稍长的延时(比如0.5S或1S),Z又不能置1了会一直延时导致错误。因为中断之前的延时不管多长时间都是正常的,中断之后就出现Z不能正常置1的出错,非常非常想不通!
我用的型号是16F1823

使用特权

评论回复
沙发
chuxh|  楼主 | 2020-10-11 16:58 | 只看该作者
有遇到过这问题的吗?

使用特权

评论回复
板凳
lium| | 2020-10-11 17:02 | 只看该作者
没有遇到

你有代码吗,复现这个问题的

使用特权

评论回复
地板
wangpe| | 2020-10-11 17:09 | 只看该作者
是被中断打断了?不该啊

使用特权

评论回复
5
chuxh|  楼主 | 2020-10-11 17:12 | 只看该作者
原来的代码非常长,同时因为公司的保密制度原因,我刚刚尝试写了另外一个简单的代码准备发上来,结果,这个简单的却不存在Z位不能置1的问题!
难道我那个程序中断后Z位不能置1是因为耗电太多的原因吗?毕竟同一个延时子程序,中断前正常,中断后不正常,想不到其他原因
刚刚写的这个简单的代码,和我遇到问题的那个采用同样的中断处理方式,发上来给大大看看是不是中断处理有缺陷,请指点一下,感谢!

使用特权

评论回复
6
chuxh|  楼主 | 2020-10-11 17:16 | 只看该作者
#include p16f1823.inc
__CONFIG _CONFIG1, _FOSC_INTOSC & _WDTE_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _CPD_OFF & _BOREN_OFF & _CLKOUTEN_OFF & _IESO_OFF & _FCMEN_OFF
__CONFIG _CONFIG2, _WRT_OFF & _PLLEN_OFF & _STVREN_OFF & _BORV_LO & _LVP_OFF
errorlevel 0,-302

    ORG            0000H            
    GOTO    START                  
    ORG            0004H
    BANKSEL IOCAF
    CLRF IOCAF
    BANKSEL TOSH
    CLRF TOSH
    MOVLW 10H
    MOVWF TOSL
    RETFIE

INTPP ORG 0010H
        BCF PORTC,0
DELAY2;延时程序,蓝灯闪
        MOVLW 0F0H
        MOVWF 75H
        CLRF 74H
        INCFSZ 74H,F
        GOTO $-1
        DECFSZ 75H,F
        GOTO $-3
        
        BTFSS 73H,1
        GOTO $+4
        BSF PORTC,1
        BCF 73H,1
        GOTO DELAY2
        BCF PORTC,1
        BSF 73H,1
        GOTO DELAY2

START ORG 0040H
BANKSEL TRISC;初始化
BCF TRISC,0
BCF TRISC,1
BANKSEL PORTC
BCF PORTC,0
BCF PORTC,1
BANKSEL ANSELA
BCF ANSELA,4
BANKSEL IOCAF
CLRF IOCAF
MOVLW B'10001000'
MOVWF INTCON
BANKSEL IOCAN
BSF IOCAN,4

DELAY1;延时程序,黄灯闪
BANKSEL PORTC
        MOVLW 0F0H
        MOVWF 72H
        CLRF 71H
        INCFSZ 71H,F
        GOTO $-1
        DECFSZ 72H,F
        GOTO $-3
        
        BTFSS 73H,0
        GOTO $+4
        BSF PORTC,0
        BCF 73H,0
        GOTO DELAY1
        BCF PORTC,0
        BSF 73H,0
        GOTO DELAY1
    END

使用特权

评论回复
7
tian111| | 2020-10-11 17:20 | 只看该作者
这种不用怀疑吧,程序问题

使用特权

评论回复
8
juventus9554| | 2020-10-11 17:26 | 只看该作者
中断需要保存程序状态字

使用特权

评论回复
9
xxmmi| | 2020-10-11 17:29 | 只看该作者
把修改TOS的命令放到主程序里试试,在中断服务程序里改TOS不妥当

使用特权

评论回复
10
chuxh|  楼主 | 2020-10-11 17:34 | 只看该作者
中断后要跳到指定PC地址的,返回主程序再改,怎么改?

使用特权

评论回复
11
chuxh|  楼主 | 2020-10-11 17:37 | 只看该作者
PIC搞个TOS寄存器,不就是为了方便改的吗?

使用特权

评论回复
12
chuxh|  楼主 | 2020-10-11 17:44 | 只看该作者
在中断里改TOS会导致什么样的问题呢?我查找不到相关的资料

使用特权

评论回复
13
zhanglli| | 2020-10-11 17:47 | 只看该作者

你这个在做的类似任务调度,那你应该注意到STATUS是影子寄存器组的一员

使用特权

评论回复
14
songqian17| | 2020-10-11 17:50 | 只看该作者
并且这个也是应该做现场切换的很重要的东西。

使用特权

评论回复
15
chuxh|  楼主 | 2020-10-11 17:54 | 只看该作者
是的,你猜的很对!
STATUS是设计为不需要保存的,没有需要保存的东西,正在执行的任务遇到中断后,是再重新执行一次。

使用特权

评论回复
16
huwr| | 2020-10-11 18:04 | 只看该作者
DATASHEET翻烂了找不到答案,步进的方法调试的结果就是Z不能置1,但是不知道为什么?

使用特权

评论回复
17
chuxh|  楼主 | 2020-10-11 18:07 | 只看该作者
可能之前说得不够清楚,是DECFSZ/BTFSS之类的双周期指令Z不能置1,像SUBLW之类的单周期能正常置1

使用特权

评论回复
18
chuxh|  楼主 | 2020-10-11 18:10 | 只看该作者
说明书里提到“Note 1: INTF flag is sampled here (every Q1).
2: Asynchronous interrupt latency = 3-5 TCY. Synchronous latency = 3-4 TCY, where TCY = instruction cycle time.
Latency is the same whether Inst (PC) is a single cycle or a 2-cycle instruction.”
那么像DECFSZ这种双周期指令,遇到中断是怎么处理的呢?

使用特权

评论回复
19
houcs| | 2020-10-11 18:13 | 只看该作者
16F1823, 为啥还要写汇编?

使用特权

评论回复
20
chuxh|  楼主 | 2020-10-11 18:18 | 只看该作者

这个Z不能置1的问题时不时出现啊,找不到原因好烦恼

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

936

主题

11296

帖子

2

粉丝