2021年10月
          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31            

最近のトラックバック

« 2009年11月 | トップページ | 2010年4月 »

2010年3月

2010年3月22日 (月)

JR-100でLチカしてみた

 Jr100

 こちら、昔懐かしい8bitパソコンJR-100です。CPUはMC6802互換のMB8861で動作周波数が890kHz。ギガHzとかメガHzじゃないんです。キロHzですキロHz。1981年発売当時としても速くは無い方ですけど、今のパソコンと比べたら当時のパソコンなんてどれも同じようなもんですねw。

 この写真のキーボードみたいなものがJR-100の本体です。それを載せる台の用に敷かれているのは拡張ユニットJR-U02。これを付けるとメモリが16KBから32KBへ倍増。プリンタやジョイスティックも繋げられるようになります。さらにこのJR-U02には増設機器用のポート(26ピンコネクタ)があるのですが、この使い方はJR-U02の説明書にも載っておらず、入手から約4半世紀の間、何も繋がれずに使われずじまいでした。

Photo

 最近になってちょっと思い立ち、このJR-U02の回路を解析、ポートの内容が分かってきたので、自作の機器をつなぐ実験の第一弾としてマイコン電子工作のHello WorldであるLチカ(LEDチカチカ)に挑戦してみました。

Photo_2 L L_2

 回路は解析したJR-U02の内部回路(プリンタインターフェース等)を参考に作りました。

Jr100_ledbrinker_2 

 74HC04でClockの反転、74HC138でアドレスデコード、74HC175でデータの反転とラッチをしています。この増設機器ポートには電源が出ていないので、これらを動かすため別途電源が必要です。これで$CE00にデータを書きこむと下位4bitがLEDに反映されます。
 BASICのプログラムはこんな感じ

10 T=100
20 POKE $CE00,0
30 FOR I=1 TO T:NEXT
40 POKE $CE00,$0F
50 FOR I=1 TO T:NEXT
60 GOTO 20

 この増設機器ポートについてもう少し解説します。
 #ED0~#ED7は8bitの双方向データバスです。このポートでは反転した状態でやり取りされます。
 #EA0~#EA6は7ビットのアドレスバスで、データバス同様反転されています。ただし、JR-100本体から出力されるだけなので、外部機器はアドレスバスに出力することが出来ません。またJR-100のCPU MB8861のアドレスバスは本来16ビットですが、ここに出ているのは7ビット分だけです。
 #EIOE(増設IOイネーブル)には上位7ビットがデコードされた$CE00~$CFFFが有効との信号が出て来ます。これとアドレスバスと合わせて$CE00~$CE7Eが有効な増設機器IOアドレス、残りの$CE80~$CFFFは$CE00~$CE7Eのイメージとなります。
 ER/#Wには、リードライトの方向が、ECLKにはCPUクロックが出ています。
 #ERSTはリセット信号を受け取るだけですが、#EIRQは、コレクタをプルアップされたTrにつながっているので、外部機器側からIRQ信号を送ることも可能です。

※信号内容は私の解析結果、信号名は私が適当に付けたものなので参考程度としてください。

動画はこちら:
【レトロPC】JR-100でLチカしてみた【8bit】http://www.nicovideo.jp/watch/sm10106753

2010年3月20日 (土)

Arduinoにスーパーファミコンのパッドをつなぐ

 mtm04に出品した和音マシンで、入力インターフェースにスーパファミコン(SFC)のコントロールパッドを使いました。簡単に使えるようにライブラリ化してあります。

Sfcpad

 パッド自体はケーブルを切断して、2550コネクタ(QIコネクタ)を付けています。信号系と電源系は使いやすいように別のコネクタにしました。

  • 赤 : data
  • 黄 : clock
  • 橙 : latch
  • 白  : Vcc(+5)
  • 茶 : GND

 下はライブラリに付けたサンプルです。単純にすべてのボタンをまとめて読む関数しか付けていませんが、これだけでも簡単に使えるでしょう。ヘッダファイルには方向キーやABXYボタンのマスクなども定義してありますので、ご利用ください。

#include <SFCpad.h>

SFCpad pad(5, 7, 6);
/*
  SFCpad pad(data,clock,latch)
  data : digitalI/O Pin Number to SFCpad data Out   
  clock: digitalI/O Pin Number to SFCpad clock In
  latch: digitalI/O Pin Number to SFCpad latch In
*/

/*
 SFCpad cable
 Red Line    : data
 Yellow Line : clock
 Orange Line : latch
 
 White Line  : Vcc(+5)
 Brown Line  : GND
*/

void setup(){
  Serial.begin(9600);
}

void loop(){
  unsigned int rawData;
  rawData = pad.readRaw();
/*
  readRow Funciton Returns pad status.
  each bit means Pressed Button 
*/  
  Serial.print("----RLXArlduTEYB:");
  Serial.println(0xF000+rawData,BIN);
/*
  R: R Button
  L: L Button
  X: X Button
  A: A Button
  r: right
  l: light
  d: down 
  u: up
  T: START Button
  E: SELECT Button
  Y: Y Button
  B: B Button  
*/
  delay(100);
}

「SFCPad.zip」をダウンロード

2010年3月13日 (土)

71円で16進7セグデコーダを作る

