音影先锋亚洲天堂网|电影世界尽头的爱完整版播放|国产 熟女 91|高清无码免费观看欧美日韩|韩国一区二区三区黄色录像|美女亚洲加勒比在线|亚洲综合网 开心五月|7x成人在线入口|成人网站免费日韩毛片区|国产黄片?一级?二级?三级

登錄 免費注冊 首頁 | 行業(yè)黑名單 | 幫助
維庫電子市場網(wǎng)
技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng)
驅(qū)動編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機 | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計 | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe

用PIC匯編碰到怪問題.望熱心人進來看看

作者:潘紅民 欄目:單片機
用PIC匯編碰到怪問題.望熱心人進來看看
;====================================================================
    ;芯片復(fù)位地址
PIC16C54    EQU 1FFH
PIC16C56    equ    000h;3ffh
PIC16C57    EQU 7FFH
    
    ;程序起始地址
start    equ 006h

    ;寄存器定義
RTCC EQU    0x01
PC     EQU    0x02
STATUS    EQU    0x03
FSR    EQU     0x04
PORTA EQU    0x05
PORTB EQU    0x06
PORTC EQU    0x07    

    ;定義實際使用寄存器
R1    EQU 8h
R2    EQU    9h
R3    EQU    0Ah
R4    EQU    0Bh
R5    EQU    0cH
R6    EQU    0dh
TIMER_L    EQU    0eh    ;計時寄存器
TIMER_H    EQU 0fh

TEMP_L    EQU 010h    ;臨時寄存器
TEMP_H    EQU    011h
    
    org PIC16C56

    goto main

    org    start
    ;1秒鐘延時函數(shù)定義
Delay_1000ms
    
    clrf    R1
    clrf    R2
    movlw    0ffh
    movwf    R5            ;R5=0xFF
    movlw    09eh;        ;計數(shù)1000外層循環(huán)    ****
    movwf    TIMER_L
    movlw    00h;                            ****
    movwf     TIMER_H
    goto    Delay_loop1


Delay_loop
    ;對高位是否要時位進行判斷
    movfw    R1            
    subwf    R5,0
    btfsc    STATUS,2        ;測試z是否為0,是0則跳行
    incf    R2,1            ;臨時寄存器加1

    ;低位
    incf    R1,1            ;臨時寄存器加1

    ;高位
    movfw    R2
    subwf    TIMER_H,0        ;與W中的數(shù)進相減結(jié)果存入W中
    btfss    STATUS,2        ;測試Z是否為1,是1則跳行    
    goto    Delay_loop1
                    ;
loop_exie
    movfw    R1
    subwf    TIMER_L,0        ;與W中的數(shù)進相減結(jié)果存入W中
    btfss    STATUS,2        ;測試Z是否為1,是1則跳行(相等)
    goto    Delay_loop1
    retlw    0h                ;返回    

Delay_loop1
    movlw    0XE4            ;里層循環(huán)計數(shù)
    movwf    TEMP_L
    MOVLW    0X00
    movwf    TEMP_H    
    clrf    R3
    clrf    R4
Delay_loop2
    ;對高位是否要進位判斷
    movfw    R4
    subwf    R5,0            ;R5 = 0xFF
    btfsc    STATUS,2        ;測試z是否為0,是0則跳行
    incf    R4,1            ;臨時寄存器加1

    nop

    ;低位
    incf    R3,1            ;臨時寄存器加1
    movfw    R3
    subwf    TEMP_L,0        ;與W中的數(shù)進相減結(jié)果存入W中
    btfss    STATUS,2        ;測試Z是否為1,是1則跳行(相等)    
    goto    Delay_loop2

    ;高位
    movfw    R4
    subwf    TEMP_H,0        ;與W中的數(shù)進相減結(jié)果存入W中
    btfss    STATUS,2        ;測試Z是否為1,是1則跳行    
    goto    Delay_loop2
    goto    Delay_loop

;程序開始
;====================================================================
main    
    call    Delay_1000ms
    call    Delay_1000ms
    call    Delay_1000ms   ;%%%%無法返回
    call    Delay_1000ms
    call    Delay_1000ms
    call    Delay_1000ms

    movlw    0fh                ;    
    tris    PORTB            ;定義B口開高四位為輸出低四位為輸入
         .
         .
         .
         .

問題:
2樓: >>參與討論
su_mj000
可以簡化一點?
可將程序簡化一點。越簡化,越不易出錯,調(diào)試也越容易。

我試圖按你的思路對"Delay_1000ms"做了簡化,試試。

; --- soft timer ---
TIMER_L     equ     0x0E            ; soft timer (L)
TIMER_H     equ     TIMER_L + 1     ; soft timer (H)
TIMER_U     equ     TIMER_H + 1     ; soft timer (U)


