SSブログ
English Version

Pic24MC68Kマイコン(その4)PICとMC68Kのインターフェース処理 [68K]

 前回の記事で書いたようにブレッドボード上で MC68K が漸く動くようになったので今回はPCとのインターフェース部分の動作確認について書いてみます。

 基本的には以前 68008でやったことを踏襲しますが、メモリアクセス用のデータバスが16bitになったことで3番目にあった文字出力時の出力データ(CoData)を機能番号(FuncNo)の次に移動して MC68K から1回のアクセスで設定できるように変更しました。
 アセンブラ環境は EASy68 の EDIT68K を使っています。アセンブラが出力するSフォーマットファイルをバイナリ変更後に自作の bin2state ツールで picleソース内に貼れる形式に変換しています。

PICとのインターフェース試験用のMC68K側のhello出力処理(アセンブラ)
000FFC00 Starting Address Assembler used: EASy68K Editor/Assembler v5.16.01 Created On: 2021/12/15 20:53:39 00000000 1 * Hello Test for Pic24MC68K(PIC interface test) 00000000 2 * Ver 0.01 2021/12/14 by skyriver 00000000 3 00000000 4 00000000 =000FFDF0 5 PICWRK EQU $0ffdf0 ; PIC service work area 00000000 =000FFE00 6 PICDMA EQU $0ffe00 ; DMA for PIC 00000000 7 00000000 =0000000D 8 CR EQU 13 00000000 =0000000A 9 LF EQU 10 00000000 10 00000000 11 00000000 =00000000 12 FC_EXIT equ 0 ; EXIT CP/M 00000000 =00000001 13 FC_CONST equ 1 ; CONST 00000000 =00000002 14 FC_CONIN equ 2 ; CONIN 00000000 =00000003 15 FC_CONOUT equ 3 ; CONOUT 00000000 =00000004 16 FC_READ equ 4 ; READ SD Card 00000000 =00000005 17 FC_WRITE equ 5 ; WRITE SD Card 00000000 =00000006 18 FC_PUNCH equ 6 ; PUNCH 00000000 =00000007 19 FC_READER equ 7 ; READER 00000000 20 00000000 21 ; ++++ work area for PIC Interface 00000000 =000FFDF0 22 FuncNo equ PICWRK ; ds 1 : function No 00000000 =000FFDF1 23 CoData equ PICWRK+1 ; ds 1 : conout data 00000000 =000FFDF2 24 RetVal equ PICWRK+2 ; ds 1 : return value 00000000 =000FFDF3 25 SelDk equ PICWRK+3 ; ds 1 00000000 =000FFDF4 26 Track equ PICWRK+4 ; ds 2 00000000 =000FFDF6 27 DmaAdr equ PICWRK+6 ; ds 2 00000000 =000FFDF8 28 Sector equ PICWRK+8 ; ds 1 00000000 29 000FFC00 30 org $0ffc00 000FFC00 31 000FFC00 32 000FFC00 33 000FFC00 2C7C 000FFC20 34 Start: move.l #StartMsg,a6 000FFC06 4241 35 clr d1 000FFC08 121E 36 Loop: move.b (a6)+,d1 000FFC0A 6700 0008 37 beq Exit 000FFC0E 38 000FFC0E 6100 0022 39 bsr Conout 000FFC12 60F4 40 bra Loop 000FFC14 41 000FFC14 13FC 0000 000FFDF0 42 Exit: move.b #FC_EXIT,FuncNo 000FFC1C 4E70 43 reset 000FFC1E 60FE 44 bra * 000FFC20 45 000FFC20 46 000FFC20 47 StartMsg: 000FFC20= 0D 0A 68 65 6C 6C ... 48 dc.b CR,LF,'hello, world',CR,LF,0 000FFC31 49 000FFC31 50 000FFC31 51 ; write to console 000FFC31 52 ; d1.b <- out data(d1.b8-15=0) 000FFC31 53 000FFC32 0041 0300 54 Conout: ori.w #FC_CONOUT*256,d1 000FFC36 33C1 000FFDF0 55 move.w d1,FuncNo 000FFC3C 4E70 56 reset 000FFC3E 4E75 57 rts 000FFC40 58 000FFC40 59 000FFC40 60 end Start No errors detected No warnings generated


 今回の環境では MC68K 自体はビッグエンディアンですがPIC内処理はリトルエンディアンです。更にPICのPMP機能でメモリアクセスする際はビッグエンディアンになり、かつアドレス値は MS68K の 1/2 と言うややこしい状態になっています。

 試験プログラムを実行してみると出力文字列を最後まで出し切らないうちに暴走して HALT してしまう状態でした。
 ロジアナで動作を追ってみると MC68K のメモリ書込み処理(スタックへのリターン値書込み)が最初の内は問題無いのですが時間が経つと上手くいかなくなるようで一文字出力処理からのリターンで予期せぬアドレスに飛んでいるようです。

 今回実施したことを全て書くと雑多なメモになってしまうので主要な確認事項と対策を以下に列挙します。
  1. PIC側PMPのPMWR/信号の設定
     5V系のICに接続するにも関わらず、オープンドレイン設定になっていませんでした^^;
     74HC に対して highレベルが 3V 程度では厳しいです Fig.1
     設定をオープンドレインに変更しました

  2. PMWR/のプルアップ抵抗
     10Kでプルアップしていましたが、ロジアナで観察するとメモリ書込み時にhighレベルに上がりきれない部分が見つかりました Fig.2
     プルアップ抵抗を1Kに変更して動作が良くなりました Fig.3(2.7KではNGでした)

  3. PMPのTimerMの設定
     PMWR/信号幅がが80ns程度で短すぎるので PMP の TimerM の値を1から2に変更しまた
     変更後のPMWR/の信号幅は160ns程度になりました Fig4

 参考に東芝の「LogicIC_ HC_Series Application Note 2021-01-31」から引用した74HCシリーズの入出力電圧の規格を貼っておきます。

