電子回路設計演習レポート 目次 : 1. 購入物品リスト 2. 課題 3: 7 セグメント LED の表示 2.1 課題 3 のプログラムリスト 3. 自由課題 : プレイステーションパッドによるデジ Q のリモコン操作 3.1 パッドの改造 3.2 リモコンの機能 3.3 プログラムリスト参考文献付録 : DigiQ 通信仕様付録 : プレイステーション PAD 通信仕様 提出年月日 2005 年 9 月 2 日 ( 金 ) 所属電気電子工学科 4 年 500404 9 0 1 8 氏名 池田祐一 1
1. 購入物品リスト 電子部品名 用途 規格 単価 数量 合計 購入先 PIC16F84A-20/P PIC16F84 300 2 600 秋月電子通商 カーボン抵抗 1/4W R0,R1 10kΩ 1 7 7 秋月電子通商 カーボン抵抗 1/4W R2,R2 追加分 300Ω 1 12 12 秋月電子通商 DIPスイッチ 8P SW#0 4 60 1 60 秋月電子通商 押しボタンスイッチ PSW#0,1 50 2 100 秋月電子通商 セラミック発振子 XT,C1,C2 4MHz 40 2 80 秋月電子通商 赤色 LED Φ3mm LED#0 7 3.5 8 28 秋月電子通商 7セグメントLED 課題 3 K.COM 60 1 60 秋月電子通商 74HC4511AP 7セグデコーダIC K.COM 126 1 126 秋月電子通商 ブレッドボード EIC-102B 700 1 700 秋月電子通商 デジQ FAIRLADY 自由課題 4800 1 4800 グランフジ新居浜店 ボタン型電池 自由課題 240 2 480 大学生協 赤外線 LED 自由課題 10 1 10 秋月電子通商 PSコントローラ 自由課題 500 1 500 HARD OFF 総計 7563 2. 課題 3: 7 セグメント LED の表示 SW#4 が OFF 時は SW#0 SW#3 のスイッチの状態が LED # 4 7 に表示されるとともに 7 セグメント LED に数字として表示され SW#4 が ON 時は LED # 4 7 に表示されるプログラムを作成した SW#4 が OFF の時 ON の時それぞれの動作中の様子を図 1 に示す 図 1 動作中の様子 (SW # 4 OFF 時 ) 図 2 動作中の様子 (SW # 4 ON 時 ) 2
2.1 課題 3 のプログラムリスト PROCESSOR p16f84a RADIX dec include "p16f84a.inc" list p=16f84a CONFIG _XT_OSC & _WDT_OFF ファイルレジスタの定義 tmp equ 0x0c ここからプログラム ORG 0 goto start メイン処理 start ポートの初期化 bsf STATUS,5 bank 1 に設定 movlw B'00011111' ポート A の入出力方向を設定 movwf TRISA movlw B'00000000' ポート B の入出力方向を設定 movwf TRISB bcf STATUS,5 bank 0 に設定 movlw 0 ポート A,B を零に初期化 movwf PORTA movwf PORTB loop SW#4 についての分岐 btfss PORTA,4 goto sw4_is_on btfsc PORTA,4 goto sw4_is_off goto loop SW4 が ON のときの処理 sw4_is_on スイッチの状態を LED#4 #7 に表示する swapf PORTA,W iorlw 0x0f 7 セグのほうは Blank(=B'1111') にしておく movwf PORTB goto loop SW4 が OFF のときの処理 sw4_is_off スイッチの状態を LED#4 #7 に表示し 7 セグメント LED にも数字として表示する clrf tmp swapf PORTA,W LED andlw 0xf0 movwf tmp movf PORTA,W 7 セグ xorlw 0xff 7 セグのほうは NOT をしておく andlw 0x0f addwf tmp,w movwf PORTB goto loop END 3
3. 自由課題 : プレイステーションパッドによるデジ Q のリモコン操作 おもちゃメーカーのコナミとタカラからリモコン操作できるチョロ Q デジ Q が発売されています 自由課題のテーマとして プレイステーションに使われているゲーム用のパッドを赤外線リモコンに改造して デジ Q の操作を行いました 3.1 パッドの改造 図 3 赤外線リモコンに改造したパッドとデジ Q 図 4 のようにパッド内部に PIC マイコンの基板 赤外線発光ダイオード ボタン型バッテリーを設置しています PIC マイコンからパッドのボタン押下状態を取得するために パッドを制御している別のマイコンとケーブルを介して通信を行います 3.2 リモコンの機能 図 4 赤外線リモコンに改造したパッドの内部 リモコンには十字キーでデジ Q を前後左右 右折左折 左右旋回する機能を付加しました また ボタンで二倍速 ボタンで三倍速 ボタンで全速力とスピード調整ができるようにしました 4
3.3 プログラムリスト 3.3.1 マクロ定義 macro.inc NOLIST movlwf macro f,k movlw k movwf f movfwf macro f1,f2 movf f2,0 movwf f1 movb macro f1,b1, f2,b2 btfsc f2,b2 bsf f1,b1 btfss f2,b2 bcf f1,b1 movnb macro f1,b1, f2,b2 btfsc f2,b2 bcf f1,b1 btfss f2,b2 bsf f1,b1 rr macro f rrf f,1 rl macro f rlf f,1 djnz macro f,addr decfsz f,1 inc macro f incf f jb macro f,b, addr btfsc f,b jnb macro f,b, addr btfss f,b jc macro addr btfsc 3,0 jnc macro addr btfss 3,0 jz macro addr btfsc 3,2 jnz macro addr btfss 3,2 cje_fl macro f,k,addr movlw k subwf f,0 btfsc 3,2 cje_ff macro f1,f2,addr movf f2,0 subwf f1,0 btfsc 3,2 cjne_fl macro f,k,addr movlw k subwf f,0 btfss 3,2 cjne_ff macro f1,f2,addr movf f2,0 subwf f1,0 btfss 3,2 clr macro f clrf f not macro f comf f,1 set_fsr macro k movlw k movwf 4 jnz_w macro addr xorlw 0 btfss 3,2 rnz_w macro xorlw 0 btfss 3,2 LIST 5
3.3.2 DigiQ 操作プログラム irpad_digiq.asm irpad_digiq.asm - IRPAD DigiQ Controller 赤外線 PS- PAD デジ Q 操作版 < 設定 > UNT: PIC16F84 OSC: XT (4MHz) WDT: ON < 省電力モード > 12 分経過すると省電力モードになり 2 秒間隔でキー入力を読み取ります 最初や しばらく使わなかったときは ボタンを 2 秒以上押し続けて下さい <LED の点滅 > 赤色 LED はエラー発生時と データ送信時に点滅します < 更新履歴 > 2005. 08. 28 DigiQ Version * デジ Q を操作できるように改造 *** マイコンの設定 *** PROCESSOR RADIX include include CONFIG p16f84a dec "p16f84a.inc" "macro.inc" _XT_OSC & _WDT_ON *** Pin 設定 *** PORTA は全て赤外線出力 (out,neg,1) #d efine RED PORTA,1 赤色 LED #d efine IR1 PORTA,2 赤外線 LED 1 # d efine IR2 PORTA,3 2 # d efine IR3 PORTA,4 3 #d efine PAD PORTB,0 PS- PAD 電源 (out,pos,0) # d efine SEL PORTB,1 SEL (out,neg, 1) # d efine CLK PORTB,2 CLK (out,- --,1) # d efine CMD PORTB,3 CMD (out,pos,1) # d efine DAT PORTB,4 DAT (in, pos,1) # d efine ACK PORTB,5 ACK (in, neg,1) *** 通信設定 *** DIGIQ_ID equ 4 操作したいデジ Q の ID 番号 (1 4) *** 変数の定義 *** tm0 equ 0x0C タイマ 0 tm1 equ 0x0D タイマ 1 cn equ 0x0E カウンタ rcn equ 0x0F 再送信カウンタ scn equ 0x10 スリープカウンタ id equ 0x11 PADID key1 equ 0x12 キーデータ 1 key2 equ 0x13 キーデータ 2 tmp equ 0x14 一時データ ekey1 equ 0x15 有効キーデータ1 ekey2 equ 0x16 有効キーデータ2 6
coder equ 0x17 デジQに送信するデータ前半 codel equ 0x18 デジQに送信するデータ後半 i equ 0x19 汎用インデクス *** パッドのボタンと対応するデータ *** # d efine LEFT key1,7 # d efine DOWN key1,6 # d efine RIGHT key1,5 # d efine UP key1,4 # d efine START key1,3 # d efine SELECT key1,0 # d efine SQUARE key2,7 # d efine CROSS key2,6 # d efine CIRCLE key2,5 # d efine TRIGLE key2,4 # d efine R1 key2,3 # d efine L1 key2,2 # d efine R2 key2,1 # d efine L2 key2,0 *** メインルーチン *** WDT を使うため 約 2 秒毎に clrwdt を呼び出す必要がある ORG 0 main init 初期化 loop movlwf scn, 200 スリープカウンタをリセット scn_loop movlwf rcn, 4 再送信カウンタをリセット rcn_loop sleep_wait 約 18msec のウェイト ( 省電力 ) scan PAD データを取得 jnz_w main_error not key1 データを反転 押されたボタンを1にする not key2 cjne_ff ekey1,key1,update キーの変化を調べる cjne_ff ekey2,key2, upd a t e sleep_wait 約 18msec のウェイト ( 省電力 ) djnz rcn, rcn_loop rcn_brea k 再送信カウンタ終了 ( キーに変化が無いまま 0.2 秒経過 ) キーが押されているときは連続して再送信 clrw iorwf key1, W iorwf key2, W jnz update キーが押されていないときは 0.2 秒毎に合計 200 回再送信する その後省電力モードに移行する send データを送信 djnz scn, scn_loop scn_bre ak スリープカウンタ終了 ( キーが押されないまま 1 2 分経過 ) 省電力モードでキー入力を待つ sleep 約 2.3 秒のウェイト ( 省電力 ) scan PAD データを取得 jnz_w main_error 7
not key1 データを反転 押されたボタンを1にする not key2 clrw キー入力を調べる iorwf key1, W iorwf key2, W jnz update goto scn_bre ak update 赤外線送信はデータに変化があるとき または約 0.5 秒間 キーが押されたままのときに行われる movfwf ekey1, key1 データを更新 movfwf ekey2, key2 send データを送信 goto loop main_error エラーの確認 赤色 LED を点滅する bcf RED wait_8ms bsf RED wait_8ms goto loop *** 約 18msec のウェイト ( 省電力 ) *** WDT を利用した省電力版のウェイト sleep_wait clrwdt bsf STATUS,RP0 bcf OPT,PSA WDT プリスケーラ OFF bcf STATUS,RP0 sleep bsf STATUS,RP0 bsf OPT,PSA WDT プリスケーラ ON bcf STATUS,RP0 *** 初期化 *** init WDT 設定 bcf INTCON,GIE 割り込み禁止 bsf STATUS,RP0 movlw B'000001 11' iorwf OPT,F プリスケーラ設定 (WDT 1:128 Max:2304 m s) bsf OPT,PSA プリスケーラを WDT に使う bcf STATUS,RP0 clrwdt ポート設定 ( 初期値 ) movlwf PORTA, H'FF' PORTA 初期値 bsf STATUS,RP0 movlwf TRISA, H'00' PORTA I/O 設定 movlwf TRISB, H'FF' PORTB I/O 設定 bsf OPT,N_RBPU PORTB プルアップ抵抗 OFF bcf STATUS,RP0 *** PS- PAD ON *** pad_on ポート設定 (PAD_ON) bsf STATUS,RP0 movlwf TRISB, H'F0' PORTB I/O 設定 bcf OPT,N_RBPU PORTB プルアップ抵抗 ON bcf STATUS,RP0 8
movlwf PORTB, H'FF' PORTB 初期値 通信開始 wait_8ms bcf SEL wait_100us *** PS- PAD OFF *** pad_off ポート設定 (PAD_OFF) bsf STATUS,RP0 movlwf TRISB, H'FF' PORTB I/O 設定 bsf OPT,N_RBPU PORTB プルアップ抵抗 OFF bcf STATUS,RP0 *** PS- PAD からデータを取得 *** < 返値 > 0 = 成功 非 0 = 失敗 scan pad_on 1. CMD(0x01) -> xxxx set_fsr tmp movlwf INDF, 0x01 scan_byte 2. CMD(0x42) -> ID(0x41) set_fsr id movlwf INDF, 0x42 scan_byte cjne_fl INDF, 0x41, scan_error 3. CMD(0x00) -> 'Z'(0x5A) set_fsr tmp clr INDF scan_byte cjne_fl INDF, 0x5A, scan_error 4. CMD(0x00) -> KEY1 set_fsr key1 clr INDF scan_byte 5. CMD(0x00) -> KEY2 set_fsr key2 clr INDF scan_byte pad_off retlw 0 scan_error pad_off retlw 1 *** PAD データを 1 バイト転送 *** < 前処理 > FSR にデータ位置を指定 INDF にコマンドを指定 < 返値 > INDF: データ < 注意 > 9
cn 使用 scan_byte movlwf cn, 8 scan_byte_lp bcf rr movb rl movb rr CLK INDF CMD, STATUS,C INDF STATUS,C, DAT INDF bsf CLK goto $+1 goto $+1 goto $+1 goto $+1 djnz cn, scan_byte_lp wait_100us ACK をサボる デジQに赤外線信号を送信する send パッドキーの押下状態を調べる clrf coder clrf codel jnb UP, end_up movlwf codel, H'08' 直進 movlwf coder, H'08' end_up jnb DOWN, end_down movlwf codel, H'28' 後進 movlwf coder, H'28' end_down jnb RIGHT, end_right jb UP, righ_fw jb DOWN, righ_bw movlwf codel, H'08' 右旋回 movlwf coder, H'28' goto end_right righ_fw movlwf codel, H'08' 右折前進 movlwf coder, H'05' goto end_right righ_bw movlwf codel, H'28' 右折後進 movlwf coder, H'25' end_right jnb LEFT, end_left jb UP, left_fw jb DOWN, left_bw movlwf codel, H'28' 左旋回 movlwf coder, H'08' goto end_left left_fw movlwf codel, H'05' 左折前進 movlwf coder, H'08' goto end_left left_bw movlwf codel, H'25' 左折後進 movlwf coder, H'28' end_left jnb SQUARE, end_squar e ボタンを押すと二倍速! movf codel,w 回転速度を抽出 andlw 0x1f addwf codel,f 加算して速度を二倍に movf coder,w 回転速度を抽出 andlw 0x1f addwf coder,f 加算して速度を二倍に end_squar e jnb CROSS, end_cross ボタンを押すと三倍速!! 10
movf codel,w 回転速度を抽出 andlw 0x1f addwf codel,f addwf codel,f 加算して速度を三倍に movf coder,w 回転速度を抽出 andlw 0x1f addwf coder,f addwf coder,f 加算して速度を三倍に end_cross jnb CIRCLE, end_circle ボタンを押すと全速!!! movlw 0x1f iorwf codel,f iorwf coder,f end_circle jnb TRIGLE, end_trigle end_trigle jnb R1, end_r1 end_r1 jnb L1, end_l1 end_l1 jnb R2, end_r2 end_r2 jnb L2, end_l2 end_l2 jnb START, end_start end_start jnb SELECT, end_select end_select フォーマットを整える movlw (DIGIQ_ID- 1)< < 6 iorwf coder,f ID 番号を設定 bcf STATUS,C キャリーをクリア rlf codel,f codel: [5-0] ビットを [7-2] ビットに移動 rlf codel,f チェックサムを計算 movlw 0 btfsc coder,0 btfsc coder,1 btfsc coder,2 btfsc coder,3 btfsc coder,4 btfsc coder,5 btfsc coder,6 btfsc coder,7 btfsc codel,2 btfsc codel,3 btfsc codel,4 btfsc codel,5 btfsc codel,6 btfsc codel,7 movwf tmp btfsc tmp,0 チェックサムを設定 bsf codel,1 赤外線信号送信 send_leader リーダ部 11
movlwf i, 8 コード部前半 send_loop1 rlf coder,f btfsc STATUS,C send_bit1 btfss STATUS,C send_bit0 djnz i, send_loop1 rlf coder,f movlwf i, 7 コード部後半 send_loop2 rlf codel,f btfsc STATUS,C send_bit1 btfss STATUS,C send_bit0 djnz i, send_loop2 rlf codel,f rlf codel,f send_trailer トレーラ部 send_leade r send_trailer send_bit0 send_bit1 0.5ms 間のパルスを出力する movlwf cn, 20 _lp movlwf PORTA, 0x00 2 赤外線 LED を ON goto $+1 4 goto $+1 6 goto $+1 8 goto $+1 10 goto $+1 12 nop 13 cycles movlwf PORTA, 0xff 2 赤外線 LED を OFF goto $+1 4 goto $+1 6 12
goto $+1 8 nop 9 djnz cn, _lp 12 cycles 0.5ms 間の無信号状態を作る movlwf cn, 20 _lp movlwf PORTA, 0xff 2 赤外線 LED を OFF goto $+1 4 goto $+1 6 goto $+1 8 goto $+1 10 goto $+1 12 nop 13 cycles movlwf PORTA, 0xff 2 赤外線 LED を OFF goto $+1 4 goto $+1 6 goto $+1 8 nop 9 djnz cn, _lp 12 cycles *** Wait about 100usec (4MHz) *** real wait: 98usec wait_100us movlw 0x1F movwf tm0 wait_100us0 decfsz tm0,1 goto wait_100us0 *** Wait about 8msec (4MHz) *** real wait: 7.695mse c wait_8ms movlw 0xA movwf tm0 wait_8ms0 movlw 0xFF movwf tm1 wait_8ms1 decfsz tm1,1 goto wait_8ms1 decfsz tm0,1 goto wait_8ms0 End END 参考文献 [1] デジ Q( デジプロポ ) 赤外線信号の解析 http://hom e p a g e 2.nifty.com/irhack/digiq/digiq.html [2] プレイステーション PAD/ メモリ インターフェースの解析 http://kaele.com/ ~ k a s hi m a/games/ ps_jpn.txt [3] プレステコントローラのインターフェース http://www2s.biglobe.ne.jp/ ~ h- kamei/eleha n d/pic/ps- pad/ps- pad.html 13