🗐 電装工芸日記 - 舞台照明機器の製作とか -

能登半島地震で被災された方々にお見舞い申し上げます。

or 管理画面へ

No.612

Icon of admin
 オレメモです。
 PICにおいてPORTx,nに対するbit反転方法。
 TMR1のコンペアで割り込みしてPORTの出力を反転すればパルスになりますから、差動バイフェーズで重要です。

; PORTAの3bit目だけ反転させる。
 MOVLW 00001000B  ; Wレジスタにフィルタ値を定義 3bit目だけ1
 XORWF PORTA,SELF  ; PORTAの3bit目だけを反転
 ※ 書式はXC8のPIC-as


 データシート読むとPORTxではなくLATxに対して計算を当てるのがいいらしいのですが、ここではわかりやすさのためにあえてPORT相手です。

 XORの計算は次の通り。
0 xor 0 = 0
0 xor 1 = 1
1 xor 0 = 1
1 xor 1 = 0

 PIC16系にはbit単位の反転命令がありませんので、反転させたいbitだけ1にしたフィルタ値をXORで当てます。
 左の値をPORTの現在値、右の値をフィルタ値とすると、2行目と4行目が反転になり、1行目と3行目は非反転になります。

 論理演算の基本ちゃ基本ですが、案外忘れてしまうのでメモメモ。

 アセンブラに限らずですが、出来るだけ簡単な計算で条件分岐を行うことが大事です。
 例えば処理を10回繰り返すとして、0から加算してカウンタが10になったことを判断するより、10から減算して0になったことを判断する方が好みです。PICのアセンブラの分岐処理は計算結果が0かで扱うのが自然だからです。
; 10回繰り返す
 MOVLW 10      ; COUNTに10を設定する
 MOVWF COUNT     ;
LOOP:
 ~ 10回繰り返す処理をここに書く ~
 DECFSZ COUNT,SELF  ; COUNTをデクリメント(-1)し、結果が0なら次行の処理を飛ばす
 GOTO LOOP      ; LOOPを繰り返す
 ~ 繰り返しの後の処理をここに書く ~

 DECFSZはDECFとBTFSSを組み合わせたマクロ命令みたいなものです。

 少し蛇足ですが、レジスタの現在値が0であるかを見るには、
; レジスタNUMの値は0か?
 MOVF  NUM,SELF  ; 自分自身へ値をコピー
 BTFSC STATUS,ZE  ; 計算結果がゼロかどうかで分岐
 GOTO  NUMisZERO  ; ゼロの場合NUMisZEROへジャンプ(CALLでもいいけど)

 MOVFで自分自身に値をコピーするとSTATUSのゼロフラグ以外変化しないので便利です。
 もちろんWレジスタにコピーしても同じ結果を得られますが、Wレジスタが変化しない方がスッキリまとまることが多いようです。

 てな感じで、PICのアセンブラのリハビリをしています。

#PIC

■当面の課題

桜のライトアップの季節です。花粉症の季節でもあります。
自分は平気ですが、花粉症の部下は死にそうな顔をしています。

編集

■複合検索:

  • 投稿者名:
  • 投稿年月:
  • #タグ:
  • カテゴリ:
  • 出力順序:

■日付検索:

■カレンダー:

2023年5月
123456
78910111213
14151617181920
21222324252627
28293031

■カテゴリ:

■最近の投稿:

最終更新日時:
2024年4月19日(金) 06時10分48秒