2016-10-24 9 views
1

ASMのPICプログラミングの初心者として、新しい値を設定する前にレジスタがクリアされている理由を理解できません。実際の実行中のプログラムでは、これは行われず、すべて正常に動作します。なぜ新しい値を設定する前にレジスタクリアが行われるのですか

例はCRLF

CRLF PORTB  ; Init PORTB by clearing output data latches 
BSF STATUS, RP0 ; Select Bank 1 
MOVLW 0xCF   ; Value used to initialize data direction 
MOVWF TRISB  ; Set RB<3:0> as inputs 
        ; RB<5-4> as outputs 
        ; RB <7-6> as inputs 

例でCRLF

BSF STATUS, RP0 ; Select Bank 1 
MOVLW 0xCF   ; Value used to initialize data direction 
MOVWF TRISB  ; Set RB<3:0> as inputs 
        ; RB<5-4> as outputs 
        ; RB <7-6> as inputs 

せずに両方の部分は、なぜクリアするので、細かい動作しますか?

+1

最初の例には、「新しい値を設定する前にクリアされたレジスタ」のインスタンスが含まれていません.PORTBとTRISBは完全に別個のレジスタです。 2番目の例の問題は、2つの出力ピンの初期状態が決して指定されなかったことです。物理的な結果(モータのようなもの)で何かに接続されていると、起動時にコードが何をするのか分かりません。 – jasonharper

+0

@jasonharper これをよく理解すれば、CRLF PORTBはTRISBがPORTBのプロパティを変更する間にラッチのデータをクリアしますか? – Decapod

答えて

0

マイクロチップコントローラを搭載した一般的な落とし穴は、PORTxレジスタに書き込んでいます。 決してする必要があります。出力ピンの状態を変更したい場合は、出力ラッチ(LATx)に直接書き込む必要があります。これは、PORTxレジスタへの書き込みには、ピンが同時に状態を変更している場合に問題を引き起こす可能性のある読み取り/変更/書き込みプロセスが含まれているためです。 PORTxは入力ピン(もちろん出力ピン)の値を読み取るためにのみ使用してください。

コメントで述べたように、TRISxレジスタはピンの方向(0 =出力、1 =入力)を設定します。これは、0 =入力、1 =出力を使用する他のプロセッサ(Motorola HC12など)の設定とは逆です。

+0

CRLF PORTXを使用しないことをお勧めしますか? init中にしかし、まずTRISXを使い、問題のポートに明確な命令を書いてください。 – Decapod

関連する問題