§7.PICプログラミングMANIACS2(PICプログラミングの高度なテクを満載)99/4/17

 

しまったな〜。

 

前回の記事を書いて、その週に発売されたトラ技(トランジスタ技術)が、PIC特集だった。しかも、内容、相当重複してるし、これから書こうと思っていたことも書かれてるし、自分でテキトーに書いてた部分も正確に書いてあるし、もー参ったなぁ(笑) しばらく、落ちこんでました(笑)

まあ、気をとりなおして、続きを書きます。どうも、PICでも主に使うのはミッドレンジで、そいつらはたいてい、16F84とコンパチなのですが、こいつら、演算機能とかが弱く、16ビット演算なんかすることになった日にゃあ...。

それなのに、そのへんを詳しく書いている記事が無い!少なくとも、インターネット上の日本語サイトには存在しないんではないでしょうか。そんなわけで、演算がらみを少しずつ紹介して行きたいと思います。


☆ 疑似16ビットレジスタのデクリメントについて

予め上位レジスタをデクリメントしておけば、

   decf   iL,f
   decf   iH,f
   incfsz  iL,w   // iL==0xff?
   incf   iH,f

同じ5waitで、ジャンプ用のラベルが不要という指摘を賜りました。うーん。やるなぁ。

なら、こんなんどう?

// もしくは
   movlw  D'255'
   addwf  iL,f
   btfcc status,c   // 255を加算して(-1の意味)ノンキャリーなら、その前は0であった
   decf  iH,f      // と言うことだから、iHをデクリメントする

うーん。こんなプログラム組んでる奴は、変態かも知れない。(笑)


☆ 16ビットレジスタ加算

// ix+=iy

   movf iyL,w
   addwf ixL,f
   movf iyH,w
   btfsc status,c
   addlw 1
   addwf ixH,f

うーん。こういうのマクロ定義しとかないとやってらんないと言う話もある。


☆ 8ビットファイルレジスタの符号反転

// s -= s

  clrw
  subwf s,f

// しかし以下のようにすればwを破壊せずに済む

  comf s,f  ; s = ~s 1の補数
  incf s,f   ; 1の補数+1=2の補数=もとの数の符号が逆のもの

うーん。こういうのあまり知られてないのかな?


☆ 8ビットレジスタからwの減算

どうも、PICはsubが使いにくくて困ってしまいますが...

// s = s - w

  subwf s,f // s = w - s
  comf s,f // s = -s
  incf s,f

要するに、subでw−sは作れるわけで、その符号を先ほどのテクで反転させることで、s=s−wを実現してるわけですね。


☆ 8ビットシフト

// s >>= 1

  rrf  s,f
  bcf s,7

// s <<= 1

  rlf s,f
  bcf s,0

当たり前と言えば当たり前なんだけど、bcfで最上位をクリアしたりせにゃならんあたり、悲壮感が滲み出ている。(笑)


☆ 16ビット右シフト

// i >>= 1

  rrf  iH,f
  rrf  iL,f
  bcf iH,7

// i <<= 1

  rlf  iL,f
  rlf  iH,f
  bcf  iL,0

なんかダサイような気が...


☆ ポインタ操作

前回言い忘れていましたが、FSRとINDRレジスタを利用して、ファイルレジスタの任意の場所のメモリを読み書きすることが可能です。

データシートにも載っていますが、こんなところ普通読み飛ばす(笑)もんで、知らない人も多いでしょう。

よって、配列等は、ファイルレジスタ上の空きにリニアに確保して、こいつを使ってアクセスすれば実現できます。constな配列(読み出し専用)であれば、前回に紹介した、retlwでテーブル化すれば、プログラムメモリに配置できるので、やねうらおの給料のごとき、少ないファイルレジスタを圧迫せずに済みます。(なんのこっちゃ)


戻る