<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
<channel>
	<title><![CDATA[ No.612 - 電装工芸日記 - 舞台照明機器の製作とか - ]]></title>
	<link>https://www.densokogei.jp/tegalog/tegalog.cgi</link>
	<description><![CDATA[ 今年は開発案件を進めたい ]]></description>
	<language>ja</language>
	<copyright>Copyright 2026</copyright>
	<lastBuildDate>Wed, 03 Jun 2026 15:33:11 +0900</lastBuildDate>
	<generator><![CDATA[ <!-- てがろぐ Version: -->Powered by <a href="https://www.nishishi.com/cgi/tegalog/" target="_top">てがろぐ</a> Ver 3.4.0 ]]></generator>
	<!-- BEGIN ENTRIES -->
	<!-- One Entry Data for RSS Feed -->
<item>
	<title><![CDATA[ 　オレメモです。 ]]></title>
	<description><![CDATA[ 　オレメモです。<br />　PICにおいてPORTx,nに対するbit反転方法。<br />　TMR1のコンペアで割り込みしてPORTの出力を反転すればパルスになりますから、差動バイフェーズで重要です。<br /><br /><small class="decorationS"><span class="decorationF deco-code">; PORTAの3bit目だけ反転させる。<br />　MOVLW　00001000B　　; Wレジスタにフィルタ値を定義 3bit目だけ1<br />　XORWF　PORTA,SELF　 ; PORTAの3bit目だけを反転<br />　※ 書式はXC8のPIC-as</span></small><br /><br />　データシート読むとPORTxではなくLATxに対して計算を当てるのがいいらしいのですが、ここではわかりやすさのためにあえてPORT相手です。<br /><br />　XORの計算は次の通り。<br /><small class="decorationS"><span class="decorationF deco-code">0 xor 0 = 0<br />0 xor 1 = 1<br />1 xor 0 = 1<br />1 xor 1 = 0</span></small><br />　PIC16系にはbit単位の反転命令がありませんので、反転させたいbitだけ１にしたフィルタ値をXORで当てます。<br />　左の値をPORTの現在値、右の値をフィルタ値とすると、２行目と４行目が反転になり、１行目と３行目は非反転になります。<br /><br />　論理演算の基本ちゃ基本ですが、案外忘れてしまうのでメモメモ。<br /><br />　アセンブラに限らずですが、出来るだけ簡単な計算で条件分岐を行うことが大事です。<br />　例えば処理を10回繰り返すとして、0から加算してカウンタが10になったことを判断するより、10から減算して0になったことを判断する方が好みです。PICのアセンブラの分岐処理は計算結果が0かで扱うのが自然だからです。<br /><small class="decorationS"><span class="decorationF deco-code">; 10回繰り返す<br />　MOVLW　10　　　　　　; COUNTに10を設定する<br />　MOVWF　COUNT　　　　 ;<br />LOOP&#58;<br />　～ 10回繰り返す処理をここに書く ～<br />　DECFSZ　COUNT,SELF　 ; COUNTをデクリメント(-1)し、結果が0なら次行の処理を飛ばす<br />　GOTO　LOOP　　　　　 ; LOOPを繰り返す<br />　～ 繰り返しの後の処理をここに書く ～<br /></span></small><br />　DECFSZはDECFとBTFSSを組み合わせたマクロ命令みたいなものです。<br /><br />　少し蛇足ですが、レジスタの現在値が0であるかを見るには、<br /><small class="decorationS"><span class="decorationF deco-code">; レジスタNUMの値は0か？<br />　MOVF　 NUM,SELF　　; 自分自身へ値をコピー<br />　BTFSC　STATUS,ZE　 ; 計算結果がゼロかどうかで分岐<br />　GOTO　 NUMisZERO　 ; ゼロの場合NUMisZEROへジャンプ(CALLでもいいけど)<br /></span></small><br />　MOVFで自分自身に値をコピーするとSTATUSのゼロフラグ以外変化しないので便利です。<br />　もちろんWレジスタにコピーしても同じ結果を得られますが、Wレジスタが変化しない方がスッキリまとまることが多いようです。<br /><br />　てな感じで、PICのアセンブラのリハビリをしています。<br /><br /><a href="https&#58;//www.densokogei.jp/tegalog/tegalog.cgi?tag=%50%49%43" class="taglink" title="PIC">#PIC</a> -- Posted by 電装工芸 〔1194文字〕 ]]></description>
	<link>https://www.densokogei.jp/tegalog/tegalog.cgi?postid=612</link>
	<guid>https://www.densokogei.jp/tegalog/tegalog.cgi?postid=612</guid>
	<category>tegalog</category>
	<pubDate>Wed, 24 May 2023 17:36:41 +0900</pubDate>
</item>

	<!-- END ENTRIES -->
</channel>
</rss>

