前略 長嶋 様 いつも楽しみにA&SLを拝見しています。 以前CD−ROMを注文した時に「H8用原人コッツ」の件で質問したものです。 その節はありがとうございました。 その後しばらく離れていたのですが、最近再度やり始めました。  そこで「靄夜」が参考になるとのことですが、質問があります。   <ソフト編>   Q1: MIDIを受けてデジタルのポートを駆動するためには     ”SCI init / MIDI Transmit Routines”     等の送信関係の削除のほか、連続調光を制御している箇所を変更 すればいいのでしょうが良く分かりません。        具体的に教示していただけないでしょうか。       <ハード編>      Q2: 「靄夜」の出力は負論理とありますが、「コッツ」ではなるべく     正論理で回路を製作したいのですが。(負論理でも可ですが。)   Q3: 上記とは別に”靄夜”そのものを製作したいと思いますが、       74HC245の接続方法が良く分かりません。     1個のLEDをつなぐ場合      ・20(VCC)が5V      ・10(GND)がアース      ・H8側に1(DIR)      ・LEDのカソード側に19(−G)ですか。      ・2〜18(A1〜B1)はどうつなぐのでしょうか。      ・1個のLEDに1個の74HC245ですか。             Q4: 定電流ダイオードの規格はありますか。     お忙しいとは思いますが、上記の件有償でいくら位でしょうか。     どうしても動かしたいのです、何卒よろしくお願いします。           宮城県   FM   ------------------------------------------------------------------- FM 様、長嶋です。以下、回答いたします。頑張って下さい。 この回答は他の人にも有効ですので、「無償」です。(^_^) >   Q1: MIDIを受けてデジタルのポートを駆動するためには >     ”SCI init / MIDI Transmit Routines” >     等の送信関係の削除のほか、連続調光を制御している箇所を変更 > すればいいのでしょうが良く分かりません。    >     具体的に教示していただけないでしょうか。 MIDIを受けて、AKI-H8では外付け部品ナシに最大で64ビットまで ディジタルのポートをON/OFFできます。「靄夜」では、基本的には これですが、白色LEDを微妙に点灯させるために、ON時間を時分割して 平均点灯時間を128段階で制御しています。原人コッツの場合には、 この時間管理を省略して単純にON/OFFだけにするということに なります。 ただし、最大の64ビットにするためには、きちんと8ビットのポート が8個、とはなっていないので、端数のあるポートなどをちょっと いちいち割り当てている部分に注意して下さい。 ちょっと長くなりますが、まず、以下の「靄夜」AKI-H8ソース http://nagasm.org/1106/moya/suac16.txt について解説します。 > ;------------------------------- > ; [Meisou_LED-3] February 2002 > ;------------------------------- > > ;##### Port Defines ##### > smr .equ h'0fffb0 > brr .equ h'0fffb1 > scr .equ h'0fffb2 > tdr .equ h'0fffb3 > ssr .equ h'0fffb4 > rdr .equ h'0fffb5 > p1ddr .equ h'0fffc0 > p1dr .equ h'0fffc2 > p2ddr .equ h'0fffc1 > p2dr .equ h'0fffc3 > p3ddr .equ h'0fffc4 > p3dr .equ h'0fffc6 > p4ddr .equ h'0fffc5 > p4dr .equ h'0fffc7 > p5ddr .equ h'0fffc8 > p5dr .equ h'0fffca > p6ddr .equ h'0fffc9 > p6dr .equ h'0fffcb > p8ddr .equ h'0fffcd > p8dr .equ h'0fffcf > paddr .equ h'0fffd1 > padr .equ h'0fffd3 > pbddr .equ h'0fffd4 > pbdr .equ h'0fffd6 > iprb .equ h'0ffff8 > > ;##### Vector Defines ##### > .section vector,data,locate=h'000000 > .data.l start > .org h'0000d0 > .data.l int_rx_error > .data.l int_rx_full ここまではポート等の定義ですので変更ナシです。 > ;##### Work RAM Data Defines ##### > .section ram,data,locate=h'0fef10 > timer1 .res.w 1 > rx_top .res.w 1 > rx_end .res.w 1 > pdata .res.b 8 > rsb .res.b 1 > channel .res.b 1 > dcb .res.b 1 > keyno .res.b 1 > data .res.b 1 > ctr .res.b 1 > .org h'0ff300 > setd .res.b 64 > dat .res.b 64 > .org h'0ff400 > rx_fifo .res.b 1024 この部分はRAMの定義です。既に送信関係はカットして いますので、時間管理のいくつかは不要としても、この 部分も変更ナシで問題ありません。 > ;***** Reset --> Initialize --> Main Loop ***** > .section program,code,locate=h'001000 > start: > mov.l #h'0fff0f,er7 ; stack pointer set > mov.l #h'0fef10,er2 > mov.w #h'0fe0,r1 > mov.b #0,r0l > _ram_clear: > mov.b r0l,@er2 > inc.l #1,er2 > dec.w #1,r1 > bne _ram_clear > jsr @sci0_init ; SCI initialize > mov.b #b'11111111,r0l > mov.b r0l,@pbddr ; set : Port[B] all output > mov.b r0l,@paddr ; set : Port[A] all output > mov.b r0l,@p8ddr ; set : Port[8] all output > mov.b r0l,@p6ddr ; set : Port[6] all output > mov.b r0l,@p5ddr ; set : Port[5] all output > mov.b r0l,@p4ddr ; set : Port[4] all output > mov.b r0l,@p3ddr ; set : Port[3] all output > mov.b r0l,@p2ddr ; set : Port[2] all output > mov.b r0l,@p1ddr ; set : Port[1] all output > mov.b #b'11111111,r0l > mov.b r0l,@pbdr > mov.b r0l,@padr > mov.b r0l,@p8dr > mov.b r0l,@p6dr > mov.b r0l,@p5dr > mov.b r0l,@p4dr > mov.b r0l,@p3dr > mov.b r0l,@p2dr > mov.b r0l,@p1dr > jsr @wait_500msec > mov.b #b'01010000,r0l ; tx/rx start ! > mov.b r0l,@scr > andc.b #b'01111111,ccr ; interrupt enable > main_loop: > jsr @job_timer > jsr @rx_midi_check > jmp @main_loop ここは初期化とメインルーチンです。ここも変更ナシ、と しておきましょう。 > ;***** SCI init / MIDI Transmit Routines ***** > sci0_init: > mov.b #b'00000000,r0l > mov.b r0l,@scr > mov.b #b'00000000,r0l > mov.b r0l,@smr > mov.b #15,r0l > mov.b r0l,@brr > mov.w #500,r0 > _sci0_wait: > dec.w #1,r0 > bne _sci0_wait > mov.b @ssr,r0l ; (dummy read) > mov.b #0,r0l > mov.b r0l,@ssr > mov.b #b'00001000,r0l > mov.b r0l,@iprb ; SCI0-int priority UP ! > rts ここは割込みだけしか残っていませんので、まったく 変更しないで下さい。(^_^;) ここをいじるとMIDI受信できなくなります。 > ;***** Timer / Counter Routines ***** > wait_500msec: > mov.l #500,er1 > _wait_1: > jsr @wait_1msec > sub.l #1,er1 > bne _wait_1 > rts > wait_1msec: > mov.l #2048,er5 > _wait_2: > sub.l #1,er5 > bne _wait_2 > rts > timer_check: > mov.b @timer1,r0l > inc.b r0l > mov.b r0l,@timer1 > cmp.b #10,r0l > beq _timer_hit > rts > _timer_hit: > mov.b #0,r0l > mov.b r0l,@timer1 > jsr @job_timer > rts ここの前半はあまり意味はない初期化タイマで、大切 なのは後半です。とりあえずここも変更ナシ、として、 あとで尻拭いしましょう。(^_^;) > ;***** Rx Interrupt / MIDI Receive Routines ***** > int_rx_error: > bclr #5,@ssr > bclr #4,@ssr > rte > int_rx_full: > push.w r0 > push.l er5 > btst #6,@ssr > bclr #6,@ssr > mov.w @rx_top,r5 > mov.w #0,e5 > mov.b @rdr,r0l > mov.b r0l,@(rx_fifo,er5) > inc.w #1,r5 > bclr #2,r5h > mov.w r5,@rx_top > pop.l er5 > pop.w r0 > rte > rx_midi_check: > mov.w @rx_top,r1 > mov.w @rx_end,r5 > cmp.w r1,r5 > bne _rx_exist > rts > _rx_exist: > mov.w #0,e5 > mov.b @(rx_fifo,er5),r0h ; received data = [r0h] > inc.w #1,r5 > bclr #2,r5h > mov.w r5,@rx_end > btst #7,r0h > beq running > mov.b r0h,r0l > and.b #b'11111000,r0l > cmp.b #b'11111000,r0l > bne _lower_f8 > rts > _lower_f8: > and.b #b'11110000,r0l > cmp.b #b'11110000,r0l > bne _lower_f0 > mov.b #0,r0l > mov.b r0l,@rsb > rts > _lower_f0 > mov.b r0h,r0l > and.b #b'00001111,r0l > mov.b r0l,@channel > mov.b r0h,r0l > and.b #b'11110000,r0l > mov.b r0l,@rsb > mov.b #0,r0l > mov.b r0l,@dcb > rts > running: > mov.b @rsb,r0l > bne _normal > rts > _normal: > cmp.b #b'11000000,r0l > beq _2byte > cmp.b #b'11010000,r0l > beq _2byte > mov.b @dcb,r1l > bne _3byte > inc.b r1l > mov.b r1l,@dcb > mov.b r0h,@keyno > rts > _2byte: > rts > _3byte: > mov.b #0,r1h > mov.b r1h,@dcb > mov.b r0h,@data > mov.b @rsb,r0l > cmp.b #h'a0,r0l ; A* event ? > beq _hit_01 > rts > _hit_01: > mov.b @channel,r0l > cmp.b #h'0f,r0l > beq _hit_02 > rts > _hit_02: > mov.l #setd,er4 > mov.b @keyno,r4l > mov.b @data,r0l > mov.b r0l,@er4 > rts ここはMIDIのどういう情報として制御するか、という部分 です。「靄夜」と同じプロトコルで送るとすれば、 この部分もいっさい変更ナシでいけます。 今回はON/OFFですので、プロトコルは「靄夜」の > # MIDIフォーマットは以下 (変更不可、必要なら変換Maxを外付け) > * MIDIステータス = アフタータッチ (ポリフォニックプレッシャー) > * MIDIチャンネル = 16 (status=0xAF) > * ノートナンバ = 0 - 63 > * データ = 0 - 127 > * 各LEDはそれぞれ、128*Tの周期ごとに上記 data*T の値だけ点灯する。 > データ=1ならば 128*Tごとに1*Tだけ点灯することで、いいカンジに > チラチラする。(^_^) というものでなく、 * MIDIステータス = アフタータッチ (ポリフォニックプレッシャー) * MIDIチャンネル = 16 (status=0xAF) * ノートナンバ = 0 - 63 * データ = 0 - 127 データ = 0 の時にポートOFF 128 > データ > 1 の時にポートON となると思います。 さて、残されたプログラムはわずかですが、 以下のサブルーチンは、要するにメインルーチンから 128回呼ばれるうちに1回だけ実行しているという もので、あとはビットの対応などは全て jsr @led_sub と最後のサブルーチンに丸投げしています。 ということは、ここも変更ナシでいけます。(^_^) > ;***** Software Timer Routine ***** > job_timer: > mov.b @ctr,r5h > dec.b r5h > mov.b r5h,@ctr > bne _job_1 > mov.b #128,r0l > mov.b r0l,@ctr > _job_1: > mov.l #dat+0,er6 > mov.l #setd+0,er4 > jsr @led_sub ; 0 - 7 > mov.b r1h,@p1dr > jsr @led_sub ; 8 - 15 > mov.b r1h,@p2dr > jsr @led_sub ; 16 - 23 > mov.b r1h,@p3dr > jsr @led_sub ; 24 - 31 > mov.b r1h,@p4dr > jsr @led_sub ; 32 - 39 > mov.b r1h,r5l > and.b #b'00011111,r1h > mov.b r1h,@p8dr > and.b #b'11100000,r5l > rotl.b r5l > rotl.b r5l > rotl.b r5l > jsr @led_sub ; 40 - 47 > mov.b r1h,r1l > and.b #b'00001111,r1h > mov.b r1h,@p5dr > and.b #b'11110000,r1l > shlr.b r1l > or.b r1l,r5l > mov.b r5l,@p6dr > jsr @led_sub ; 48 - 55 > mov.b r1h,@padr > jsr @led_sub ; 56 - 63 > mov.b r1h,@pbdr > rts ・・・ということで、全ての変更は以下の部分に皺寄せ されてきました。(^_^;) > led_sub: > mov.b #8,r3h ; loop counter > mov.b #b'00000001,r2h ; bit mask > mov.b #0,r1h ; bit buffer > _loop01: > mov.b @er6,r0l > beq _loop02 > or.b r2h,r1h ; ON ! > dec.b r0l > mov.b r0l,@er6 > _loop02: > shal.b r2h > cmp.b #0,r5h > bne _loop03 > mov.b @er4,r0l > mov.b r0l,@er6 > _loop03: > inc.b r4l > inc.b r6l > dec.b r3h > bne _loop01 > xor.b #b'11111111,r1h > rts > .end この短いサブルーチンは非常にトリッキーで、 私も自分で読んでもなかなか判らないという ものです。(^_^;) 実際にやっていないので確実ではないのですが、 タイマー設定値と、毎回減算されるタイマー値を 比較しているのは > mov.b @er6,r0l > beq _loop02 > or.b r2h,r1h ; ON ! > dec.b r0l > mov.b r0l,@er6 > _loop02: > shal.b r2h > cmp.b #0,r5h > bne _loop03 > mov.b @er4,r0l > mov.b r0l,@er6 > _loop03: の部分です。 MIDIの最後のデータバイトとして送られたものは @er4に設定されます。 そして毎回減算されるタイマー値は@er6です。 ということは、単純なビットON/OFFの場合には、 タイマーを減算とかせずに、設定された@er4の 値をそのままゼロかどうか見るだけです。 @er6は不要ということです。 従って、上記の部分を以下のようにすれば、たぶん 希望する動作となります。・・・たぶん。(^_^;) 最後のサブルーチンの部分を全て書きます。 led_sub: mov.b #8,r3h ; loop counter mov.b #b'00000001,r2h ; bit mask mov.b #0,r1h ; bit buffer _loop01: mov.b @er4,r0l beq _loop02 or.b r2h,r1h ; ON ! _loop02: inc.b r4l inc.b r6l dec.b r3h bne _loop01 xor.b #b'11111111,r1h rts .end >   Q2: 「靄夜」の出力は負論理とありますが、「コッツ」ではなるべく >     正論理で回路を製作したいのですが。(負論理でも可ですが。) プログラムのいちばん最後から3行目にある xor.b #b'11111111,r1h を取ってしまえば、ポートに出力される信号は 反転されて正論理となります。つまり、「靄夜」 ではわざわざこの1行で全ビット反転させて 負論理にしているのです。(^_^) >   Q3: 上記とは別に”靄夜”そのものを製作したいと思いますが、  >      74HC245の接続方法が良く分かりません。 >     1個のLEDをつなぐ場合 >      ・20(VCC)が5V >      ・10(GND)がアース >      ・H8側に1(DIR) >      ・LEDのカソード側に19(−G)ですか。 >      ・2〜18(A1〜B1)はどうつなぐのでしょうか。 >      ・1個のLEDに1個の74HC245ですか。           74HC245は8個のバッファが入っていて、DIRで一斉に その方向が定義され、-G(19pin)で一斉にイネーブル されます。 従って、電源とGNDは上記でOK、19は必ずGNDです。 DIRは実は+5VでもGNDでもどちらでもいいのです。 DIRで規定された方向に従って、入力をAKI-H8のポート にして、出力をLEDにします。 拙著「Java & AKI-80」の45ページに、245で 8ビットのLEDを正論理と負論理で点灯させる回路が あります。 正論理ではTTLでは駄目、と書いてありますが、 74HC245ならこれでもOKです。(^_^) YAHOO.COMで「245」とか「74HC245」とか入れると データシートのPDFが中国とかから入手できますので(^_^;) これで調べてみて下さい。 これは簡単なことなので、敢えて詳解しません。 >   Q4: 定電流ダイオードの規格はありますか。 これは、秋月電子などで白色LEDを売っている場合、 そのLEDに対応したちょうどいい定電流ダイオードを セットにしているので、これを使ったらいいと 思います。普段、LEDに直列に入れる電流制限抵抗は 不要で、もっともベストに光ります。(^_^) 両者はいろいろあるので、規格というよりも、セットの ものを常に使う、ということです。ある白色LEDにセットに なっている定電流ダイオードを、別の白色LEDに使うという のは駄目、ということでやっています。 ・・・ということで、頑張って下さい。(^_^)