■ トピック関連記事
寒くなりました 投稿者:yas 投稿日:2007/12/02(Sun) 01:12 No.700

yamasanお元気ですか? 
先日はpicの件で色々教えていただきありがとうございました
掲示板の借りて初歩的な質問ですみませんが教えてください

以前にテーブルの話が出ましたが
どうしても理解できません
何がどうなるのだか?
例えば・・・

movlw B'00010010' ;
movwf GPIO ; 点灯
movfw ADRESH ; 結果を読み込む(上位バイト)
call convert ; 結果の変換
call delayns ; ADRESH×2[ms]待ち

このconvertの部分でテーブルを参照しています
これが変わることで何が変わるんでしょうか?
すみません適切な質問かどうかも理解していません
よろしくです〜〜

Re: 寒くなりました - yas   2007/12/02(Sun) 01:15 No.701
すみません テーブルの先頭です

;; y=256−32*log_2(256−x) の変換を行うサブルーチン
convert:
clrf PCLATH
bcf PCLATH, 0
bsf PCLATH, 1

movwf PCL
org 0x200
retlw D'0' ; ADRES=0
retlw D'0' ; ADRES=1

これを書かないと何かわかんないですね ^^;
Re: 寒くなりました - yamasan   2007/12/02(Sun) 02:47 No.702
先の最終行の
call delayns ; ADRESH×2[ms]待ち

の delaynsというサブルーチンは、呼ばれたときの wレジスタの値
によって決まる長さのウェイト・ルーチン(時間待ちをしてから帰る)
だと思われます。

------------------------------------------------------------------
なので ADRESH(A/D 変換値の上位 8ビット?)より 256個の表を引いて
その表に書かれている時間待ちをする動作と思われます。
------------------------------------------------------------------

で、以下はその表を引くサブルーチン。PICなので超トリッキー。

;; y=256−32*log_2(256−x) の変換を行うサブルーチン
convert:
clrf PCLATH ; PCLATH b0-b7 = 0 以下の 3行で W を壊さずに PCLATHに 0x02 を入れる
bcf PCLATH, 0 ; PCLATH b0 = 0 不要 ?
bsf PCLATH, 1 ; PCLATH b1 = 1 これで PCLATH = 0x02 (以下の org 0x200 の 上位の0x2xx)

movwf PCL ; これで PCH = 0x02, PCL = w (呼ばれたときの wレジスタの値)の以下へジャンプ
org 0x200 ; 以下は プログラムメモリの 0x0200 から配置される
retlw D'0' ; ADRES = 0 ; w = 0x00 の場合に movwf PCL でここへ ┐
retlw D'0' ; ADRES = 1 ; w = 0x01 の場合に movwf PCL でここへ │256個の表
retlw ??? ; ADRES=255 ; w = 0xff の場合に movwf PCL でここへ ┘
ありがとうございます - yas   2007/12/02(Sun) 11:02 No.703
MPLABのシミュレーターでステップ実行してみました
yamasanの言われるようにちゃんと表を引いてWレジスタに返していました。
もう一つ質問なんですが、テーブルは必ず255個作らないといけないのでしょうか?
それとも1,2,4,8,16,の単位で作れるのでしょうか?
多分 10,20,30と言う単位は無理なんですよね〜
Re: 寒くなりました - yamasan   2007/12/02(Sun) 11:59 No.704
表を引くサブルーチンを呼ぶ側で wの値を制限すれば
1,2,4,8,16,〜 の単位なら簡単に作れます。
たとえば呼ぶ側で

andlw B'00001111' ; w を下位 4ビットに制限
call convert ; 結果の変換

とすればテーブルは 16個でOKです。
先の ADRESHの場合でも以下のようにすれば ADRESHの上位 4ビットによる
16個の表引きで済ませることもできます。

swapf ADRESH, 0 ; ADRESH の上位 4ビットと下位 4ビットを入れ替えて wへ
andlw B'00001111' ; w を下位 4ビットに制限
call convert ; 結果の変換

10,20,30と言う単位はできないことはないのですが、
合理的に wの範囲を制限するのに掛算、割算が必要となると思われます。
あぁ なるほど - yas   2007/12/04(Tue) 00:16 No.705
マスクしたの見たことがあります
そういう意味だったんですね〜 へぇ〜〜
少しずつですが見えてきています
相変わらず基本命令は完全に覚えてないですが・・・
処理 記事No 暗証キー

- Joyful Note -