打印

一个严重问题,3年后暴露才显露,恐怖

[复制链接]
2646|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
兰天白云|  楼主 | 2007-4-27 20:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
TE, pc, ov, FPC, RF
定义几个寄存器用于中断时保存W,STATUS,PCLATH
芯片是16F917
P_TEMP  EQU  6DH
W_TEMP  EQU  6EH
S_TEMP  EQU  6FH
以下是中断开头保护3个寄存器的程序,问题就出在这里

        ORG   0004H
           MOVWF W_TEMP       ;保护W
           SWAPF 3,0          ;保护STATUS
           CLRF 3
           MOVWF S_TEMP
           MOVF  PCLATH,0      ;保护PCH
           MOVWF P_TEMP
           CLRF  PCLATH 

大家看到了吗?
千万不要犯我这种错误哦!
沙发
yewuyi| | 2007-4-28 08:41 | 只看该作者

为什么不把这三个地址定义到0X70~0X7F内?

呵呵,老兄,16F917总共推出来也没三年把?

使用特权

评论回复
板凳
lxrlxr| | 2007-4-28 20:10 | 只看该作者

不会吧,应该3年多了

使用特权

评论回复
地板
ayi| | 2007-5-26 10:33 | 只看该作者

看不出有什么错误

请楼主指导一下

使用特权

评论回复
5
h_x_zhong| | 2007-5-28 22:57 | 只看该作者

看不问题,

芯片是16F917,有几级中断,我也没用过该芯片

使用特权

评论回复
6
yewuyi| | 2007-5-29 08:34 | 只看该作者

我想兰天白云是想说那几个地址的问题

发生中断的时候那几个地址有可能不对号

使用特权

评论回复
7
与时俱进| | 2007-5-29 17:20 | 只看该作者

不是针对每一种芯片都有对应的例程吗?

那可是microchip为你写好的,为什么不用?

使用特权

评论回复
8
兰天白云|  楼主 | 2007-6-2 08:27 | 只看该作者

有些时候会犯糊涂

使用特权

评论回复
9
li3| | 2007-6-6 11:58 | 只看该作者

没有看出来问题,故弄玄虚!!

;***** VARIABLE DEFINITIONS
w_temp        EQU    0x71        ; variable used for context saving
status_temp    EQU    0x72        ; variable used for context saving
pclath_temp    EQU    0x73        ; variable used for context saving            






;**********************************************************************
    ORG     0x000             ; processor reset vector

    clrf    PCLATH            ; ensure page bits are cleared
      goto    main              ; go to beginning of program


    ORG     0x004             ; interrupt vector location

    movwf   w_temp            ; save off current W register contents
    movf    STATUS,w          ; move status register into W register
    movwf    status_temp       ; save off contents of STATUS register
    movf    PCLATH,w      ; move pclath register into w register
    movwf    pclath_temp      ; save off contents of PCLATH register

; isr code can go here or be located as a call subroutine elsewhere

    movf    pclath_temp,w      ; retrieve copy of PCLATH register
    movwf    PCLATH          ; restore pre-isr PCLATH register contents
    movf    status_temp,w     ; retrieve copy of STATUS register
    movwf    STATUS            ; restore pre-isr STATUS register contents
    swapf   w_temp,f
    swapf   w_temp,w          ; restore pre-isr W register contents
    retfie                    ; return from interrupt

使用特权

评论回复
10
yewuyi| | 2007-6-6 13:31 | 只看该作者

就是这几个地址的问题

w_temp        EQU    0x71        ; variable used for context saving
status_temp    EQU    0x72        ; variable used for context saving
pclath_temp    EQU    0x73        ; variable used for context      

使用特权

评论回复
11
兰天白云|  楼主 | 2007-6-7 08:44 | 只看该作者

就是这几个地址的问题

yewuyi的写法正确

w_temp        EQU    0x71        ; variable used for context saving
status_temp    EQU    0x72        ; variable used for context saving
pclath_temp    EQU    0x73        ; variable used for context      

以下写法错误

P_TEMP  EQU  6DH
W_TEMP  EQU  6EH
S_TEMP  EQU  6FH

特别是 "W_TEMP  EQU  6EH"

使用特权

评论回复
12
hjh002| | 2007-6-12 16:50 | 只看该作者

地址那样定义没有问题啊。

如果字母开头的地址,就要在前面加0,比如地址是EEH的,要写成 0EEH,象你这样数字开头的是没有问题的。

使用特权

评论回复
13
兰天白云|  楼主 | 2007-6-13 08:19 | 只看该作者

这么容易让人误解啊

这么容易让人误解啊
我是说w_temp    不能定位在0x6e,而只能定位在0x70以上的地址

使用特权

评论回复
14
hjh002| | 2007-6-13 08:32 | 只看该作者

定位在0X6E有什么问题啊?

使用特权

评论回复
15
hjh002| | 2007-6-13 11:45 | 只看该作者

哦,我知道了,是RAM的BANK问题。

使用特权

评论回复
16
孤独泪| | 2007-6-15 13:34 | 只看该作者

学习,马上就要用917或者946了

使用特权

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

本版积分规则

115

主题

2962

帖子

7

粉丝