SSブログ
English Version

Pic24MC68Kマイコン(その6)プリント基板で動作OK [68K]

 前回の記事から時間が経ってしまいましたが、元旦に製造依頼したプリント基板はとっくに届いているので部品を実装してみました。

 ブレッドボードで確認した回路なのでいつものようにすぐ動くと思っていましたが今回は PIC24 の OneBitLoader すらまともに動かず、原因調査&対処して無事動くようになりましたので調査内容や対処などについてメモとして記録しておきたいと思います。

 最初に Pickit で PIC24 に OneBitLoader を書き込んで起動してみました。
通常であれば"Welcome" メッセージを表示後に、押されたキーを表示するのですが、下図のように文字化けが酷い状態でした。

OneBitLoader 起動時の文字化けの様子


 文字化けの状態は安定せず、変化するようなのですが、'1'(0x31)の入力が'q'(0x71)に化けたりするのでシリアル通信のクロックが少しずれているようです。
 原因が USB/シリアルI/Fの PL2303 と PIC のどちらなのか切り分けるためにまずは PIC のシリアル受信と送信部の信号を確認しました。
 下図が PIC 側の受信信号例ですが、マーカー間が3bit分で 37.86(=12.62 x 3)Kbpsで通信速度は 38400bps なので許容範囲内です。信号自体もエッジの鈍り等は無く問題無いようです。

PIC 受信時のシリアル波形例(0x31受信時)


 下図が PIC の送信信号波形例でマーカー部の 1bit 分が 41.29KHz で設定値(38400bps)より結構高めの値です。これで PIC 側が問題の原因であることが判明しました。

PIC 送信時のシリアル波形例


 念のためにロジアナでも確認しましたが、受信側はokですが、送信側はバケバケでした。

PIC 送受信のロジアナ波形例


 問題個所が特定できたので PIC24 を交換する必要がありますが、ヒートガンでは近くの SDコネクタなどが影響を受けそうだったので、PIC のピンを切断してからピンを半田ごてで取り外しました。
 しかし、PIC を外す時に 43 番ピンのパターンが逝ってしまいましたorz
 このピンは D05(データバス)で接続先は基板の淵の方にあり距離があるので、直ぐ近くのスルホール部のレジストを剥がし、そこに半田付けするという難易度C? の技を試みてみましたw(クリックで拡大写真になります)

PIC43 番ピンのジャンパー接続


 ジャンパー部はアルコール洗浄後に保護のためにホットボンドで固めました。PIC を交換した結果、PIC で OneBitLoader が動き、自作の picleコンパイラ環境も問題無く導入できて、68K の動作試験プログラムである Hello 表示もできました(^^)/
 勿論、前回の記事で書いたS-record ローダーも動きました。

 更にうれしいことに、蟻さんから 5個組で買った MC68HC000P16 が最近届いたのですが、今回はいろんなものが混在していて、アルコールで拭くと P8(8MHzバージョン)に変身するものもありましたが、なんと 16MHz で動くものを1個見つけました(^^)/

 動作するようになった状態での写真等を貼っておきます。下の写真は 68K を実装前の TOP面です。

Pic24MC68K トップ面(MC68K実装前)


 次にボトム面です。

Pic24MC68K ボトム面


 MC68K 実装後は下の写真のようになります。アルコールで拭いて刻印が薄くなっているので刻印が見えるように斜めからストロボを当てています。

Pic24MC68K トップ面


 下の写真はUSBケーブルを接続して動作確認をしている様子で今までのブレッドボードよりはるかにコンパクトになっています。

動作試験中のPic24MC68K


 最後にreset直後から、68K の動作確認試験である "Hello" 表示のプログラムを実行した際のログを貼っておきます。68K は 16MHz で動作しています。あれ picle の起動メッセージが86のままになっていますねw