Fig.1 74HCシリーズのスレッショルド


 下図で赤丸印の部分が2個のPMWR/信号が結合してしまっている箇所です。

Fig.2 PICのメモリライト(PMWR/のプルアップ10K)[sampling:25MHz]


 PMWR/のプルアップ抵抗を10Kから1Kに変更後のロジアナ波形が下図になります。1Kは小さ過ぎるような気もしますが動作上は問題無くなりました。試しにメモリチップを交換してみましたが状況は変わりませんでした。

Fig.3 PICのメモリライト(PMWR/のプルアップ1K)[sampling:25MHz]


 ライト信号の幅が細すぎてマージンが少ないのでPMPの TimerM の設定を1から2に変更しました。変更後のロジアナ波形が下図で PMWR/ の信号幅がもともとの 80ns から 160ns 程度に増加しました。

Fig.4 PICのメモリライト(TimerMを2に変更後)[sampling:25MHz]


 参考に MC68K が動作中のロジアナ波形も貼っておきます。
 BR/(バスリクエスト)がhighの部分が MC68K が動作している部分で、MC68K はPICへサービス要求(今回の場合1文字出力)を依頼する場合は RESET命令を実行することで RESET/ 信号を一定時間 low にします。
 PIC側は RESET/ 信号を監視していてlowを検出するとバスリクエストして MC68K の要求内容を処理します。

Fig.5 MC68K と PIC の処理実行部のロジアナ波形 [sampling:25MHz]


 最後に今回使用したメモリ試験プログラムと実行結果を貼っておきます。
 末尾でダンプ表示後にある "hello, world" が冒頭で書いた MC68K のプログラムの要求に従って PIC が出力した文字列になります。

