楽天市場
[無料でホームページを作成] [通報・削除依頼]

PIC_DELAY


拡張ミッドレンジコアのPICでは、インデックスレジスタが強化され、2組となったので、

2組のインデックスレジスタを用いた信号遅延について考察する。

<考え方の基本>
1. RAMの容量と使い易さから511サンプルまでの遅延とする。
RAMは0x2000~0x203Fの64バイトを使用。

2. 遅延の回数はFレジスタで渡す。(以下の例ではDH,DLを使用、1<DH・DL<511 )

3. インデックスレジスタのインクリメント機能を生かすため、時系列のサンプルデータ(0/1)の配列は縦方向に配置する。
  すなわち サンプル時間が順に、 
0x2000のピット0 < 0x203Fのピット0 < 0x2000のピット1 <・・0x203Fのピット7 (最も過去) となるように配置


<プログラム例>

<前提条件>
1.DH・DLに遅延の回数がセットされている。DH・DLの内容は書き換えてもかまわない。
2.サンプル入力はPORTAのビット3、信号出力はPORTAのビット0に設定してある。
3.RAM領域はあらかじめ0でクリアされている。


<遅延前処理>
1.FSR1=0x20XX FSR0=0x2000
2.DH・DLを上位3ビットと下位6ビットに分離,下位6ビットをFSR1Lにセット
3.上位3ビットのデータをもとにREGB(ユーザー定義レジスタ)にビット位置をセット
REGB=B'00000001'/B'00000010'/B'00000100'/B'00001000'/B'00010000'/B'00100000'/B'01000000'/B'10000000'

MOVLW 0x20 ;FSR1=0x20XX
MOVWF FSR1H ;
MOVWF FSR0H ;FSR0=0x2000
CLRF FSR0L ;
LSLF DL,F ;DH・DL=0000000X・ZZYYYYYY
RLF DH,F ;=>00000XZZ・00YYYYYY
LSLF DL,F ;
RLF DH,F ;
LSRF DL,F ;
LSRF DL,W ;
MOVWF FSR1L ;FSR1L=W
INCF DH,F ;HHHH=[0_7]=>[1_8]
CLRF REGB ;REGB=0(初期値)
BSF STATUS,C ;Carry=1
RLF REGB,F ;
DECFSZ DH,F ;DH=DH-1 DH=0?
GOTO $-2 ;


<遅延処理>
1.FSR1で指定されるデータを読みだし、LSB側に1ビットシフト、MSBはゼロ詰め
2.REGBで指定されるビット位置に現在の入力値をセットし、データを書き戻す。
3.FSR1のアドレスインクリメント
4.FSR0で指定される過去のデータを読みだし、ビット0をPORTAに出力
5.FSR0のアドレスインクリメント
6.REGAはユーザー定義レジスタ
7.FSR0/1Lレジスタの6ビット目を常にクリアしているため、アドレスは0x2000~0x203Fの範囲で循環する。

BCF FSR1L,6 ;FSR1<0x2040
MOVIW 0[INDF1] ;W=[FSR1]
MOVWF REGA ;REGA=W
LSRF REGA,W ;REGA=ABCDEFGH => W=0ABCDEFG Carry=H
BTFSC PORTA,3 ;現在の入力=Low?
ADDWF REGB,W ;W=W+REGB
MOVWI INDF1++ ;[FSR1]=W FSR1=FSR1+1
BCF FSR0L,6 ;FSR0<0x2040
MOVIW INDF0++ ;W=[FSR0] FSR0=FSR0+1
MOVWF PORTA ;過去の入力を出力
GOTO $-10 ;無限ループ