68K 試験のHello表示の実行状況
picle compiler CP/M-86 Ver0.01 2019/07/03 by skyriver :¥¥ +B000-B739 # HelloTest for Pic24MC68K +C000-CB3E #LibCpm for Pic24MC68K v0.01 2021/12/09 +D000-DEE9 #LibSpi SPI lib for Pic24MC68K V0.01 2021/12/07 :¥< 1849 :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 28E3 8967 82B6 7F5C 0008 : 68B7 8A57 EA55 06B1 F27D 6BCF 80B5 DAD7 0010 : 3A78 3231 9CCF A855 BA59 B691 AA53 AF21 0018 : 873C 2E44 0FD9 A045 AE4F FC04 4E7D AA34 0020 : 0155 D367 AFEF 4D31 A8E2 EA74 6EB5 9BB4 0028 : 8A29 C311 2FF5 AAF7 CAE6 AB34 AC09 A5C4 0030 : AED4 6E5C BA56 EB0C 1F5D 04BB F377 6A5F 0038 : 1B5F 2463 785F E65C 0E11 BAFB BE9C 9ADE 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 : 5303 51CA FFF4 2044 6100 0022 10C0 51CB 0628 : FFF8 60B2 6100 0034 B03C 0039 6E00 0008 0630 : 0400 0030 4E75 0400 0037 4E75 61E6 2200 0638 : E909 61E0 8041 4E75 6100 0010 B03C 000D hello, world :



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


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

Pic24MC68Kマイコン(その5)S-record ローダーの制作 [68K]

 前回の記事で書いたように PIC と MC68K のインターフェース動作が確認できたので MC68K 側のメモリにプログラムをダウンロードするためのモトローラ S-record フォーマットファイルのダウンローダーを準備します。

 今回は「3チップ構成68Kマイコンの構想(その3)Sレコード簡易ローダーの製作」の記事で書いた、以前 68008 環境で行ったことを 68000 環境に合わせて変更するだけなので既にある道を歩いているようなものです。

 まずは MC68K 側のプログラムですが、PIC とのインターフェース部分等を若干変更しました。アセンブル環境は EASy68K を使っています。

