1 学籍番号 氏 名
情報電子工学演習Ⅴ(ハードウェア実技編)
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,ブレッドボード, ジャンパー線, 電池, 電池ボックス, ピンセット,収納ケース, 名札
2
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 の内部構成
3 Fig.4 タイマ1コントロール(T1CON)レジスタの内容 Fig.5 タイマ 1 割込みによるインターバルタイマ実現の例 z 割込み処理ルーチンの所在は、割込みベクタ(04H)で記しておく。 z 割込み処理終了後には、RETFIE 命令を実行してメインへ戻る。 z 割込み後にメインに戻り、以前の割り込まれた処理を継続できるようにするため には、演算レジスタ(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 レジスタ割込み時待機用
4
#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
5 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 パルス波形観察時の記録例 <課題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 No TMR1 設定値 カウント数 Cnt (65536-TM1) 観測周期 T [sec] 周波数 f [Hz] (f=1/T) 16 進 10 進(TM1) 1 2
6
2.明るさの検出
2-1. Cds セル
Cds(Cadmium sulfide cells)セルは、受光面に 光が入射すると、光導電効果がおこり、内部抵抗 が変化する性質をもっている。Fig.8 は、本演習で 使用する Cds セル(MI5527:Macron)について、照度 対抵抗値の関係を調べたものである。 実験室の照明下(机の上)は、およそ 600Lux で Cds セルの抵抗は 1.8kΩ。Cds セルから 10cm の 高さで手をかざして受光面を暗くすると、200Lux 程度の明るさになり、Cds セルの抵抗は 3kΩにな った。 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 変換モジュールの機能 1 10 100 10 100 1000 抵抗値 [k Ω ] 照度 [lux]
7 Fig.10 ADCON0 レジスタ Fig.11 ANSEL レジスタ Fig.12 A/D 変換のプログラミング手順
8 2-3.ソースプログラム2 「A/D 変換処理プログラム」 #DEFINE UA 30H #DEFINE A 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
MOVF ADRESH,0 ;A/D 変換データの読込(W レジスタに移動)
MOVWF A ; LOOPE GOTO LOOPE ;--- ; A/D サンプルホールド用 ;--- WAIT1 MOVLW D'20' MOVWF UA ;UA=20 WAIT1A
DECFSZ UA,1 ;UA を-1 し、ゼロならば GOTO 命令をスキップ GOTO WAIT1A ;ラベル WAIT1A へジャンプ
9 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 明るさ検出回路の動作確認例 電源電圧 VDD= [V] No 測定条件 Vout [V] 1 回目 2 回目 3 回目 1 蛍光灯直下で手をかざさない 2 センサ受光面より 10cm の高さに手をかざす 3 センサ受光面より 5cm の高さに手をかざす 4 センサ受光面より 1cm の高さに手をかざす
10 2-5.明るさ変化に応じた音の発生
A/D 変換器の分解能を 8 ビット、参照電圧を VDDに設定すると、AN0 からのセンサ入力電圧 Vin は、下 記のとおりデジタルデータ Din に変換される。
Din= Vin / VDD * 255 *Din は、小数点以下切り捨てとする
手を Cds セルの受光面より 1cm から 10cm の間で上下させ、「ド」「レ」「ミ」の3つの音を鳴らすには、 2つの判定閾値を設ける必要がある。先の実験結果を参考に判定閾値を定め、D1, D2 とすると、明るさ に応じたドレミ音の決定処理は以下の流れで実現できる。 Fig.14 ドレミ音の決定プログラム z TMR1 データ(音階の周波数)を更新する手続きは、先の割り込み処理ルーチンで利用されて いた T1H と T1L を介して容易に行える。
11
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, 割込み処理ルーチンなどを省略) ---
12 <課題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 へ
;---
13 表4.アセンブラ命令 *1 オペランド部のfは任意のレジスタ,d は格納先の選択(0:W レジスタ,1:fの指定レジスタ), b はビット位置(0~7),k はリテラル(定数データ)を表す。 *2 影響フラグに C, DC, Z などの記載があるものは、その命令の実行によって、STATUS(ステータス)レ ジスタ内の対応するビットが影響を受けることを意味する。 C=1 は演算の結果、最上位にキャリーの発生があったことを表す。 (加算ではその演算結果が 256 以上、減算では 0 以上でキャリーが発生) Z=1は演算の結果がゼロであったことを表す。
14 <参 考・ホームページ> 1.後閑哲也,PIC マイコンではじめる作って遊べるロボット工作,技術評論社,2004. 2.http://www.picfun.com/ , 電子工作の実験室,後閑. (PIC マイコンの機能やプログラミングについて解かりやすく解説) 3.http://www.microchip.co.jp/ , マイクロチップテクノロジージャパン. (MPLAB や PIC12F675 などのデータシートをダウンロード可能) 4.http://esato.net/ex/micom3/ , PIC マイコンによる光学式テルミンの製作,佐藤.