久々のブログ更新になりましたが、プロジェクトは色々進行中です。
とりあえず、リハビリを兼ねて軽いネタからご紹介いたします。

 汎用ロジックICで7セグLEDを点灯させたいとき、定番のICは74HC47とか74HC4511とかですね。これらのICで0~9までの表示はできますが、残念なことに16進数で使うA~Fの表示には対応していません。そこで、なんらかのマイコンを使って代わりになる物を作ろうと思っていました。
 そこでマイコンチップの選択ですが、汎用ロジックICの置き換えなので、なるべく安くあげたいのが第一、また出来る限りピン数は少ない方が基板の実装面積を減らせると思いました。マイコンを使い始めてから今まで(といってもほんの1年ちょっとですが)一番いじってきたのはAtmelのAVRマイコンです。ならば候補はATTiny2313でしょう。秋月で100円と非常に安価な定番マイコンです。まぁこれを使っても良いのですが、これよりも条件が良い物がないかと探してみたところ、ありました。MicrochipのPICマイコン16F54が18ピンでなんと60円です。これしかないな、と思って買い置きしてありました。

 さて、このPIC16F54を買ってから実際に7セグデコーダを作ろうと思うまでにはしばらく間があったのですが、ようやく着手。以前にPIC16F88で使ったMikroCでプロジェクトを作ろうとしたところ、あら、16F54が選択肢にありません。ここに来てはじめて16F54のスペックをチェック。プログラムメモリ512ワード、RAM25バイト?!これでCは厳しいですね。
 しょうがないので、ターゲットを16F88にしておいて、アセンブラコードを16F54に流用しようとCでプログラムを組み始めました。まぁポートAの4ビットの読んで、その数値に対応する字形になるデータをポートBに書くだけなので、ほどなく完成。コンパイルして.asmファイルをMPLABに持ち込みます。
 が、ここでも一筋縄ではいきません。コンフィグビットのキーワードが違うとか、16F88にあって、16F54にない命令(ADDLW,RETURNなど)があるとか、MikroCとMPLABで16進数定数の表現が違うとか、色々失敗しつつそのつどデータシートにあたりながら、なんとかビルドに成功、これでチップに焼けばテスト回路でのチェックへ進めます。

 コードを修正しているときはコンフィグビットは適当にビルドに通ればいいやとやっていましたが、書き込みソフトの画面を見て、さてどれを選べばいいのかとデータシートを見てみると・・・・内蔵オシレータが無い?せっかくピン数を減らすようにこのチップを選んだのに、外付け部品がいるなんてorz これも仕方ないです、とりあえずはセラミック発振子(セラロック)で動作をチェック。4MHzのセラロックなら秋月で20円。まぁこれでもTiny2313よりは安いですけど、もう一声行きたいところ。で、RCオシレータをテスト、タイミングにシビアな用途ではないですし、計ってみると1.4MHzくらいは出ているようなので、たとえ複数桁のダイナミック点灯に使っても問題はないでしょう。というわけで、セラミックコンデンサ10円+カーボン抵抗1円の追加部品に決定。しめて71円の16進7セグデコーダの出来上がりです。

 当初はカソードコモンLED専用にコードを書いていましたが、 ポートBの7ビット目が余っているので、ここをコモンタイプ選択入力に使う事にしました。起動時にこのピンを読み取り、Highならアノードコモン、Lowならカソードコモンの出力をするように修正しました。7セグLEDのつながる側と同じ方に選択入力をつなげばOKです。これで74HC47や74HC4511にはない機能が増えました。

 以下にアセンブルリストをあげます。

; decorder for 7segment
; by maris 2010/03/13

	LIST	P=16F54
	INCLUDE	"P16F5X.INC"
	__CONFIG	_RC_OSC & _WDT_OFF & _CP_OFF
	
PIN7		EQU	H'80'
FSRMSK		EQU	H'E0'
	
FONT		EQU	H'08'
NFNTS		EQU	H'10'

	ORG 1FF
	GOTO start

	ORG	0
c_common:
	MOVLW	b'00111111'
	MOVWF	FONT
	MOVLW	b'00000110'
	MOVWF	FONT+1
	MOVLW	b'01011011'
	MOVWF	FONT+2
	MOVLW	b'01001111'
	MOVWF	FONT+3
	MOVLW	b'01100110'
	MOVWF	FONT+4
	MOVLW	b'01101101'
	MOVWF	FONT+5
	MOVLW	b'01111101'
	MOVWF	FONT+6
	MOVLW	b'00000111'
	MOVWF	FONT+7
	MOVLW	b'01111111'
	MOVWF	FONT+8
	MOVLW	b'01101111'
	MOVWF	FONT+9
	MOVLW	b'01110111'
	MOVWF	FONT+H'0A'
	MOVLW	b'01111100'
	MOVWF	FONT+H'0B'
	MOVLW	b'00111001'
	MOVWF	FONT+H'0C'
	MOVLW	b'01011110'
	MOVWF	FONT+H'0D'
	MOVLW	b'01111001'
	MOVWF	FONT+H'0E'
	MOVLW	b'01110001'
	MOVWF	FONT+H'0F'
	RETLW	0


start:
	MOVLW	H'1F'
	TRIS	PORTA
	MOVLW	0
	MOVWF	PORTB
	MOVLW	PIN7
	TRIS	PORTB

	CALL	c_common	
	
	MOVF	PORTB,W
	ANDLW	PIN7
	BTFSC	STATUS, Z
	GOTO 	main

	MOVLW	FONT
	MOVWF	FSR
revloop:
	MOVLW	FONT+NFNTS+FSRMSK
	SUBWF	FSR, W
	BTFSC	STATUS, C
	GOTO	main
	COMF	INDF, F
	INCF	FSR, 1
	GOTO	revloop

main:
loop:
	MOVLW	FONT
	ADDWF	PORTA, W
	MOVWF	FSR
	MOVF	INDF, W
	MOVWF	PORTB
	GOTO	loop

	END

ブレッドボードで点灯テスト

7seg5

7segd

7segf

回路図はこんな感じです。

Decoderfor7seg

 出来上がった物は大したことないですが、だいぶPICの勉強になりました。これはこれでよしとしましょう。

« 2009年11月 | トップページ | 2010年4月 »

ウェブページ

無料ブログはココログ