S-record ローダーの MC68K側プログラム(アセンブラ)
000FFC00 Starting Address Assembler used: EASy68K Editor/Assembler v5.16.01 Created On: 2021/12/17 19:05:20 00000000 1 ************************************** 00000000 2 * S-record loader for Pic24MC68K 00000000 3 * ver 0.01 2021/12/17 by skyriver 00000000 4 ************************************** 00000000 5 00000000 6 00000000 =000FFDF0 7 PICWRK EQU $0ffdf0 ; PIC service work area 00000000 =000FFE00 8 PICDMA EQU $0ffe00 ; DMA for PIC 00000000 9 00000000 =00000000 10 FC_EXIT equ 0 * EXIT CP/M 00000000 =00000001 11 FC_CONST equ 1 * CONST 00000000 =00000002 12 FC_CONIN equ 2 * CONIN 00000000 =00000003 13 FC_CONOUT equ 3 * CONOUT 00000000 =00000004 14 FC_READ equ 4 * READ SD Card 00000000 =00000005 15 FC_WRITE equ 5 * WRITE SD Card 00000000 =00000006 16 FC_PUNCH equ 6 * PUNCH 00000000 =00000007 17 FC_READER equ 7 * READER 00000000 18 00000000 19 * ++++ work area for PIC Interface 00000000 =000FFDF0 20 FuncNo equ PICWRK ; ds 1 : function No 00000000 =000FFDF1 21 CoData equ PICWRK+1 ; ds 1 : conout data 00000000 =000FFDF2 22 RetVal equ PICWRK+2 ; ds 1 : return value 00000000 =000FFDF3 23 SelDk equ PICWRK+3 ; ds 1 00000000 =000FFDF4 24 Track equ PICWRK+4 ; ds 2 00000000 =000FFDF6 25 DmaAdr equ PICWRK+6 ; ds 2 00000000 =000FFDF8 26 Sector equ PICWRK+8 ; ds 1 00000000 27 00000000 28 000FFC00 29 org $0ffc00 000FFC00 30 000FFC00 227C 000FFDF0 31 start: move.l #PICWRK,a1 000FFC06 6100 0082 32 loop: bsr conin 000FFC0A B03C 0053 33 cmp.b #'S',d0 000FFC0E 66F6 34 bne loop 000FFC10 35 000FFC10 6100 0078 36 bsr conin 000FFC14 3200 37 move d0,d1 000FFC16 0400 0030 38 sub.b #'0',d0 000FFC1A 67EA 39 beq loop * if type 0 000FFC1C B03C 0004 40 cmp.b #4,d0 000FFC20 6C00 0056 41 bge exit 000FFC24 42 000FFC24 6100 0072 43 bsr conout 000FFC28 4242 44 clr d2 000FFC2A 1400 45 move.b d0,d2 * save type to d2 000FFC2C 6100 003E 46 bsr Hex2 * get length 000FFC30 4243 47 clr d3 000FFC32 1600 48 move.b d0,d3 * save counter 000FFC34 5503 49 sub.b #2,d3 * dec for sum 000FFC36 4284 50 clr.l d4 000FFC38 51 000FFC38 6100 0032 52 getadr: bsr Hex2 000FFC3C E18C 53 lsl.l #8,d4 000FFC3E 8800 54 or.b d0,d4 000FFC40 5303 55 sub.b #1,d3 000FFC42 51CA FFF4 56 dbf d2,getadr 000FFC46 57 000FFC46 2044 58 move.l d4,a0 000FFC48 6100 0022 59 getdat: bsr hex2 000FFC4C 10C0 60 move.b d0,(a0)+ 000FFC4E 51CB FFF8 61 dbf d3,getdat 000FFC52 60B2 62 bra loop 000FFC54 63 000FFC54 64 000FFC54 65 * input hex 1chara 000FFC54 66 * d0.b -> data 000FFC54 6100 0034 67 Hex1: bsr conin 000FFC58 B03C 0039 68 cmp.b #'9',d0 000FFC5C 6E00 0008 69 bgt Hex1_1 000FFC60 0400 0030 70 sub.b #'0',d0 000FFC64 4E75 71 rts 000FFC66 0400 0037 72 Hex1_1: sub.b #$37,d0 000FFC6A 4E75 73 rts 000FFC6C 74 000FFC6C 75 000FFC6C 76 * input hex 1byte(2chara) 000FFC6C 77 * d0.b -> data 000FFC6C 61E6 78 Hex2: bsr Hex1 000FFC6E 2200 79 move.l d0,d1 000FFC70 E909 80 lsl.b #4,d1 000FFC72 61E0 81 bsr Hex1 000FFC74 8041 82 or d1,d0 000FFC76 4E75 83 rts 000FFC78 84 000FFC78 85 000FFC78 6100 0010 86 exit: bsr conin 000FFC7C B03C 000D 87 cmp.b #13,d0 * check line end 000FFC80 66F6 88 bne exit 000FFC82 12BC 0000 89 move.b #FC_EXIT,(a1) 000FFC86 4E70 90 reset 000FFC88 60FE 91 bra * 000FFC8A 92 000FFC8A 93 000FFC8A 94 * console in 000FFC8A 95 * d0.w -> data 000FFC8A 12BC 0002 96 conin: move.b #FC_CONIN,(a1) 000FFC8E 4240 97 clr d0 000FFC90 4E70 98 reset 000FFC92 1029 0002 99 move.b (RetVal-PICWRK)(a1),d0 000FFC96 4E75 100 rts 000FFC98 101 000FFC98 102 000FFC98 103 * console out 000FFC98 104 * d1.b <- data 000FFC98 105 * 000FFC98 0041 0300 106 conout: ori.w #FC_CONOUT*256,d1 000FFC9C 3281 107 move.w d1,(a1) 000FFC9E 4E70 108 reset 000FFCA0 4E75 109 rts 000FFCA2 110 000FFCA2 111 end start No errors detected No warnings generated


 試験用のダウンロード対象のデータは次のような簡略なものにしました。実行コードではないので冒頭の"start"ラベルは不要なのですが、END ステートメントの後にラベルを書かないと warning が表示されるのでその回避用です。

S-record ローダーの試験用データ(アセンブラ)
00000200 Starting Address Assembler used: EASy68K Editor/Assembler v5.16.01 Created On: 2021/12/17 19:05:10 00000000 1 *************************************** 00000000 2 * sample data to test S-record loader 00000000 3 * Ver 0.01 2021/12/17 by skyriver 00000000 4 *************************************** 00000000 5 00000000 =00000200 6 ADRS EQU $000200 00000000 7 00000000 8 00000200 9 org ADRS 00000200 10 00000200= 00 01 02 03 04 05 ... 11 start: dc.b 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 00000210= 30 31 32 33 34 35 ... 12 dc.b '0123456789ABCDEF' 00000220= 0123 1234 2345 3... 13 dc.w $0123,$1234,$2345,$3456,$4567,$5678,$6789,$789A 00000230= 0000 0000 0000 0... 14 dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 00000250 15 00000250 16 end start No errors detected No warnings generated


 アセンブルした結果、出力された S-record ファイルの内容が下記になります。