PICとのインターフェース試験用のMC68K側のhello出力処理(picle言語)
:l 1:# HelloTest for Pic24MC68K 2:# Ver 0.01 2021/12/15 by skyriver 3: 4:use LibCpm; 5:use LibSpi; 6: 7:var ProgStart,ProgWrk,WrkVal,_WrkVal,_PicDma,WrkTrk; 8:var EscFlg,EscY; 9: 10: 11:proc PicSrv() { 12: var i,fno,rval; 13: 14: while (1) { 15:# while (LATA[-1]&1) {} # wait reset 16: while ((LATA[-1]&3) = 3) {} # wait reset 17: if ( (LATA[-1]&2) = 0 ) { 18: PrnStr_( "\nHALT!" ); 19: break; 20: } 21: PmpOn(); 22: PmpSetAdr(ProgWrk); 23: fno = MemRd(); # dummy 24: WrkVal[0] = MemRd(); 25: WrkVal[1] = MemRd(); 26: fno = _WrkVal[1]; # Func No 27: rval = 0; 28: 29: if (fno=1) { # CONST 30: if (InpChk_()) { 31: rval = $ff; 32: } 33: } 34: else if (fno=2) { # CONIN 35: rval = InpChar_(); 36: } 37: else if (fno=3) { # CONOUT 38: PrnChar_( _WrkVal[0] ); 39: } 40: else if (fno=0) { 41: break; 42: } else { 43: PrnStr_("\nFunc err:"); 44: PrnHexB_( fno ); 45: break; 46: } 47: _WrkVal[3] = rval; 48: PmpSetAdr(ProgWrk+1); 49: MemWr(WrkVal[1]); 50: 51: PmpOff(); 52: BusRelease(); 53: } 54:} 55: 56: 57:proc m( dat ) { 58: MemWr( dat ); 59:} 60: 61: 62:proc main() { 63: init(); 64: initPmp(); 65: initSpi(); 66:# initSd(); 67: 68: ProgStart = $0600; # start addr(68K:0ffc00) 69: ProgWrk = $06f8; # work addr(68K:0ffdf0) 70: _PicDma = $0700; # Dma addr(68K:0ffe00) 512 71: WrkVal = Alloc( 2 ); 72: _WrkVal = WrkVal; 73: WrkTrk = Alloc( 2 ); 74: 75: LATA[-2]=LATA[-2]&$fffc; # on reset:a0 halt:a1 76: 77: PmpOn(); 78: PmpSetAdr(0); 79: MemWr($000f);# stack 80: MemWr($fc00); 81: MemWr($000f); # PC 82: MemWr($fc00); 83: 84: PmpSetAdr(ProgStart); 85: 86: 87: m($2c7c);m($000f);m($fc20);m($4241); 88: m($121e);m($6700);m($0008);m($6100); 89: m($0022);m($60f4);m($13fc);m($0000); 90: m($000f);m($fdf0);m($4e70);m($60fe); 91: m($0d0a);m($6865);m($6c6c);m($6f2c); 92: m($2077);m($6f72);m($6c64);m($0d0a); 93: m($00ff);m($0041);m($0300);m($33c1); 94: m($000f);m($fdf0);m($4e70);m($4e75); 95: 96: dump(0); 97: dump(ProgStart); 98: PmpOff(); 99: BusRelease(); 100: LATA[-2]=LATA[-2]|$3; # off reset:a0, halt:a1 101: 102: PicSrv(); 103: 104: PmpOn(); 105: LATA[-2]=LATA[-2]&$fffc; # on reset:a0 halt:a1 106:} :run 0000 : 000F FC00 000F FC00 54F7 60E9 9559 067D 0008 : 785D 7A3A 0A45 2A5A 901C C2CF FA5F 227E 0010 : A65D AE41 D351 C541 2200 BB54 AAE6 AD19 0018 : 8752 AC47 AA06 8AC5 E771 BF15 CC07 FB11 0020 : 3405 2E1C F05F EDB5 22E5 BE71 0B50 A270 0028 : 28C9 2EB5 E855 2670 AA5F AAFD BA56 AA44 0030 : AA72 A94F 83AC EA41 BADF 4A63 DAB5 8876 0038 : 8644 EFFE A305 D747 095D A316 E875 2A51 0600 : 2C7C 000F FC20 4241 121E 6700 0008 6100 0608 : 0022 60F4 13FC 0000 000F FDF0 4E70 60FE 0610 : 0D0A 6865 6C6C 6F2C 2077 6F72 6C64 0D0A 0618 : 00FF 0041 0300 33C1 000F FDF0 4E70 4E75 0620 : FA64 88C5 2B80 B8C1 F254 4AF5 8877 921C 0628 : AFD1 A4C5 AE45 EA91 8BC5 324F 2347 945D 0630 : 7355 623D AE71 675F 0E1B AC1C 8A99 2B83 0638 : 22C5 F813 DE56 E8D4 A651 F971 8656 BA23 hello, world :



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

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

nice! 0

コメント 0

コメントを書く

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