|
|||||||||||
| 技術(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匯編碰到怪問題.望熱心人進來看看 |
| 作者:潘紅民 欄目:單片機 |
;==================================================================== ;芯片復(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 于 2004/3/19 5:47:00 發(fā)布:
可以簡化一點? 可將程序簡化一點。越簡化,越不易出錯,調(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樓: | >>參與討論 |
| 作者: 潘紅民 于 2004/3/19 11:03:00 發(fā)布:
我修改了一下,改成以下這樣,不過問題還是出現(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樓: | >>參與討論 |
| 作者: 潘紅民 于 2004/3/19 11:19:00 發(fā)布:
decf TIMER_H, 1 第三次調(diào)用時TIMER_H從0x10減1時產(chǎn)生復(fù)位啦, decf TIMER_H, 1 |
|
| 5樓: | >>參與討論 |
| 作者: 潘紅民 于 2004/3/19 13:20:00 發(fā)布:
沒有人能說出為什么嗎?傷心! |
|
| 6樓: | >>參與討論 |
| 作者: owengeorge 于 2004/3/19 15:05:00 發(fā)布:
有沒有用狗 沒有看程序,如果用狗的話要注意定時喂它,否則他就咬你,如果是狗復(fù)位的話可以看看復(fù)位狀態(tài)寄存器的。 |
|
| 7樓: | >>參與討論 |
| 作者: 潘紅民 于 2004/3/19 15:12:00 發(fā)布:
owengeorge高見,你說對了 我本來去電子市場子的,走到一半在路上想到了,回來一試果然是開著看門狗的緣故不好意思,浪費人家寶貴時間. |
|
|
|
| 免費注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點此進入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號 |