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
マスクしたの見たことがあります
そういう意味だったんですね〜 へぇ〜〜
少しずつですが見えてきています
相変わらず基本命令は完全に覚えてないですが・・・