アセンブルして出力された S-record データ
S021000036384B50524F47202020323043524541544544204259204541535936384B6D
S1230200000102030405060708090A0B0C0D0E0F30313233343536373839414243444546C0
S12302200123123423453456456756786789789A00000000000000000000000000000000E2
S113024000000000000000000000000000000000AA
S804000200F9


 PIC 側のプログラムと実行結果が下記になります。PIC 側のプログラムには上記の MC68K のプログラムのアセンブル結果内容を変換して貼り付けています。プログラム起動後Teratermで S-record ファイルの内容をコピペ操作をしています。S-record ローダーは1レコード毎にレコードタイプを出力するようにしています(末尾の"111"部分)。

S-record ローダーのプログラムリストと実行結果(picle言語)
:l 1:# S-record loader for Pic24MC68K 2:# Ver 0.01 2021/12/17 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: m($227c);m($000f);m($fdf0);m($6100); 87: m($0082);m($b03c);m($0053);m($66f6); 88: m($6100);m($0078);m($3200);m($0400); 89: m($0030);m($67ea);m($b03c);m($0004); 90: m($6c00);m($0056);m($6100);m($0072); 91: m($4242);m($1400);m($6100);m($003e); 92: m($4243);m($1600);m($5503);m($4284); 93: m($6100);m($0032);m($e18c);m($8800); 94: m($5303);m($51ca);m($fff4);m($2044); 95: m($6100);m($0022);m($10c0);m($51cb); 96: m($fff8);m($60b2);m($6100);m($0034); 97: m($b03c);m($0039);m($6e00);m($0008); 98: m($0400);m($0030);m($4e75);m($0400); 99: m($0037);m($4e75);m($61e6);m($2200); 100: m($e909);m($61e0);m($8041);m($4e75); 101: m($6100);m($0010);m($b03c);m($000d); 102: m($66f6);m($12bc);m($0000);m($4e70); 103: m($60fe);m($12bc);m($0002);m($4240); 104: m($4e70);m($1029);m($0002);m($4e75); 105: m($0041);m($0300);m($3281);m($4e70); 106: m($4e75); 107: 108: PrnStr_( "\n S-record loader start\n" ); 109: 110: PmpOff(); 111: BusRelease(); 112: LATA[-2]=LATA[-2]|$3; # off reset:a0, halt:a1 113: 114: PicSrv(); 115: 116: PmpOn(); 117: LATA[-2]=LATA[-2]&$fffc; # on reset:a0 halt:a1 118:} :run S-record loader start 111 :


 問題無くダウンロードされているか簡易的に作ったメモリダンププログラムでメモリの内容を確かめてみます。PIC 側のメモリアドレスは MC68K の 1/2 なので、0x0100 からダンプすれば確かめられるはずです。
 末尾のダンプリストを見ると問題無くダウンロードされているみたいですね。

