SSブログ
English Version

Pic24MC68Kマイコン(その3)68Kからのメモリアクセス [68K]

 前回の記事で書いたようにPICからのメモリアクセス動作は問題無いようなのですが、MC68K がうまく動かない状態だったので調べてみた結果等を書いてみます。

 始めに評価環境についてですが、下の写真はブレッドボードで評価中の MC68K で1枚のブレッドボードの大半を占有していて幅広なので配線を挿す場所が上下ともに1列しかないのでロジアナが繋ぎ辛いですw
 前回の記事でも書いた 元の刻印(だと思いたい)を消さずに16MHzにクロックアップした型名を刻印している主張の強いまがい品を使っていますが、後述のように少なくとも 8MHz では動くようです。

ブレッドボード上の MC68K


★追記 2021/12/22 {
 16MHz で動かしてみた際のロジアナ画面が下図になります。
 もしかしたら選別品で16Mhzでも動作するのでは?・・という一縷の望みを持っていましたが世の中そう甘くはありませんでした。16MHzでは謎の動作をしてだんまり後、HALTしました。

偽16MHz版 MC68HC000 の16MHz動作試験結果
}

 話を MC68K からのメモリアクセス確認に戻します。
 PIC からのアドレス線は下図のように A10 が最上位アドレスで オープンドレイン出力し、+5V でプルアップしています。
 更に A11 ~ A18 を 抵抗を介して A10 に接続しています。こうすることで MC68K がリセット後にアクセスする0番からのスタックとPCの初期値及びCP/M-68KのBIOSで使用予定の PIC と MC68K のパラメータ渡し用の実装メモリ末尾の領域を PIC 側からアクセス可能にしています。
実装しているメモリチップは 512K x 16bit なのでアドレス線は A0 - A18 の19本あります。

PIC側のアドレス生成回路


 メモリ上に設定するPCの初期値をPIC側の 0400H に相当する 07F40H に設定して動かしてみましたが MC68K が暴走する状態でした(MC68Kへの供給クロックは 8MHz)。
 そこでメモリ後半への切り替えを考えなくてもいいように PC初期値を 0008H にしてプログラムコードを 0008H 以降に設定した上で実行状態をロジアナで観察すると 0003H の PC の下位ワードを読込んだ後に、そのまま 0004H から実行しているようなので PCの初期値を 0010H に変更することでうまく動きました。
 MC68K から出ているアドレス線は A1 - A22 でA0が無く、A0の情報は上位/下位バイトを指定する LB#/UB# に置き換わっているのです。つまり MC68K のアドレスは バイト単位で振られているということです。
 PIC側は ワード(2バイト)単位でアドレスが振られるのでPIC側のアドレスを2倍すると MC68K のアドレスに対応するようになるということです。

 従って、PIC側と MC68K 側とのメモリアドレスの対応は下表のようになります。

PICMC68K
 0000 - 03FF  000000 - 0007FF 
 0400 - 07FF  0FF800 - 0FFFFF 


 開始アドレスを 0010H にした場合のロジアナ波形を貼っておきます。

00000010Hから開始した際の全体波形(サンプリング:25MHz)


 HALT/信号が highレベルになっている箇所が MC68Kが動作している部分で、拡大したものが下図になります。RESET/がlowレベルになっている部分は MC68K が RESET 命令を実行したことにより発生したものです(立ち上がり部分が画面に入っていませんが lowの時間は15.64us)

MC68K動作部の拡大波形(サンプリング:25MHz)


 実行した試験プログラムと実行結果は下記の通りで、最後の方にある実行後のメモリダンプを見ると 0010H が MC68Kにより想定通り 1234H に書き換えられていることが判ります。