CLOCK_FREQ  equ     4000000         ; 4.000MHZ?
INST_PER_LP equ     11
TOTAL_LOOPS equ     (CLOCK_FREQ / (4 * INST_PER_LP))

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Delay_1000ms:
            movlw   TOTAL_LOOPS & 0xff          ; timer lower byte
            movwf   TIMER_L             

            movlw   (TOTAL_LOOPS >> 8) & 0xff   ; timer middle byte
            movwf   TIMER_H

            movlw   (TOTAL_LOOPS >> 16) & 0xff  ; timer higher byte
            movwf   TIMER_U
            
            ;
            ; following segment takes 11 instruction execution time/loop
            ;
Delay_1000ms_loop1:
            decf    TIMER_L, 1
            btfsc   STATUS, 2       ; TIMER_L is zero after dec.?
            
            decf    TIMER_H, 1
            btfsc   STATUS, 2       ; TIMER_H is zero after dec.?
            
            decf    TIMER_U, 1
            
            movf    TIMER_L, 0
            iorwf   TIMER_H, 0
            iorwf   TIMER_U, 0
            
            btfss   STATUS, 2       ; TIMER_L/H/U are zero?
            goto    Delay_1000ms_loop1
            
            retiw   0


3樓: >>參與討論
潘紅民
我修改了一下,改成以下這樣,不過問題還是出現(xiàn)了,連調(diào)二次就復(fù)位
su_mj000謝謝你給我思路,以下是我改過的,
; --- soft timer ---
TIMER_L     equ     0Eh            ; soft timer (L)
TIMER_H     equ     TIMER_L + 1     ; soft timer (H)
TIMER_U     equ     TIMER_H + 1     ; soft timer (U)

CLOCK_FREQ  equ     4000000         ; 4.000MHZ?
INST_PER_LP equ     11
TOTAL_LOOPS equ     08400h    ;/(CLOCK_FREQ / (4 * INST_PER_LP))

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Delay_1000ms:
            movlw   TOTAL_LOOPS & 0xff          ; timer lower byte
            movwf   TIMER_L             

            movlw   (TOTAL_LOOPS >> 8) & 0xff   ; timer middle byte
            movwf   TIMER_H

            ;movlw   (TOTAL_LOOPS >> 16) & 0xff  ; timer higher byte
            movlw    02h
            movwf   TIMER_U
            
            
            ;
            ; following segment takes 11 instruction execution time/loop
            ;
Delay_1000ms_loop1:
            decf    TIMER_L, 1
            btfss   STATUS, 2       ; TIMER_L is zero after dec.?
       goto    Delay_1000ms_loop1
    
            movf    TIMER_H, 0
            iorwf   TIMER_U, 0
            btfsc   STATUS, 2       ;
       goto    Delay__exit

            decf    TIMER_H, 1
            btfss   STATUS, 2       ; TIMER_H is zero after dec.?
       goto    Delay_1000ms_loop1         

       movf    TIMER_U, 0
            iorwf   TIMER_U, 0            
            btfsc   STATUS, 2       ;
       goto    Delay__exit

            decf    TIMER_U, 1           

       movf    TIMER_U, 0                       
            iorwf   TIMER_U, 0            
            btfss   STATUS, 2       ; TIMER_L/H/U are zero?
            goto    Delay_1000ms_loop1
Delay__exit            
            retlw   0


* - 本貼最后修改時間:2004-3-19 11:06:32 修改者:潘紅民

4樓: >>參與討論
潘紅民
decf    TIMER_H, 1
第三次調(diào)用時TIMER_H從0x10減1時產(chǎn)生復(fù)位啦,
            decf    TIMER_H, 1

5樓: >>參與討論
潘紅民
沒有人能說出為什么嗎?傷心!
 
6樓: >>參與討論
owengeorge
有沒有用狗
沒有看程序,如果用狗的話要注意定時喂它,否則他就咬你,如果是狗復(fù)位的話可以看看復(fù)位狀態(tài)寄存器的。


7樓: >>參與討論
潘紅民
owengeorge高見,你說對了
我本來去電子市場子的,走到一半在路上想到了,回來一試果然是開著看門狗的緣故不好意思,浪費人家寶貴時間.

參與討論
昵稱:
討論內(nèi)容:
 
 
相關(guān)帖子
為何我的程序會不斷地重復(fù)執(zhí)行呀
16f87a在靜電放電試驗中,有復(fù)位現(xiàn)象發(fā)生,如何解決復(fù)位電路?
有帶溫度傳感器的單片機?
16F84功能很一般啊?為什么那么貴啊?
求教ISPro
免費注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點此進入


Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號