簡易メモリダンププログラムでダウンロード結果の確認(picle言語)
:l 1:# memori dump for Pic24MC68K 2:# Ver 0.01 2021/12/17 by skyriver 3: 4:use LibCpm; 5:use LibSpi; 6: 7: 8:func GetHex() { 9: var adrs,c,cnt; 10: 11: adrs = 0; 12: cnt = 0; 13: do { 14: c = InpChar_(); 15: if ( (c >= 'a') & (c <= 'z') ) { 16: c = c - $20; 17: } 18: if ( ((c >= '0')&(c<='9')) | ((c>='A')&(c<='F')) ) { 19: PrnChar_( c ); 20: cnt = cnt + 1; 21: c = c - '0'; 22: if ( c > 9 ) { 23: c = c + ('0' - 'A' + 10); 24: } 25: adrs = adrs * 16 + c; 26: } 27: else if ( (c = 'H'-$40) & (cnt > 0) ) { 28: cnt = cnt - 1; 29: adrs = adrs / 16; 30: PrnChar_( c ); 31: PrnChar_( ' ' ); 32: PrnChar_( c ); 33: } 34: else if ( c = $1b ) { 35: adrs = $ffff; 36: break; 37: } 38: } while ( c <> $0d ); 39: return = adrs; 40:} 41: 42: 43:proc main() { 44: var adrs; 45: init(); 46: initPmp(); 47: initSpi(); 48:# initSd(); 49: 50: LATA[-2]=LATA[-2]&$fffc; # on reset:a0 halt:a1 51: PmpOn(); 52: 53: while ( 1 ) { 54: PrnStr_( "\nadrs : " ); 55: adrs = GetHex(); 56: if ( adrs = $ffff ) { 57: break; 58: } 59: dump( adrs ); 60: } 61:} :run adrs : 100 0100 : 0001 0203 0405 0607 0809 0A0B 0C0D 0E0F 0108 : 3031 3233 3435 3637 3839 4142 4344 4546 0110 : 0123 1234 2345 3456 4567 5678 6789 789A 0118 : 0000 0000 0000 0000 0000 0000 0000 0000 0120 : 0000 0000 0000 0000 0000 0000 0000 0000 0128 : 9E16 2155 E84D 0E91 A69F BB61 9880 0125 0130 : 28E1 6A36 ABB4 BA24 6891 3C94 AAD5 F89D 0138 : 00E6 FA6A 8C94 7B25 BE24 7217 2E42 B256 adrs :


 次はいよいよ CP/M-68K の移植ですね。でもその前にブレッドボードに SDコネクタを付けないと・・w


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

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

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) 
共通テーマ:趣味・カルチャー

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) 
共通テーマ:趣味・カルチャー

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

 最初に通販ネタですが、今回使用予定のメモリAS6C8016(512Kx16bit)は通販での偽物に対するリスクヘッジで二つの店舗から2個ずつ購入しています。
 yahooニュースの見分け困難!半導体の『模倣品』流通…真贋判定会社は大忙し「約3割が模倣品の懸念」を見ると外観で偽物チップを見分ける上で一番重要視されるのがインデックスマークの有無(偽物は表面を削るのでマークが消える)だそうです。

模倣品流通のニュース


 下の写真は今回購入したメモリです。確認のためにそれぞれの店舗から購入したチップを並べて比較してみるとDIP変換基板に半田付けした方はインデックスマークが・・・無いorz

購入したメモリチップ


 ハードディバッグ時に偽チップの可能性まで考えるのは効率が悪いのでブレッドボード上のメモリを早々にインデックスマーク有りのチップに変えました。

 また、CPU本体の MC68HC000P16 も千円以下の安価な物を幾つか海外の通販で購入していますが、最近届いたものが下の写真のように元の刻印を消しもしないである意味正々堂々としたまがい品でしたw
 元の刻印のようにP12であれば私の所有しているDIPのMC68HCの中では最高速度かもしれないのでまだいいのですが "P12" も偽刻印で実は・・ってことにならないか不安です。

最近届いた MC68HC000P16 P12


 今回も前回の記事と同様に通販での偽物ネタから入ってしまいましたが、本題のPICからのメモリアクセスの検証結果についてメモを残しておきたいと思います。

 始めにPICから供給する68K用のクロックの確認からです。PICからは16MHzと8MHzを供給して68Kのクロックをどちらにするかジャンパーピンで切り替えられるようにする予定です。
 下図がロジアナで確認した結果で、ロジアナのサンプリングとの関係でピッタリの数値ではないですが想定通り出ているようです。

PICからのクロック信号(サンプリング:100MHz)


 PICからのメモリリードとライト時のロジアナ波形が下図になります。PICのパラレルマスタポート(PMP)モジュールのマスターモードを使用してアクセスしています。ウエイトのパラメータ設定はアクセス時の前段/中段/後段の3つ設定できるようになっていて、下図は中段(WAITM)のみ1の設定で前段と後段はゼロの状態です。
 SelUpper/はPIC側の8bitデータバスと68K側の上位バイトバスを接続しているHC245をアクティブにするための信号です。

PICからのメモリリード(サンプリング:50MHz)

PICからのメモリライト(サンプリング:50MHz)


 メモリをアクセスする上では問題無い波形に見えるのでメモリライト&リードのテストプログラムを実行してみました。
 下記が実行結果で問題無くメモリにアクセスできているようですね。

