ロジアナで、波形を確認してみる。
OUTとIN命令を続けて実行すると、以下のようになった。
上が初代パソピア、下がパソピア7
初代パソピアの方は、CSEL2がLowになってから、CWRもしくはCRDがLowになるまで、約230ns程度の遅延がある。
ポーリング中のアルゴリズムを見直した。
RAMPAC_PORT_SET:今までは、CSEL2がLowになるまでポーリングして待っていたが、今回はCWRかCRDがLowになるまでポーリングで待つようにした。
out _SFR_IO_ADDR(PORTA), r25 ; r25の返答値をセット ; clock=1
RAMPAC_SCAN_POLLING:
sbis _SFR_IO_ADDR(PIND), PD4 ; PD4=1(CWR=High)でスキップ ; clock=1/2,3
rjmp RAMPAC_NOT_READ_DATA ; RAMPAC_NOT_READ_DATAへ ; clock=2
sbic _SFR_IO_ADDR(PIND), PD3 ; PD3=0(CRD=Low)でスキップ ; clock=1/2,3
rjmp RAMPAC_SCAN_POLLING ; RAMPAC_SCAN_POLLINGへ ; clock=2
RAMPAC_READ_DATA:
sbic _SFR_IO_ADDR(PIND), PD2 ; PD2=0(CSEL2=Low)でスキップ ; clock=1/2,3
rjmp RAMPAC_SCAN_POLLING ; RAMPAC_SCAN_POLLINGへ戻る ; clock=2
;PD2=0(CSEL2=Low)でPD3=0(CRD=Low)の場合 = PasopiaのIN命令
out _SFR_IO_ADDR(DDRA), r19 ; PA0-PA7 : Output(0xFF) ; clock=1
RAMPAC_WAIT_READ_DATA:
sbis _SFR_IO_ADDR(PIND), PD2 ; PD2=0(CSEL2=High)でスキップ ; clock=1/2,3
rjmp RAMPAC_WAIT_READ_DATA ; RAMPAC_WAIT_READ_DATAへ戻る ; clock=2
; CSEL2=Highになったら、PinAをInputに戻す
out _SFR_IO_ADDR(PORTA), r19 ; PA0-PA7 : Enable pull-up ; clock=1
out _SFR_IO_ADDR(DDRA), r18 ; PA0-PA7 : Input(0x00) ; clock=1
rjmp RAMPAC_SCAN_POLLING ; RAMPAC_SCAN_POLLINGへ戻る ; clock=2
RAMPAC_NOT_READ_DATA:
;PD2=0(CSEL2=Low)でPD4=0(CWR=Low)の場合 = PasopiaのOUT命令
in r23, _SFR_IO_ADDR(PIND) ; clock=1
in r24, _SFR_IO_ADDR(PINA) ; PinAから入力 ; clock=1
andi r23, 0b00011111 ; clock=1
cpi r23, 0b00001011 ; clock=1
breq RAMPAC_PIO_CONTROL ; OUT &H1B -> PIO_CONTROLへ ; clock=1/2
cpi r23, 0b00001000 ; clock=1
breq RAMPAC_SET_LOW_ADDRESS ; OUT &H18 -> SET_LOW_ADDRESSへ ; clock=1/2
cpi r23, 0b00001010 ; clock=1
breq RAMPAC_SET_HIGH_ADDRESS ; OUT &H19 -> SET_HIGH_ADDRESSへ ; clock=1/2
cpi r23, 0b00001001 ; clock=1
breq RAMPAC_WRITE_DATA ; OUT &H1A -> WRITE_DATAへ ; clock=1/2
rjmp RAMPAC_SCAN_POLLING ; clock=2
・・・
IN命令の応答は、前回でもぎりぎりのタイミングだったが、今回ポーリング間隔が広くなってしまったので、応答が間に合うように、ロジックを工夫。
ポーリングに入る前に、PortAの出力値を事前にセットしておき、1clock分を節約するとか。
これで、初代パソピアでも動くようになった。
0 件のコメント:
コメントを投稿