MC68Kが0010H開始アドレスの試験プログラムと実行結果(picle言語)
:l 1:# Pic24MC68K memory write test Ver 0.01 2021/12/12 2:# ver 0.01 by skyriver 3: 4:use LibCpm; 5:use LibSpi; 6: 7:var ProgWrk,_WrkVal,_PicDma,SdSec; 8:var EscFlg,EscY; 9: 10: 11: 12:proc main() { 13: var adr,dat,i; 14: init(); 15: initPmp(); 16: initSpi(); 17:# initSd(); 18: 19: PrnStr_( "init done\n" ); 20: 21: LATA[-2]=LATA[-2]&$fffc; # on reset:a0 halt:a1 ProgWrk=$fdf0; 22: _WrkVal=Alloc(5); 23: SdSec=_WrkVal+2; # long SdSectorNo 24: _PicDma=$fe00; 25: 26: PmpOn(); 27: 28: PrnStr_( "Pmp on\n" ); 29: 30: PmpSetAdr(0); 31: MemWr($0008); # stack 32: MemWr($0000); 33: 34:# MemWr($0007); # PC 35:# MemWr($fc00); 36: MemWr($0000); # PC 37:# MemWr($0008); 38: MemWr($0010); 39: 40:# PmpSetAdr($10); 41:# dat = 1; 42:# for ( i = 0; i < 16; i = i + 1 ) { 43:# MemWr( dat ); 44:# dat = dat * 2; 45:# } 46: 47:# adr = $0400; # 68K's ADR:000ff800 48: adr = $0008; # 68K's ADR:00000010 49: 50: PmpSetAdr(adr); 51: MemWr($303c); # move #$1234,d0 52: MemWr($1234); 53: 54:# MemWr($33c0); # move.w d0,$0007fc08 55:# MemWr($0007); 56:# MemWr($fc08); 57: 58: MemWr($33c0); # move.w d0,$00000020 59: MemWr($0000); 60: MemWr($0020); 61: 62: 63: MemWr($4e70); # reset 64: MemWr($60fe); # bra * 65: 66: MemWr($ffff); 67: MemWr($ffff); # change 1234 by 68K 68: MemWr($ffff); 69: 70: Rdump( 0 ); 71:# Rdump( adr ); 72: 73: PmpOff(); 74: BusRelease(); 75: LATA[-2]=LATA[-2]|$3; # off reset:a0, halt:a1 76: 77: Timer_=4; 78: while (Timer_) {} # 40ms wait 79: 80: LATA[-2]=LATA[-2]&$fffc; # on reset:a0 halt:a1 81: PrnStr_( "\n-------" ); 82: Rdump(adr); 83:} :run init done Pmp on 0000 : 0008 0000 0000 0010 BA79 B355 EB6D 8F50 0008 : 303C 1234 33C0 0000 0020 4E70 60FE FFFF 0010 : FFFF FFFF C934 BFE5 8B45 985C A095 5A35 0018 : 5C97 A861 2E5D 885D E669 9B14 B655 6EB5 0020 : 8857 2E77 8C40 6A15 3A9B 29D4 BE84 6A0C 0028 : A167 8257 B633 2D50 66D7 3311 2A47 1B42 0030 : EE08 3B59 6E5D A125 AA15 886A 0DF0 EBE5 0038 : 6D51 A214 6B71 B23D AAB9 BFC5 9E94 841D ------- 0008 : 303C 1234 33C0 0000 0020 4E70 60FE FFFF 0010 : 1234 FFFF C934 BFE5 8B45 985C A095 5A35 0018 : 5C97 A861 2E5D 885D E669 9B14 B655 6EB5 0020 : 8857 2E77 8C40 6A15 3A9B 29D4 BE84 6A0C 0028 : A167 8257 B633 2D50 66D7 3311 2A47 1B42 0030 : EE08 3B59 6E5D A125 AA15 886A 0DF0 EBE5 0038 : 6D51 A214 6B71 B23D AAB9 BFC5 9E94 841D 0040 : 9A17 72E0 4E4C 2294 CE44 BAF9 AD42 8CD9 :


 メモリ前半での動作が上手くいったので、最初にやりたかったメモリ後半での MC68K のメモリライト試験を行った際のロジアナ波形と操作ログを貼っておきます。
 こちらも結果は想定通りで、okでした。

000ff800Hから開始した際の全体波形(サンプリング:25MHz)