メモリ試験プログラムと実行結果(picle言語)
:l 1:# Pic24MC68K PicMemCheck Ver 0.01 2021/12/08 2:# ver 0.01 by skyriver 3: 4:use LibCpm; 5:use LibSpi; 6: 7: 8:proc main() { 9: var i,dat; 10: init(); 11: initPmp(); 12: initSpi(); 13:# initSd(); 14: 15: PrnStr_( "init done\n" ); 16: 17: LATA[-2]=LATA[-2]&$fffC; # on reset:a0 halt:a1 18: 19: PmpOn(); 20: 21: PrnStr_( "Pmp on\n" ); 22: 23: PmpSetAdr(0); 24: dat = 1; 25: for ( i = 0; i < 16; i = i + 1 ) { 26: MemWr( dat ); 27: dat = dat * 2; 28: } 29: dat = 1; 30: for ( i = 0; i < 16; i = i + 1 ) { 31: MemWr( ~dat ); 32: dat = dat * 2; 33: } 34: 35: PrnStr_( "Write mem\n" ); 36: 37: Rdump( $00 ); 38: Rdump( $40 ); 39: exit(); 40:} :run init done Pmp on Write mem 0000 : 0001 0002 0004 0008 0010 0020 0040 0080 0008 : 0100 0200 0400 0800 1000 2000 4000 8000 0010 : FFFE FFFD FFFB FFF7 FFEF FFDF FFBF FF7F 0018 : FEFF FDFF FBFF F7FF EFFF DFFF BFFF 7FFF 0020 : 8857 2E76 8E40 6A15 1ADB 29D4 BE84 6A0D 0028 : A167 0257 B69B 6FF1 6657 3611 2A43 1B52 0030 : EF31 7B59 6EDD A124 AA15 906A ADF8 EB65 0038 : 6C51 AA14 6B75 B01C A9B9 BFC5 DE94 853D 0040 : 8807 72A0 4E4C 22B6 CE44 B9F9 EF42 8CD9 0048 : 6355 0ADC 2ED0 AE50 2255 C2CC 2222 8D31 0050 : 0EF8 E813 F975 FA5D BAB5 7915 B355 2A47 0058 : 2C75 4753 D335 BA45 A9F9 9AF5 CA55 114F 0060 : B37E 0A03 0C26 8BD9 2B47 AA51 BD74 AE95 0068 : 2175 0E55 3B14 4ED8 E63D 22D5 E897 3EF7 0070 : EA16 F9CD 86F9 2445 8AC0 B86F 377F C949 0078 : EA0D BB19 92D5 F06F E341 E867 B565 CA63 :


 因みに上で書いた中段のウェイトをゼロにした場合のロジアナ波形が下記で、メモリテストプログラムの結果もNGだったのでウェイトパラメータは中段のみ1で前段と後段はゼロで決定です。

ウェイト無しでのPICからのメモリリード(サンプリング:50MHz)

ウェイト無しでのPICからのメモリライト(サンプリング:50MHz)


 次の段階として MC68Kを動かしてみたいのですが、リセットがうまくかからないようで動作が変です^^;
 68Kのマニュアルを再度チェックしたところ、68Kをリセットするためには RESET#のみならず、HALT# もアクティブにする必要があることに気が付きました(HALTは使わないものとして16MHzのクロック出力のためのピンを追加しましたorz)
 いつものことではありますがPICのピン不足に悩んでしまいます。今回使用するメモリはライト時に OE# はdon't care(詳細は前回の記事を参照)なので下記の変更をすることにしました。

変更内容
                -+-
                 |
                 >
                 > 10K 追加
                 >
                 |
  68K:RESET/ ----+------------- PIC:RA0

                -+-
                 |
                 >
                 > 10K
                 >
                 |   ↓変更
  68K:HALT/  ----+------------- PIC:RA1(BG/ 入力から変更)


 ・HC368 Y2(5pin) の接続先を MCS/ から AS/に変更
 ・PICの11ピン(MRD/)を RB13として BG/入力に変更


 変更後のメモリリード/ライト時のロジアナ波形が下図になります。想定通りですね。メモリ試験プログラムの結果もOKでした。

変更後のPICからのメモリリード(サンプリング:50MHz)

変更後のPICからのメモリライト(サンプリング:50MHz)


 それでもまだ68Kがうまく動かないのようなので続きは次回のお楽しみということで今回はここまでにします。



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

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