2017-02-18 34 views
1

私はちょうどPICアセンブラに慣れ始め、それに応じてビットをシフトしてLEDを点灯させてみました。このPICアセンブラコードでビットがシフトしないのはなぜですか?

MPLAB X IDEを搭載したXpress DM164140開発ボードを使用しています。

私はRA0-RA3に4つのLEDを持っています。R5の "ユーザー"レジスタの値をシフトしてPORTAレジスタにアサートすることで、1つずつ点灯させたいと思います。

これは私が使用しているアセンブリコードです。 DELAYサブルーチンを使用しないと、4つのLEDがすべて点灯しますが、DELAYサブルーチンを使用するとRA3は点灯しません。シフトはRA3まで機能します。

したがって、問題は何とかDELAYサブルーチンになければなりません。それを理解できません。 私はlslfとaddwf命令を使って、目的の動作を実装しようとしましたが、これまでのところ運はありませんでした。

誰にもこのようなことが起こっているという手掛かりはありますか?

ありがとうございます!

; Assembly source line config statements 

#include "p16f18855.inc" 

; CONFIG1 
; __config 0x3FEC 
__CONFIG _CONFIG1, _FEXTOSC_OFF & _RSTOSC_HFINT1 & _CLKOUTEN_OFF & _CSWEN_ON & _FCMEN_ON 
; CONFIG2 
; __config 0x3FFF 
__CONFIG _CONFIG2, _MCLRE_ON & _PWRTE_OFF & _LPBOREN_OFF & _BOREN_ON & _BORV_LO & _ZCD_OFF & _PPS1WAY_ON & _STVREN_ON 
; CONFIG3 
; __config 0x3FFF 
__CONFIG _CONFIG3, _WDTCPS_WDTCPS_31 & _WDTE_ON & _WDTCWS_WDTCWS_7 & _WDTCCS_SC 
; CONFIG4 
; __config 0x3FFF 
__CONFIG _CONFIG4, _WRT_OFF & _SCANE_available & _LVP_ON 
; CONFIG5 
; __config 0x3FFF 
__CONFIG _CONFIG5, _CP_OFF & _CPD_OFF 

;user define registers @ bank0 
R1 equ 0x20 
R2 equ 0x21 
R3 equ 0x22 
R4 equ 0x23 
R5 equ 0x24 
R6 equ 0x25 

RES_VECT CODE 0x0000   ; processor reset vector 
    GOTO START     ; go to beginning of program 

; TODO ADD INTERRUPTS HERE IF USED 

MAIN_PROG CODE      ; let linker place main program 

START 
    CLRW 
    MOVLB 0x11 ;select bank17 to change clock freq of HFINT1 
    ;(high frequency internal oscillator) 
    MOVLW 0x06 
    MOVWF OSCFRQ ;clock divider of 32 = 1MHz frequency 

    MOVLB 0x00 ;move 0x00 to BSR aka select bank0, where TRISA reg is located  
    MOVLW 0xF0 
    MOVWF TRISA ;RA0-3 to output and RA4-RA7 to input 
    MOVLW 0x01 ;00000001 
    MOVWF R5 
    MOVWF PORTA 


MAIN 
    CALL DELAY ;delay to see the blinking 
    bcf STATUS,C ;clear carry bit 
    rlf R5,1 ;shift contents of R5 by 1 to the left and save it to R5 
    MOVF R5,0 ;move shifted R5 to W 
    movwf PORTA ;move W to PORTA 

    GOTO MAIN 


;1 instruction cycles takes 4 clock cycles 
;count to [email protected] clock to get 1s delay 
DELAY 
    MOVLW 0x08 ;8 
    MOVWF R1 
DELAY_1 
    MOVLW 0xFA ;250 
    MOVWF R2 
DELAY_2 
    MOVLW 0xFA ;250 
    MOVWF R3  
DELAY_3 
    DECFSZ R3 ;decrease R2 
    GOTO DELAY_3  
    DECFSZ R2 ;decrease R1 
    GOTO DELAY_2 
    DECFSZ R1 ;decrease R1 
    GOTO DELAY_1 
    RETURN 

    END 

答えて

3

私はあなたがウォッチドッグタイマを有効にしている見ることができるように。おそらく、ウォッチドッグタイマーは、4番目のLEDが消灯する前にMicroControllerをリセットしている可能性があります。

したがって、ウォッチドッグタイマをメインループのどこかでクリアする必要があります。ラベルMAIN

命令を入れて...

CLRWDT 

+0

解決策でした!あなたのおかげで、サー! – spillerPIC

1

これは遅すぎるかもしれませんが、とにかくです。 出力には、LATxコマンドを使用する必要があります。したがって、両方の文字列をPATAからLATAに置き換えてください。

関連する問題