MC68Kが0010H開始アドレスの試験プログラムと実行結果(picle言語)
:l 1:# Pic24MC68K memory write test Ver 0.01 2021/12/12 2:# ver 0.01 by skyriver 3: 4:use LibCpm; 5:use LibSpi; 6: 7:var ProgWrk,_WrkVal,_PicDma,SdSec; 8:var EscFlg,EscY; 9: 10: 11: 12:proc main() { 13: var adr,dat,i; 14: init(); 15: initPmp(); 16: initSpi(); 17:# initSd(); 18: 19: PrnStr_( "init done\n" ); 20: 21: LATA[-2]=LATA[-2]&$fffc; # on reset:a0 halt:a1 ProgWrk=$fdf0; 22: _WrkVal=Alloc(5); 23: SdSec=_WrkVal+2; # long SdSectorNo 24: _PicDma=$fe00; 25: 26: PmpOn(); 27: 28: PrnStr_( "Pmp on\n" ); 29: 30: PmpSetAdr(0); 31: MemWr($0010); # stack 32: MemWr($0000); 33: 34: MemWr($000f); # PC 35: MemWr($f800); 36:# MemWr($0000); # PC 37:# MemWr($0010); 38: 39:# PmpSetAdr($10); 40:# dat = 1; 41:# for ( i = 0; i < 16; i = i + 1 ) { 42:# MemWr( dat ); 43:# dat = dat * 2; 44:# } 45: 46: adr = $0400; # 68K's ADR:000ff800 47:# adr = $0008; # 68K's ADR:00000010 48: 49: PmpSetAdr(adr); 50: MemWr($303c); # move #$1234,d0 51: MemWr($1234); 52: 53: MemWr($33c0); # move.w d0,$000ff810 54: MemWr($000f); 55: MemWr($f810); 56: 57:# MemWr($33c0); # move.w d0,$00000020 58:# MemWr($0000); 59:# MemWr($0020); 60: 61: 62: MemWr($4e70); # reset 63: MemWr($60fe); # bra * 64: 65: MemWr($ffff); 66: MemWr($ffff); # change 1234 by 68K 67: MemWr($ffff); 68: 69: Rdump( 0 ); 70: Rdump( adr ); 71: 72: PmpOff(); 73: BusRelease(); 74: LATA[-2]=LATA[-2]|$3; # off reset:a0, halt:a1 75: 76: Timer_=4; 77: while (Timer_) {} # 40ms wait 78: 79: LATA[-2]=LATA[-2]&$fffc; # on reset:a0 halt:a1 80: PrnStr_( "\n-------" ); 81: Rdump(adr); 82:} :run init done Pmp on 0000 : 0010 0000 000F F800 BA79 B355 EB6D 8F50 0008 : 303C 1234 33C0 0000 0020 4E70 60FE FFFF 0010 : 1234 FFFF C934 BFE5 8B45 985C A095 5A35 0018 : 5C97 A861 2E5D 885D E669 9B14 B655 6EB5 0020 : 8857 2E77 8C40 6A15 3A9B 29D4 BE84 6A0C 0028 : A167 8257 B633 2D50 66D7 3311 2A47 1B42 0030 : EE08 3B59 6E5D A125 AA15 886A 0DF0 EBE5 0038 : 6D51 A214 6B71 B23D AAB9 BFC5 9E94 841D 0400 : 303C 1234 33C0 000F F810 4E70 60FE FFFF 0408 : FFFF FFFF 2F14 CDDE FA55 A273 9513 26CD 0410 : B850 A327 C277 BB10 2205 6A15 A249 EA34 0418 : A81D ABD5 9AFB 6A65 A651 D914 A2F6 F965 0420 : 6904 B85F 1901 2B41 0B9D 8A74 EA45 EC57 0428 : 2D5F 1A59 E250 2885 2324 AB10 6F11 D0D3 0430 : 2259 2381 8ED7 F2F9 A273 7C97 2870 2B1D 0438 : A252 E285 9975 0370 FE5D A8D4 B3C6 A315 ------- 0400 : 303C 1234 33C0 000F F810 4E70 60FE FFFF 0408 : 1234 FFFF 2F14 CDDE FA55 A273 9513 26CD 0410 : B850 A327 C277 BB10 2205 6A15 A249 EA34 0418 : A81D ABD5 9AFB 6A65 A651 D914 A2F6 F965 0420 : 6904 B85F 1901 2B41 0B9D 8A74 EA45 EC57 0428 : 2D5F 1A59 E250 2885 2324 AB10 6F11 D0D3 0430 : 2259 2381 8ED7 F2F9 A273 7C97 2870 2B1D 0438 : A252 E285 9975 0370 FE5D A8D4 B3C6 A315 :


 次回はいよいよ PIC と MC68K とのインターフェース処理の動作確認ですね。


[TOP] [ 前へ ] 連載記事 [ 次へ ]



nice!(0)  コメント(0) 
共通テーマ:趣味・カルチャー

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。