学籍番号 氏 名 情報電子工学演習 Ⅴ( ハードウェア実技編 ) PIC マイコンによる光学式テルミンの製作 新潟工科大学情報電子工学科 課題チェック欄 課題 ドレミ音の発生 (6/28) 回路図 (7/5) フローチャート (7/12) 評価 スケジュール < 内容 > < 集合場所 > 第 1 回 (6/14) PIC マイコンとタイマモジュールの活用 [S2-9] 第 2 回 (6/21) パルスの発生とオシロスコープによる観察 [ 実験室 ] 第 3 回 (6/28) CdS セルを利用した明るさの検出 [S2-9] * 第 4 回 (7/5) 明るさ変化に応じた音の発生 [S2-9] 第 5 回 (7/12) 自由製作 1 [ 実験室 ] 第 6 回 (7/19) 自由製作 2 [ 実験室 ] 第 7 回 (7/26) 発 表 [S2-9] * 第 4 回 (7/5) は助言ルーム終了後,11:00 から開始します 配布部品 PIC12F675, 圧電スピーカ, Cds セル, 抵抗 2.2kΩ, コンデンサ 0.1μF, ブレッドボード, ジャンパー線, 電池, 電池ボックス, ピンセット, 収納ケース, 名札 1
1.PIC マイコン 1-1.PIC12F675 の概要 PIC12F675は 演習 ⅢやⅣで使用した PIC16F648A と同じ 14 ビット長の命令語をもつ RISC 型コンピュータである 8 ピンサイズでありながらも 4MHz のクロックを内蔵し 時間を計測するためのタイマや A/D 変換入力機能を備えている Fig.1 PIC12F675のDIPパッケージ < 端子名 > < 機能 > GP0~GP5: 汎用ディジタル入出力 AN0~AN3:A/D 変換入力 VDD : 電源 + VSS : 電源 -(GND) MCLR : 外部リセット入力 Fig.2 機能の概要 1-2. タイマ 1 と割込み処理タイマ 1 は 前段に 3 ビットプリスケーラを備えた 16 ビットカウンタである 例えば 4MHz のオシレータを 4 分周した内部クロックを使用 (TMR1CS=0) し 3 ビットプリスケーラを 1:4 に設定 (T1CKPS1=1, T1CKPS0=0) すると 4μsec の精度で時間計測が可能になる また このタイマ 1 のカウンタ値が 65535(16 進で FFFFH) を超える ( オーバーフロー ) タイミングで割込みを発生させ 再びカウンタ値を設定する操作を繰り返すことにより インターバルタイマを実現することができる Fig.3 タイマ 1 の内部構成 2
Fig.4 タイマ 1 コントロール (T1CON) レジスタの内容 Fig.5 タイマ 1 割込みによるインターバルタイマ実現の例 割込み処理ルーチンの所在は 割込みベクタ (04H) で記しておく 割込み処理終了後には RETFIE 命令を実行してメインへ戻る 割込み後にメインに戻り 以前の割り込まれた処理を継続できるようにするためには 演算レジスタ (W レジスタ,STATUS レジスタ, PCHL レジスタ ) の内容を割込みに入った時点で保存しておく必要がある 1-3. ソースプログラム1 インターバルタイマ sample01.asm ;----- コンフィグレーションビットの設定と汎用レジスタ ( ユーザメモリ ) の割付 ) -- LIST P=PIC12F675 INCLUDE "P12F675.INC" CONFIG H 11FF &_INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_ON & _MCLRE_OFF & _BODEN_OFF & _CPD_OFF & _CP_OFF ; 内部クロック使用,MCLR 未使用など #DEFINE W_TMP 20H ;W レジスタ割込み時待機用 #DEFINE ST_TMP 21H ;STATUS レジスタ割込み時待機用 #DEFINE T1H 33H ; タイマ 1 上位 8 ビット設定データ保存用 3
#DEFINE T1L 34H ; タイマ 1 下位 8 ビット設定データ保存用 #DEFINE DOUT 35H ;GPIO 出力データ保存用 ;----- リセット & 割込みベクタ ---------------------------------------- ORG 0 ; リセットベクタ GOTO START ORG 4 ; 割込みベクタ GOTO INTR ;------------------------------------------------------------------------- START BCF INTCON,7 ; 割込み不許可 BSF STATUS,RP0 ; バンク 1 に切り替え CALL 3FFH ; 内部オシレータのキャリブレーション MOVWF OSCCAL MOVLW B'00010000' ;GPIO( 汎用ディジタル入出力ポート ) の入出力設定 MOVWF TRISIO ; 0: 出力 1: 入力 MOVLW 080H ;OPTION レジスタの設定 MOVWF OPTION_REG BSF PIE1,TMR1IE ; タイマ 0 の割込み許可 NOP BCF STATUS,RP0 ; バンク 0 に切り替え NOP MOVLW B'00000100' ;GPIO の初期出力 MOVWF DOUT ; GP2 に 1 出力 (High) MOVLW 0FCH ; タイマ 1 上位 8 ビット設定データ MOVWF T1H ; 設定データを保存 MOVWF TMR1H ; カウンタにセット MOVLW 00H ; タイマ 1 下位 8 ビット設定データ MOVWF T1L ; 設定データを保存 MOVWF TMR1L ; カウンタにセット MOVLW B'00000101' ; タイマ1コントロールレジスタ設定データ MOVWF T1CON ; ( プリスケーラ 1:1) 設定 BSF INTCON,PEIE ; 周辺モジュールの割込みを許可 BSF INTCON,GIE ; 割込み許可 MAIN NOP GOTO MAIN ;---------------------------------- ; 割込み処理ルーチン ;---------------------------------- INTR MOVWF W_TMP ; 現在の W レジスタの値を退避 SWAPF STATUS,0 ; 現在の STATUS レジスタの値を退避 MOVWF ST_TMP BCF PIR1,TMR1IF ; タイマ1 割込み検出フラグをクリア MOVF T1H,0 ; 上位 8 ビット設定データを読み出し MOVWF TMR1H ; カウンタに設定 MOVF T1L,0 ; 下位 8 ビット設定データを読み出し MOVWF TMR1L ; カウンタに設定 MOVF DOUT,0 ;GPIO 出力データを読み出し XORLW B'00000100' ;GP2 の出力値を反転 MOVWF DOUT ;GPIO 出力データを保存 MOVWF GPIO ;GPIO 出力 SWAPF ST_TMP,0 ; 割込み前の STATUS レジスタの値を復帰 MOVWF STATUS SWAPF W_TMP,1 ; 割込み前の W レジスタの値を復帰 SWAPF W_TMP,0 RETFIE END 4
1-4. パルスの発生とオシロスコープによる観察 < 手順 > 1) ソースプログラム1をアセンブルして HEX 形式の機械語データを作る 2)PIC ライターを使用して PIC12F675 へ機械語データを書き込む 3) ブレッドボードに Fig.6 の実験回路を作成し オシロスコープでパルス波形の周期を測定する 4)S1-GND 間に圧電スピーカを接続し 音階を確認する 周期 Fig.6 実験回路 1 Fig.7 パルス波形 5) ソースプログラム 1 のタイマ 1 設定データを変更し 再び 1)~4) の作業を繰り返す 表 1 パルス波形観察時の記録例 No TMR1 設定値 16 進 10 進 (TM1) カウント数 Cnt (65536-TM1) 観測周期 T [sec] 周波数 f [Hz] (f=1/t) 1 2 < 課題 1-ドレミ音の発生 > TMR1 を FC00H(10 進で 64512) に設定した場合 下記の計算によりパルス波形の周期を求めることができる ド レ ミ の音を発生させるため TMR1 の設定値を予測せよ < クロック Fosc=4MHz, タイマ 1 のプリスケーラ 1:n=1:1, TMR1=64512(10 進 ) とした場合 > T = (Fosc/4) n (65536-TMR1) 2 = 10-6 1 (65536-64512) 2 = 2048μsec = 2.048msec 表 2 音階の周波数 音名 周波数 [Hz] 音名 周波数 [Hz] ド 523.251 ソ 783.991 レ 587.330 ラ 880.000 ミ 659.255 シ 987.767 ファ 698.456 ド 1046.502 5
2. 明るさの検出 2-1. Cds セル Cds(Cadmium sulfide cells) セルは 受光面に光が入射すると 光導電効果がおこり 内部抵抗が変化する性質をもっている Fig.8 は 本演習で使用する Cds セル (MI5527:Macron) について 照度対抵抗値の関係を調べたものである 実験室の照明下 ( 机の上 ) は およそ 600Lux で Cds セルの抵抗は 1.8kΩ Cds セルから 10cm の高さで手をかざして受光面を暗くすると 200Lux 程度の明るさになり Cds セルの抵抗は 3kΩになった 抵抗値 [kω] 100 10 1 10 100 1000 照度 [lux] Fig.8 MI5527の特性 2-2.A/D 変換入力機能 PIC12F675 は 4 チャンネルの (AN0~AN3) 入力切替え可能な 10 ビット分解能の A/D 変換器をもつ A/D 変換の開始や終了の検査 チャンネル指定には ADCON0 レジスタを使用し クロックやポートの機能選択には ANSEL レジスタを使用する 例えば A/D 変換クロックとして Fosc/2 を選択し AN3 をアナログ入力として使用するには まず ANSEL に B 00001000 の値を設定し 変換開始時には ADCON0 に B 00001111 の値 ( 変換データを左詰め 参照電圧を VDD) を設定する必要がある Fig.9 A/D 変換モジュールの機能 6
Fig.10 ADCON0 レジスタ Fig.11 ANSEL レジスタ Fig.12 A/D 変換のプログラミング手順 7
2-3. ソースプログラム 2 A/D 変換処理プログラム #DEFINE UA #DEFINE A 30H 36H ;---- ( コンフィグレーション, 割込みベクタ等省略 ) ---- START BCF INTCON,7 ; 割込み不許可 MOVLW 07H ; MOVWF CMCON ; コンパレータ機能オフ BSF STATUS,RP0 ; バンク 1 に切り替え MOVLW B'00001000' ;A/D 変換クロック, アナログ入力端子の設定 MOVWF ANSEL ;A/D Clock=FOSC/2, Analog pin - AN3(3) Only MOVLW B'00010000' ;GPIO の入出力設定 MOVWF TRISIO ; MOVLW 080H ;OPTION レジスタの設定 MOVWF OPTION_REG BCF STATUS,RP0 ; バンク 0 に切り替え NOP LOOP MOVLW B'00001101' ;A/D 変換データの形式, チャンネル等の設定 MOVWF ADCON0 CALL WAIT1 ; サンプルホールド (>20μsec) BSF ADCON0,1 ;A/D 変換開始 ADCHECK BTFSC ADCON0,1 ;A/D 変換終了検査 GOTO ADCHECK LOOPE MOVF ADRESH,0 ;A/D 変換データの読込 (W レジスタに移動 ) MOVWF A ; GOTO LOOPE ;-------------------------------------- ; A/D サンプルホールド用 ;-------------------------------------- WAIT1 MOVLW D'20' MOVWF UA ;UA=20 WAIT1A DECFSZ UA,1 ;UA を-1 し ゼロならば GOTO 命令をスキップ GOTO WAIT1A ; ラベル WAIT1A へジャンプ RETURN 8
2-4. Cds セルを利用した明るさ検出 Cds セルを利用した明るさ検出の方法として Fig.13 の回路の使用が考えられる 実際に手をかざして受光面の明るさを変化させた場合 Vout はどのように変化するか観察を行う < 手順 > 1) ブレッドボードに Fig.13 の回路を作成する 2) デジタルマルチメータを使い まず電源電圧 (VDD) を確認する 次に各種条件において出力電圧 Vout を測定する < 課題 2- 回路図 > Vout を PIC12F675 の AN0(GP0) に接続し Cds セルによる明るさレベルの判定を実現したい Fig.13 に PIC12F675 を加えた回路図を作図せよ Fig.13 実験回路 2 表 3 明るさ検出回路の動作確認例 No 測定条件 1 蛍光灯直下で手をかざさない 2 センサ受光面より 10cm の高さに手をかざす 3 センサ受光面より 5cm の高さに手をかざす 4 センサ受光面より 1cm の高さに手をかざす 電源電圧 VDD= [V] Vout [V] 1 回目 2 回目 3 回目 9
2-5. 明るさ変化に応じた音の発生 A/D 変換器の分解能を 8 ビット 参照電圧を VDD に設定すると AN0 からのセンサ入力電圧 Vin は 下記のとおりデジタルデータ Din に変換される Din= Vin / VDD * 255 *Din は 小数点以下切り捨てとする 手を Cds セルの受光面より 1cm から 10cm の間で上下させ ド レ ミ の 3つの音を鳴らすには 2つの判定閾値を設ける必要がある 先の実験結果を参考に判定閾値を定め D1, D2 とすると 明るさに応じたドレミ音の決定処理は以下の流れで実現できる Fig.14 ドレミ音の決定プログラム TMR1 データ ( 音階の周波数 ) を更新する手続きは 先の割り込み処理ルーチンで利用されていた T1H と T1L を介して容易に行える 10
2-6. ソースプログラム3 明るさに応じたドレミ音の決定 sample03.asm #DEFINE D1 XXH #DEFINE D2 XXH ; 判定閾値 ( XX は不確定な部分 ) #DEFINE W_TMP 20H ;W REGISTER STORE #DEFINE ST_TMP 21H ;STATUS REGISTER STORE #DEFINE UA 30H #DEFINE T1H 33H ; タイマ 1 上位 8 ビット設定データ保存用 #DEFINE T1L 34H ; タイマ 1 下位 8 ビット設定データ保存用 #DEFINE DOUT 35H ;GPIO 出力データ保存用 #DEFINE A 36H ;---- ( コンフィグレーション, 割込みベクタ, A/D 初期設定等省略 ) ---- LOOP MOVLW B'00000001' ;A/D 変換入力の設定 MOVWF ADCON0 CALL WAIT1 BSF ADCON0,1 ;A/D 変換開始 ADCHECK BTFSC ADCON0,1 ;A/D 変換終了検査 GOTO ADCHECK MOVF ADRESH,0 MOVWF A ;A/D 変換データ ( センサ入力電圧 ) を A に保存 ;------------------------------------------- MOVLW D1 ; 閾値 D1 を W レジスタに移動 SUBWF A,0 ;A - Wreg BTFSC STATUS,0 ;C フラグが 0( 負 ) なら次の命令をスキップ GOTO TMR1SET1 ;A D1 の場合は TMR1SET1 へ ;------------------------------------------- MOVLW D2 ; 閾値 D2 を W レジスタに移動 SUBWF A,0 ;A - Wreg BTFSC STATUS,0 ;C フラグが 0 なら次の命令をスキップ GOTO TMR1SET2 ;D1>A D2 の場合は TMR1SET2 へ ;=========================================== TMR1SET3 ; ミ の音を発生する TMR1 データを指定 MOVLW XX ; XX は不確定なデータ MOVWF T1H MOVLW XX MOVWF T1L GOTO LOOP TMR1SET2 ; レ の音を発生する TMR1 データを指定 MOVLW XX MOVWF T1H MOVLW XX MOVWF T1L GOTO LOOP TMR1SET1 ; ド の音を発生する TMR1 データを指定 MOVLW XX MOVWF T1H MOVLW XX MOVWF T1L GOTO LOOP ;------ (WAIT1, 割込み処理ルーチンなどを省略 ) ------- 11
< 課題 3- フローチャート > ソースプログラム 3 による方法は 音が切り替わる位置を捉え難く また周囲光の影響を受け誤動作しやすい そこで この判定処理に対してシュミットトリガを導入し 入力電圧が上昇するときと下降するときで判定レベルが変わるようにした ソースプログラム 4 は その 1 例である このプログラムの流れをフローチャートで表し D1S,D2S の値としてどのような値を設定すべきかを検討せよ 2-7. ソースプログラム 明るさに応じたドレミ音の決定 ( シュミットトリガ入力 ) #DEFINE D1 XX #DEFINE D2 XX ; 判定閾値 ( XX は不確定なデータ ) #DEFINE D1S XX #DEFINE D2S XX #DEFINE W_TMP 20H ;W REGISTER STORE #DEFINE ST_TMP 21H ;STATUS REGISTER STORE #DEFINE UA 30H #DEFINE T1H 33H ; タイマ 1 上位 8 ビット設定データ保存用 #DEFINE T1L 34H ; タイマ 1 下位 8 ビット設定データ保存用 #DEFINE DOUT 35H ;GPIO 出力データ保存用 #DEFINE A 36H ;---- ( コンフィグレーション, 割込みベクタ, A/D 初期設定等省略 ) ---- LOOP MOVLW B'00000001' ;A/D 変換入力の設定 MOVWF ADCON0 CALL WAIT1 BSF ADCON0,1 ;A/D 変換開始 ADCHECK BTFSC ADCON0,1 ;A/D 変換終了検査 GOTO ADCHECK MOVF ADRESH,0 MOVWF A ;A/D 変換データ ( センサ入力電圧 ) を A に保存 ;------------------------------------------- MOVLW D1 ; 閾値 D1 を W レジスタに移動 SUBWF A,0 ;A - Wreg BTFSC STATUS,0 ;C フラグが 0( 負 ) なら次の命令をスキップ GOTO TMR1SET1 ;A D1 の場合は TMR1SET1 へ ;------------------------------------------- MOVLW D1S ; 閾値 D1S を W レジスタに移動 SUBWF A,0 ;A - Wreg BTFSC STATUS,0 ;C フラグが 0( 負 ) なら次の命令をスキップ GOTO LOOP ;D1> A D1S の場合は LOOP へ ;------------------------------------------- MOVLW D2 ; 閾値 D2 を W レジスタに移動 SUBWF A,0 ;A - Wreg BTFSC STATUS,0 ;C フラグが 0 なら次の命令をスキップ GOTO TMR1SET2 ;D1S> A D2 の場合は TMR1SET2 へ ;=========================================== MOVLW D2S ; 閾値 D1S を W レジスタに移動 SUBWF A,0 ;A - Wreg BTFSC STATUS,0 ;C フラグが 0( 負 ) なら次の命令をスキップ GOTO LOOP ;D2 > A D2S の場合は LOOP へ ;------------------------------------------- ;----- (TMR1SET3~TMR1SET1, WAIT1 などを省略 ) ------ 12
表 4. アセンブラ命令 *1 オペランド部のfは任意のレジスタ,d は格納先の選択 (0:W レジスタ,1:fの指定レジスタ), b はビット位置 (0~7),k はリテラル ( 定数データ ) を表す *2 影響フラグに C, DC, Z などの記載があるものは その命令の実行によって STATUS( ステータス ) レジスタ内の対応するビットが影響を受けることを意味する C=1 は演算の結果 最上位にキャリーの発生があったことを表す ( 加算ではその演算結果が 256 以上 減算では 0 以上でキャリーが発生 ) Z=1は演算の結果がゼロであったことを表す 13
< 参考 ホームページ> 1. 後閑哲也,PIC マイコンではじめる作って遊べるロボット工作, 技術評論社,2004. 2.http://www.picfun.com/, 電子工作の実験室, 後閑. (PIC マイコンの機能やプログラミングについて解かりやすく解説 ) 3.http://www.microchip.co.jp/, マイクロチップテクノロジージャパン. (MPLAB や PIC12F675 などのデータシートをダウンロード可能 ) 4.http://esato.net/ex/micom3/, PIC マイコンによる光学式テルミンの製作, 佐藤. 14