打印
[PIC®/AVR®/dsPIC®产品]

请教一个中断后计时出错的问题

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

使用特权

评论回复
沙发
meeagle|  楼主 | 2019-5-14 15:20 | 只看该作者
有遇到过这问题的吗?

使用特权

评论回复
板凳
oxygenzz| | 2019-5-14 17:54 | 只看该作者
没有遇到

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

使用特权

评论回复
地板
xuanhuanzi| | 2019-5-14 23:38 | 只看该作者
是被中断打断了?不该啊

使用特权

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

#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



使用特权

评论回复
6
ayb_ice| | 2019-5-15 11:46 | 只看该作者
这种不用怀疑吧,程序问题

使用特权

评论回复
7
ayb_ice| | 2019-5-15 11:48 | 只看该作者
中断需要保存程序状态字

使用特权

评论回复
8
锵才才| | 2019-5-15 12:18 | 只看该作者
把修改TOS的命令放到主程序里试试,在中断服务程序里改TOS不妥当

使用特权

评论回复
9
meeagle|  楼主 | 2019-5-15 16:18 | 只看该作者
中断后要跳到指定PC地址的,返回主程序再改,怎么改?
PIC搞个TOS寄存器,不就是为了方便改的吗?

使用特权

评论回复
10
meeagle|  楼主 | 2019-5-15 16:40 | 只看该作者
锵才才 发表于 2019-5-15 12:18
把修改TOS的命令放到主程序里试试,在中断服务程序里改TOS不妥当

在中断里改TOS会导致什么样的问题呢?我查找不到相关的资料

使用特权

评论回复
11
meeagle|  楼主 | 2019-5-16 00:37 | 只看该作者
bellstudio 发表于 2019-5-16 00:01
你这个在做的类似任务调度,那你应该注意到STATUS是影子寄存器组的一员,并且这个也是应该做现场切换的很重 ...

是的,你猜的很对!
STATUS是设计为不需要保存的,没有需要保存的东西,正在执行的任务遇到中断后,是再重新执行一次。
DATASHEET翻烂了找不到答案,步进的方法调试的结果就是Z不能置1,但是不知道为什么?
可能之前说得不够清楚,是DECFSZ/BTFSS之类的双周期指令Z不能置1,像SUBLW之类的单周期能正常置1

使用特权

评论回复
12
meeagle|  楼主 | 2019-5-16 00:48 | 只看该作者
说明书里提到“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这种双周期指令,遇到中断是怎么处理的呢?直接丢弃第二个指令?或者用特殊寄存器保存起来(未在说明书中列出的那种)中断后再执行?

使用特权

评论回复
13
CoolSilicon| | 2019-5-16 08:32 | 只看该作者
16F1823, 为啥还要写汇编?

使用特权

评论回复
14
meeagle|  楼主 | 2019-6-1 17:34 | 只看该作者
这个Z不能置1的问题时不时出现啊,找不到原因好烦恼

使用特权

评论回复
15
meeagle|  楼主 | 2019-6-1 17:38 | 只看该作者
是不是快速操作区做为计时地址的时候,容易出现这个Z 不能置1的问题?或者特定的某些地址?

使用特权

评论回复
16
meeagle|  楼主 | 2019-6-4 09:26 | 只看该作者
原来是CLRF和DECFSZ同时用于延时容易导致复位,这算是设计缺陷吗?

使用特权

评论回复
17
yiyigirl2014| | 2019-6-4 16:43 | 只看该作者
汇编的看不懂。

使用特权

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

本版积分规则

22

主题

149

帖子

1

粉丝