序文

Similar documents
スライド 1

,, ( ) 5 ma ( ) 5V V 5 6 A B C D E F G H I J , LED LED, LED, 7 LED,, 7 LED ( ) V LED VCC 5V 7 LED VCC f g f a g b a b c e d e d c dp dp VCC (

スライド 1

Microsoft Word - 4章.doc

正転時とは反対に回転する これが逆転である 図 2(d) の様に 4 つのスイッチ全てが OFF の場合 DC モータには電流が流れず 停止する ただし 元々 DC モータが回転していた場合は 惰性でしばらく回転を続ける 図 2(e) の様に SW2 と SW4 を ON SW1 と SW3 を O

も 常に 2 つのコイルに電圧を印加する 2 層励磁方式や 1 つのコイルと 2 つのコイルに交互に電圧を印 2

PowerPoint プレゼンテーション

3 4 PIC

Microsoft PowerPoint - 工学ゼミⅢLED1回_2018

3 1EEPROMElectrically Erasable PROM PROMProgrammable ROM 2 EEPROM 3

Microsoft PowerPoint pptx

untitled

実習内容 PIC18C242 のポート B に接続した LED を点滅させます ( 他の実習と同じ内容です ) 8 個の LED に表示される値が +3 ずつインクリメントします MPLAB を使って MPASM アセンブラのソース ファイルをアセンブルします MPLAB とソース ファイルは配布し

PIC

スライド 1

arduino プログラミング課題集 ( Ver /06/01 ) arduino と各種ボードを組み合わせ 制御するためのプログラミングを学 ぼう! 1 入出力ポートの設定と利用方法 (1) 制御( コントロール ) する とは 外部装置( ペリフェラル ) が必要とする信号をマイ

untitled

また RLF 命令は 図 2 示す様に RRF 命令とは逆に 各ビットを一つずつ 左方向に回転 ( ローテイト ) する命令である 8 ビット変数のアドレスを A とし C フラグに 0 を代入してから RLF A,1 を実行すると 変数の内容が 左に 1 ビットシフトし 最下位ビット (LSB)

A 既製のプロジェクトがある場合

1.1 ラベル ラベルはカラム 1 から始まらなければならない ラベルの後にはコロン スペース タブ 改行が続いてよい ラベルはアルファベットかアンダーバーで始まり 英数字 アンダーバー クエスチョンマークを含んでよい ラベルは 32 文字までである デフォルトではこれらは大文字と小文字を区別するが

SDC_SDIO_STM32F4 の説明 2013/09/17 SDIO インターフェースで SD カードをアクセスするプログラムのプロジェクトサンプルです FAT でファイルアクセスするために FatFs( 汎用 FAT ファイルシステム モジュール ) を使用しています VCP(USB 仮想 C

目次 *.PRO という拡張子のバックアップデータがある... 3 *.MEM という拡張子のバックアップデータがある... 6 *.DXX という最初に D がある拡張子のバックアップデータがある... 9 *.GPM という拡張子のバックアップデータがある LXX という最初に L

スライド 1

Microsoft Word - PIC-USBマイコンボード_v1-02@WEB公開用資料.docx

Microsoft PowerPoint - RL78G1E_スタータキットデモ手順_2012_1119修正版.pptx

今回の内容 マイクロコンピュータにおけるプログラミング 機器の中に組み込まれる ロボット 自動車 家電 などいろいろな分野で利用 プログラムを用いて外部の装置を動作させる マイコンから の出力 発光ダイオード Light Emitting Diode 液晶ディスプレイ Liquid Crystal

ここをクリックしてダウンロードする ダウンロードした zip ファイルを解凍する とインストーラが現れます インストーラを 起動してインストールを開始しましょう イ ンストーラの [ Next > ] ボタンを押してい けばインストールできます ライセンスの画面では I accept the ter

1 1 Arduino とは Arduino アルドゥイーノ は ワンボードマイコンの一種で オープンソースハードウェアであ り 組み立て済みの基板を購入することもできるほか 誰でも自分の手で Arduino を組み立てる ことができます USBコネクタでPCと接続して利用します デジタルポートとア

RsMulti の取扱説明 「RS232C で直接接続する(LAN を使用しない場合)」

1.Sound Engine Free の起動と 設定 Sound EngineFree を起動すると右下の画面が開きます Sound Engine Free のアイコン 起動時更新のチェック のチェックを外す 通常 録音はインターネットに接続されていない環境でおこないます そのような環境で Sou

(Microsoft Word - \214\264\215e B_\217\221\202\253\215\236\202\335\225\224.docx)

C プログラミング演習 1( 再 ) 2 講義では C プログラミングの基本を学び 演習では やや実践的なプログラミングを通して学ぶ

Welcome-Kit ~STM32L4-Nucleo~

CommCheckerManual_Ver.1.0_.doc

PIC (, 2, 3 ) PIC ( 1, 2, 3 ) 1 2 (, 2 ) PIC ( 1, 2 ) 2.1 (p.34) define #define (define ) (p.61) 1 30 (RD 7 /P SP 7 ) 32 (V DD ) IC

Microsoft Word - Mac版 Eclipseの導入と設定.docx

LAeq(LX)を10分毎に24時間繰り返し測定し自動保存する

スクールCOBOL2002

まず,13 行目の HardwareTimer Timer(1); は,HardwareTimer というクラスを利用するという宣言である. この宣言によって Timer というインスタンスが生成される.Timer(1) の 1 は,OpenCM に 4 個用意されているタイマのうち,1 番のタイマ

製åfi†æ¡‹åƒ–.xlsx

やさしくPDFへ文字入力 v.2.0

Microsoft Word - ETDオプション付Orbitrap_停止と起動

<4D F736F F D D834F D B834C815B837B815B D836A B A2E646F6378>

目次 ページ 1. 本マニュアルについて 3 2. 動作環境 4 3. ( 前準備 ) ライブラリの解凍と保存 5 4. モデルのインポート 6 5. インポートしたモデルのインピーダンス計算例 8 6. 補足 単シリーズ 単モデルのインポート お問い合わせ先 21 2

1. 新規プロジェクト作成の準備新規プロジェクトのためのフォルダを用意して そこにプロジェクトを作成します [ 新しいフォルダー ] をクリックして希望のフォルダに新しいフォルダを作成します この例では TrST_F401N_BlinkLD2 というフォルダを作成しました TrST_F401N_Bl

SLCONFIG の操作 JF1PYE Ⅰ. PC と slconfig の通信設定 Ⅱ. Slconfig の操作 Ⅲ. 端末ソフトによる Command 機能 Ⅳ. slconfig 実行形式プログラムの作成 Ⅴ. 端末ソフト Tera Term のダウンロード インストー

4 本体の入力を USB-B 端子に対応する入力に切り換える 下記の画面表示になります 手順 8 の画面になるまでしばらくお待ちください 5 解凍したフォルダー内にある "Setup.exe" をダブルクリックして実行する InstallShield ウィザードが表示されます xxxxxxxxxx.

:30 18:00 9:30 12:00 13:00 17:00

PIC18 Istructios PIC16, PIC x Microchip Techology Icorporated. All Rights Reserved. PICmicro PIC18 52

スライド 1

Studuino ライブラリ環境設定Windows編

Microsoft Word - 工学ゼミ3_テキスト

CS-DRC1操作説明書

改訂履歴 改訂日付 改訂内容 2014/11/01 初版発行 2017/01/16 Studuino web サイトリニューアルに伴う改訂 2017/04/14 Studuino web サイトリニューアルに伴うアクセス方法の説明変更 2018/01/22 Mac 版インストール手順変更に伴う改訂

Microsoft Word - XPC4ソフトマニュアル.doc

Studuinoライブラリ環境設定Mac編

ZVH_VIEWER

Microsoft Word - Orbitrapシリーズ_停止と起動

4 本体の入力を USB-B 端子に対応する入力に切り換える 下記の画面表示になります 手順 8 の画面になるまでしばらくお待ちください 5 解凍したフォルダー内にある "Setup.exe" をダブルクリックして実行する InstallShield ウィザードが表示されます xxxxxxxxxx.

目次 2 1 PC Control Utility PD 1 について 動作環境

HDLトレーナーサンプルプログラム説明書

Microsoft Word - Ladder Tool 使çfl¨ã…žã…‰ã…¥ã‡¢ã…«ã…©ã…•ã…¼ã†ªã†Š_ docx

セミオート追尾再生卓 取扱説明書

プログラマブル LED 制御モジュール アプリ操作説明書 プログラマブル LED 制御モジュール設定アプリ操作説明書 適用モジュール 改訂番号 エレラボドットコム 1

3 アドレスバーに URL を入力し ( 移動ボタン ) をタップします 入力した URL のホームページに移動します ネットワークへのログオン 画面が表示された場合は ユーザー名 を確 認し パスワード を入力して OK をタップしてください ホームページがうまく表示されないときは Opera B

スライド 1

AI1608AYUSB手順V3

<4D F736F F D D834F B835E5F8FDA8DD C E646F63>

EDITOR を起動する 1. MS-3 をパソコンと USB ケーブルで接続し MS-3 の電源を入れます MS-3 とパソコンを USB ケーブルで接続しなくても ライブセットの編集はできます ただし パッチをエディットした結果を保存することはできません 保存にはパソコンとの接続が必要です パッ

Spectrum Setup 画面が現れます Install Tab の各項目に マウス カーソルを合わせると 項目の詳細説明 が表示されます 通常はデフォルトの選択で問題ありませんが LabVIEW Driver Matlab Driver が必要な場合は 選択します 6. Install sel

Studuinoプログラミング環境

Microsoft Word - VBA基礎(6).docx

Outlook2010 の メール 連絡先 に関連する内容を解説します 注意 :Outlook2007 と Outlook2010 では 基本操作 基本画面が違うため この資料では Outlook2010 のみで参考にしてください Outlook2010 の画面構成について... 2 メールについて

2015/04/01 改定 オムロン DeviceNet ユニット CJ1W-DRM21 に関するコンフィグレーション作業について 1. 概要 DeviceNet ユニット CJ1W-DRM21 を装着したオムロン製 CJ2 シリーズと WAGO-I/0-SYSTEM DeviceNet 対応バスカ

プレゼンタイトルを入力してください

Taro-82ADAカ.jtd

USB モジュール

ReTRY HUB

余白 : 上下 25.4mm, 左右 19mm (Word2012 での やや狭い 設定 ) マイコンプログラミング演習 I レポート 1 実験日 提出日 回路構築 /LED を用いた I/O 制御 [16pt] 班員と担当責任者第 0 班レポート作成

ST-LINK/V2-1 への Upgrade V /10/07 ST-LINK/V2-1 USB driver のインストールおよび ST-LINK/V2-1 の Upgrade について説明します ST-LINK/V2-1 USB driver をインストールしてから ST-LIN

プログラミング基礎

MODBUS ユーザーズマニュアル 페이지 1 / 23

NJU72501 チャージポンプ内蔵 圧電用スイッチングドライバ 概要 NJU72501はチャージポンプ回路を内蔵し 最大で3V 入力から 18Vppで圧電サウンダを駆動することができます このチャージポンプ回路には1 倍 2 倍 3 倍昇圧切り替え機能を備えており 圧電サウンダの音量を変更すること

MINI2440マニュアル

パーツリスト 組み立て前にすべてのパーツがそろっているかご確認ください 種類 品番 数 種類 品番 数 基板 I2C LCD 1 コンデンサ 0.1uF (104) 積層セラミック 1 IC ATtiny コンデンサ 10uF 電解 1 半固定抵抗 10~50kΩ 1 コネクタ IC ソ

64 松尾邦昭 2. 無線送受信装置 SANWA 製のラジコン送受信装置は, その機能性の豊富さと価格の安さを理由に多くのラジコン ファンに愛用されており, 今回使用した VG6000は, チャンネル数が6チャンネルあり, ヘリコプター制御用に設計 開発され使用されているものだが, 我々はこれをロボ

FTP とは? FTP とは File Transfer Protocol の略です 日本語訳すると ファイルを転送するときの決まり事という意味です 飛行機が世界中の空港で離陸 着陸できるのは 決められた手順 通信方式 が存在するからです パイロットでない私たちが聞いても よく分からないやり取りです

スライド 1

monologue Sound Librarian 取扱説明書

医用工学概論  Medical Engineering (ME)   3年前期の医用工学概論実習と 合わせ、 医療の現場で使用されている 医用機器を正しく安全に使用するために必要な医用工学(ME)の 基礎知識を習得する。

ETCB Manual

AKI-PIC16F877A開発キット (Ver1

Taro11-…e…L…X…g.jtd

2. 仕様 電源 :USB バスパワー (USB 入力の 5V 電源を使用します ) 出力 : 3.5mm ステレオジャック アナログステレオ出力 最大 20mArms 対応ヘッドホンインピーダンス 1Ω~500Ω RCA ピンジャック アナログ 2ch 出力 (L R) ラインレベル ヘッドホンア

アナログ回路 I 参考資料 版 LTspice を用いたアナログ回路 I の再現 第 2 回目の内容 電通大 先進理工 坂本克好 [ 目的と内容について ] この文章の目的は 電気通信大学 先進理工学科におけるアナログ回路 I の第二回目の実験内容について LTspice を用

SAC (Jap).indd

Microsoft Word - HOBO雨量専用説明書_v1.1.doc

目次 1.BT UPDATER PRO を Windows PC へインストールする BT UPDATER PRO を起動する 操作説明 (1) 操作説明 (2) インカムのファームウェア ( ソフトウェア ) をアップデートする

1. A/D 入力について分解能 12bit の A/D コンバータ入力です A/D 入力電圧とディジタル値との対応は理論上 入力電圧 0V : 0 入力電圧 +3V : 4095 です 実際はオフセットと傾きがあり ぴったりこの数値にはなりません 2. A/D 入力に使用する信号 STM32L_A

Midland BT シリーズファームウェアのアップデート方法 手順 (1)BT UPDATER の PC へのインストール 1Web サイトより BTUpdaterSetup_(VersionNo.).exe をダウンロードしてください 2 上記 1 でダウンロードした BTUpdaterSetu

Transcription:

序文 マイクロコントローラを勉強する際 原理だけではなく実験することが必要です 手を動かし 実践に問題を解決することによってマイコンの知識を理解し使いこなせるようになります この実験マニュアルにはプログラムを書くのをはじめ ハードウェアの回路の知識までもたらします この実験マニュアルに説明してあるほとんどの実験は PIC マイコンの CP-PIC V3.0/V3.0 EXP に対象し 実験するのに Assembly と Basic 言語を使うことになります Assembly 言語を使う場合 PIC16F877 と PIC18F458 の CPU 両方対応しますから我々の実験の説明は 16F877 用と 18F458 用のプログラムを分けています 一方 Basic 言語を使う場合同じプログラムで PIC16F877 と PIC18F458 の CPU 両方対応します プログラムをコンパイルするときに CPU の番号を選ぶことで決めます さまざまな実験は基本的な電子デバイスをマイコンと組み合わせます たとえば 抵抗器 (Resistor) ダイオード 発光ダイオード(LED) 7-SEGMENT KEY SWITCH STEPPER MOTOR トランジスター(ET-HARDWARE KIT V1 セットに含まれています ) そして LCD したがってマイコンの知識だけではなくさまざまなデバイスのことも見つけるようになります この実験マニュアルの知識によって今後さまざまな目的に貢献できるように我々が願っています 注意 Assembly 言語ソフト (MAPLB) Basic 言語ソフトは 本製品には附属していません Assembly 言語ソフト (MAPLB) は マイクロチップジャパンホームページ http://www.microchip.co.jp/ で無償で入手できます Basic 言語ソフトは http://www.melabs.com/index.htm 等で販売されています - 1 -

目次項目 1. 実験の原理 - 抵抗器 (Resister) -ダイオード - 発光ダイオード (LED) -7-SEGMENT -4 x 3 型 KEY SWITCH -STEPPER MOTOR -トランジスタ -LCD 2. 実験する前の案内 3. 実験 1 Self Test Board 4. 実験 2 OUTPUT ポートの使い方 5. 実験 3 走る光 6. 実験 4 INPUT ポートの使い方 7. 実験 5 7-Segment の使い方 8. 実験 6 7-Segment とスイッチをともに動作 9. 実験 7 Mini Speaker/Buzzer 10. 実験 8 Keyboard Matrix 4x3 11. 実験 9 Analog to Digital Converter 12. 実験 10 STEPPER MOTOR 13. 実験 11 LCD Module 14. 実験 12 外部のインタラプト ( 割り込み ) 15. 付属 - 2 -

1. 実験の原理 実験する前にさまざまなデバイスの基本的な知識を知ることが大事です 別々のデバイ スの使い方 特徴及び役目を承知する上で実験を行うことが勧めます 抵抗器 (Resistor) 抵抗器は基本的な電子デバイスであり さまざまな色 形 種類があります それにしてもすべては同じ役目つまり電流を抵抗することです 抵抗器の種類は次のように分けられます 一定抵抗器 (Fixed Resistor) 一般によく見られる抵抗器はこの一定抵抗器であります 下のような形そして記号になります 抵抗器の低効率の単位はオーム (Ω) で1オームは1 V の電圧を抵抗器を通されて1 A の電流が流されたらその抵抗器の低効率が1オームと意味します 低効率を測定する装置は電気抵抗計 ( オームメーター ) と呼びます 横にある色線はその抵抗器の低効率を表します 色の意味 横にある色線は低効率そしてその誤差をあらわします 4 つの色線と 5 つの色線下の図の ようにあります - 3 -

色と位置の意味 低効率を読む例 図 3 抵抗器の色と位置の意味 色線 A B C D 色 茶色 黒 オレンジ 金色 数値 1 0 3 誤差 5% A と B 線は有効数字を表し C 線はオレンジなので乗数が 3 つまり 10 3 をかけます よって この抵抗器の抵抗性は 10 x 10 3 = 10,000Ω 誤差 5% です - 4 -

Packet 抵抗器一定抵抗器の一種で一定抵抗器を一箇所に集めて抵抗器の足を取り付けるのにより使いやすくなります 同じ Packet であれば低効率が一定で一つの Packet には使い道によって個数が異なります Packet 抵抗器の足の個数を1で引いてその Packet に入っている一定抵抗器の個数になります Packet 抵抗器には Common 足 1 個が既にあるわけです 変更可能な抵抗器ラジオ テレビの音量 電球の明るさを調整するなど頻繁に低効率を変更する電子回路におけて変更可能な抵抗器を使います 低効率の値を調整できるようにこの抵抗器につまみとつける軸が付いています ある種類軸がなくて U 字のような形でドライバーでネジを回すことによって低効率を調整します - 5 -

さまざまな抵抗器の記号 U 字型変更可能な抵抗器 図 5 抵抗器の記号と U 字型抵抗器 ダイオードダイオードは 1 接触面型の半導体素子でダイオードを作る材料がシリコン ( ケイ素 ) とゲルマニウムです ケイ素でできたダイオードは 0.7V のバイアスの圧力に対応し ゲルマニウムは 0.3V の電圧に対応しています ダイオードの形 ダイオードの記号 図 6 ダイオードの形と記号 - 6 -

矢印はアノード (+ 極性 )P 側をあらわします 矢印の方向はホールの動き向きで垂直線はカソード ( 極性 )N 側をあらわします したがって ダイオードが前向きバイアスにされるか逆向きバイアスにされるか簡単に分かります アノード極の電圧がカソードよりプラスになる場合は順方向バイアスにされています 逆に アノードの圧力がカソードより低い場合は逆方向バイアスにされていると意味します バイアスの性質は下の表のようになります 順方向バイアス逆方向バイアス 1. 電流がダイオードを通っている 1. 電流がダイオードを通らない 2. ダイオードの抵抗率が非常に低い 2. ダイオードの抵抗が非常に高い 3. 一般にはダイオードが短絡している 3. 一般には回路が切断する 順方向バイアス Short Circuit 逆方向バイアス Open Circuit 図 7 さまざまなバイアス - 7 -

発光ダイオード (LED:Light Emitting Diode) 発光ダイオードいわゆる LED(Light Emitting Diode) さまざまな目的で用いられています 主にほかのデバイスの動作を表示するために使用されます LEB の構造は半導体で 2 つの極 + 極性を持つ極はアノード A で表し - 極性を持つ極はカソード K で表します 発光ダイオード (LED) 図 8 LED とその記号 LED の記号 使用するときにアノード極を電圧の高い側とつなげ カソードを低い側とつけます 図 9 不正のつなげ方 電流が通るときにダイオードの電圧が 1.7 順方向バイアスのときダイオードの低効率が非常に小さいため 直流電圧 12V を LED を流させれば LED を通る電流が多すぎて壊れる危険があります それを避けるために直列に抵抗器をアノードと電源の+ 極の間またはカソードと電源の - 極の間に抵抗器をつけて電流が流しすぎないように LED に適するような低効率を調整します - 8 -

図 10 正確のつなげ方 図 10 は電流が LED を流し過ぎないようにさせます その抵抗器はアノード側かカソード側どちらでも可能です 上に述べたように LED を通る電圧は 1.7V だから抵抗器の低効率によって LED の通る電流を計算することができます 電流を導入するときに LED の低効率が非常に低いため つけた抵抗器の低効率と比べ無視することができます ところが LED での電圧が 1.7V から抵抗器での電圧が 5V のではなくて 3.3V に減少します したがって 抵抗器を通る電流は 3.3/330 ~ 10 ma この電流が抵抗器と LED 同じです LED に適する電流は色 製作者などによって異なりますから LED の詳細をを知りたい場合は製作工場に聞いてください 実践に LED が表示するデバイスとして扱う場合が多いですから正確な電流値でなくても LED が壊れないようにしておけばよいです 一般に 10-20mA が最適です LED はマイコンと共に使うことが多いで LED を通る電流をコントロールするのにマイコンを使用します その制御は主に 2 種類に電流の上り側 (SOURCE CURRENT) と下り側 (SINK CURRENT) に分けます 電流の上り側を制御する (SOURCE CURRENT) LED のカソード足をグランド (- 極性 ) にしてアノードの+ 極の電流をコントロールします この手法によって電流が CPU または GATE の足から電流を流して LED に供給します 図によって P1.0 を論 - 9 -

理 (logic)0 にして NOT GATE の出力 (OUTPUT) の足 2 が論理 (logic)1 になります よって 論 理 1 の電圧は 5 V で NOT GATE から電流が流れ 抵抗器と LED を通過してグランドに入り ます そのとき LED が点灯します 電流の下り側を制御する (SINK CURRENT) LED のアノードの足を電源の+ 極とつないでカソードから下り側の電流を制御します この手法によって電流が電源から出発し LED を通し CPU または GATE で回路が完了になります 下図のように P1.0 を理論 (logic)1として NOT GATE の出力 (OUTPUT) を 0( 電圧 0 V) にます よって電流が LED を通過して NOT GATE でグランドに入ります 図 12 電流の下り側の制御 - 10 -

7-SEGMENT LED の項目で述べたようにさまざまな目的で LED を使うことができますが数字を表すことができないのが大きな限界であります したがって 7-SEGMENT という電子デバイスを使用すれば 0-9 の数字さらにある英語の文字までも表示することができます 7-SEGMENT の構造はただ LED を改めに配置して数字そして文字を表示できるようにするものです 7-SEGMENT 一つに7つの LED が組み合わせます ところが現在一つを追加して 8 部の LED でできていますがまだその名前が変わらず 7 SEGMENT と呼びます 図 13 カソード共通 TOS-33H5161AE 番の 7-SEGMENT 図によって 7-SEGMENT は 8 本のデータ足があって共通足一本 その共通足が 2 種類 あります + 足 (Common Anode) と - 足 (Common Cathode) 図 14 Common Anode 型の 7-SEGMENT の構造 - 11 -

図 15 Common Cathode 型の 7-SEGMENT の構造 7-SEGMENT の制御 7-SEGMENT は LED でできたものですから7-SEGMENT の制御は LED と同様に上り電流 (Current Source) の制御と下り電流 (Current Sink) の制御に分けます 下り電流の制御下り電流の制御に対応する 7-SEGMENT は+の共通足を持つ つまり Common Anode 型の 7-SEGMENT のみです 共通足を+ 極にそして- 極 ( グランド ) をデータ足 (a,b,c,d,e,f,g,dp) につなげます ( 下図参照 ) 図 16 下り電流を制御する 7-SEGMENT のつなげ方 上り電流の制御上り電流の制御に対応する 7-SEGMENT は-の共通足を持つ つまり Common Cathnde 型の 7 - SEGMENT のみです 共通足 ( グランド ) を - 極にそして + 極をデータ足 (a,b,c,d,e,f,g,dp) につなげます ( 下図参照 ) - 12 -

図 17 上り電流を制御する 7-SEGMENT のつなげ方 KEY SWITCH 4x3 このようなスイッチのつなげ方はマトリックス (Matrix Switch) と呼びます スイッチは横と縦に配置し縦軸は 列 (column) とそして横軸は 行 (Row) といいます したがって 個々のスイッチは列と行の位置をつけますから今後スイッチを増やしてもソフトを少し改良してれば対応できることがもっとも長所です 図 18 マトリックス型配置キースイッチ - 13 -

STEPPER MOTOR( ステッピング モータ ) 電源を入れればこのモータがステップ ( 一歩 ) に回転します 右回りか左周りかはモータのつなぎ ( 極性 ) によって変わります STEPPER MOTOR( ステッピング モータ ) の構造と駆動回路によって STEPPER MOTOR( ステッピング モータ ) の正確さを高めることができます 現在使われている STEPPER MOTOR( ステッピング モータ ) は 2 種類あり Unipolar と Bipolar Unipolar を使うのにより簡単より共に駆動する部品も少ない 一方 Bipolar の STEPPER MOTOR が使いにくく 駆動回路も複雑のでここでは説明しません Unipolar のステッピング モータの構造は図 19 に表します 電磁石ごとにコイルを 2 回巻き モータに4フェース ( 位相 ) フェース 1,2,3,4 です ステッピング モータは電線 5 本と 6 本あります コイル一巻ごとに電源を入れる電線 4 本とモータ用の電源一本ですが電線 6 本の場合はモータに電源を供するその 2 本をつないで使います 図 19 ステッピング モータの形状とその構造 ステッピング モータの駆動ステッピング モータを駆動させるために電線を必ず正確につなげることです ステッピング モータの駆動パターンは主に3つあります Full Step One Phase( 全ステップ一段 ) Full Step Two Phase( 全ステップ 2 段 ) Half Step( 半ステップ ) Full Step One Phase(1 相励磁 ) はもっとも簡単なパターンで時間ずれで電源を両極のコイルに入れます 例えばフェース1を出発してフェース 2,3 と4 順で回しまたフェース1に戻ります または逆順で 1,4,3,2 少し時間ずれの電子信号を入れれば前の例と逆方向に回転することになります このような駆動パターンはモータの動作が以 - 14 -

下の表になります One Phase(1 相励磁 ) のモータの回転ステップを示す表ステップフェース 1 フェース 2 フェース 3 フェース 4 1 駆動 2 駆動 3 駆動 4 駆動 Two Phase(2 相励磁 ) または Full Step パターンは前の One Phase とほとんど同じ 信号 1フェースを送信する代わりにステップ1にフェース1とフェース2に電子信号を送信しステップ2にフェース2と3 ステップ3にフェース3と4そしてステップ 4にフェース4と1に戻ります このような駆動パターンはモータの回転力が強まりますが One Phase パターンよりエネルギーを費やします Two Phase(2 相励磁 ) のモータの回転ステップを示す表ステップフェース 1 フェース 2 フェース 3 フェース 4 1 駆動駆動 2 駆動駆動 3 駆動駆動 4 駆動 駆動 Half Step(1-2 相励磁 ) 普通のパターンよりモータを 2 倍細かく回転させることができるためよく使われているパターンです その駆動は下記の表に示します 1 Phase と 2 Phase の組み合わせた結果回転力も増やし回転角度もより正確になります しかし ステップごとに普通のステップの半分の回転ですから Full Step を回転するときに連続に駆動します - 15 -

Half Step(1-2 相励磁 ) のモータの回転ステップを示す表ステップフェース 1 フェース 2 フェース 3 フェース 4 1 駆動 2 駆動駆動 3 駆動 4 駆動駆動 5 駆動 6 駆動駆動 7 駆動 8 駆動駆動 ステッピング モータと ULN2003 の IC と駆動し方 CPU の足は出力 (OUTPUT) として稼動するときに Unipolar のステッピング モータに電力を提供するに足りないため IC または電流を高める回路を通じてステッピング モータを駆動します この実験は ULN2003 番の IC 回路を使用することにします コントロールプログラムを書く際に前もってステッピング モータの回転を決めて ULN2003 の足にデータを転送し ステッピング モータが前のデータに従え稼動してまた新しいデータを受信し実行するためにデータを送るときにステップ間に時間をおく必要が - 16 -

あります 図 20 ステッピングモータと ULN2003 と稼動 トランジスタートランジスターは半導体素子で作られ 3 つの足があり (B,C と E) わずかな電流または電圧を一つの足につけて他の 2 本の足に入れている高い電流をコントロールすることができます つまりトランジスターは拡張機 (Amplifier) とスイッチの機能です バイポーラトランジスタ (Bipolar transistor) がよく使われています 例えばラジオやテレビなどの増幅回路またはリレーのスイッチとして用いることもあります トランジスターの構造バイポーラトランジスタは 3 つの P か N の半導体素子で作り上げ 接着剤のような不純溶液で貼り付けます したがって バイポーラトランジスターは 2 種類 N 2 層いわゆる NPN と P 2 層つまり PNP の構造があります 図 21 ステッピングモータと ULN2003 ともに稼動する 図 2 1 BC557 と BC547 番のトランジスターの形状と足の配置 NPN 型 PNP 型 トランジスターを表す記号 - 17 -

図 22 トランジスターの記号と構造 NPN 型 PNP 型図 22 によってトランジスターの構造が 3 層の半導体素子で作られ 一番小さい ( 薄い ) 層がベース (Base)B で表し 他の層はコレクタ層とエミッタ層です よって NPN と PNP のトランジスターは 3 つの足 ベース足 (B) コレクタ足(C) エミッタ足(E) を持っています LCD(Liquid Crystal Display) 一つの発光部品ですが明るさが低いため主に数字 文字の表示例えば電卓機やデジタル時計などです 現在 LCD は文字 数字を表示する 7-SEGMENT の限界を超えて代わり部品としてさまざまな機械の表示画面としてよく使われています ここでは ETT 社の 16 文字 2 行の LCD のみ説明します 16 文字 2 行のキャラクター LCD 16 文字 2 行のキャラクター LCD は 14 本の足を持ち その足の配置は図 23 に示します 足の詳細も下記の表に説明します 図 23 LCD の足の配置 - 18 -

LCD の足の名前とその機能を表す表足の番目足の名前役割 1 GND 電子回路のグランド 2 +V DD +5 V の電圧の電流と取り付ける足 3 V o LCD の明るさを調整する電圧を入れる足 4 R S 命令レジスターかデータレジスターを選ぶ足 0 : 命 令 レ ジ ス タ ー 1: データレジスター ( データを表示する ) 5 R/W 読み込みか書き出しかを選ぶ足 6 E Enable Pulse を LCD に提供する足 7-14 D0-D7 8 ビットのデータを書くのに使う足 16 文字 2 行のキャラクター LCD との接続 8 ビットと 4 ビット二つあります 普段は 8 ビットを使いますがポートの個数の限界で 4 ビットの接続が薦めます 4 ビットの接続は手間がかかりますがケーブル 6 線使用で 8 ビットの接続は 10 線使います 8 ビットの接続図 24 は LCD と CPU の8ビットの接続を示します LCD に書き込むときに LCD の D0- D7 の足と RD0-RD7 とつなげ RS 足と RC0 足 E 足と RC1 足 そして R/W 足がグランドとつなぎ LCD の明るさを調整するために Vo は 10 k Ω の抵抗器とつなぎます 図 24 8ビットデータの接続 - 19 -

LCD モジュールを稼動するプログラムを作成する手順 LCD を表示させるプログラムを書く前に LCD の機能を決め Initial LCD( 初期 LCD) と呼びます LCD を初期化するには LCD モジュール内の命令レジスターに命令データを書き込んで LCD モジュールを初期化する準備になります 例えば 初期のときにカーソルを一番左にし 表示仮面をオンにし カーソルの表示 非表示 行の個数 接続モードなど LCD に送信する信号が 2 種類あり 命令とデータ 両方のデータ通信しかたが同じですが RS 足でように分けます LCD に命令を書き込む 1. RS の足を 0 にします 2. データ足 (D0-D7)8 本とつないで命令を送信します 3. Enable palse を E 足に送ります LCD にデータを書く込む 1. RS の足を 1 にします 2. データ足 (D0-D7)8 本とつないでデータを送信します 3. Enable palse を E 足に送ります以上で命令とデータを書くときに RS 足の状態を確認してください 4 ビットの接続図 25 のようにデータ足が 4 本しかなく D4-D7 で CPU の RD4-RD7 とつなげて LCD モジュールの D0-D3 の足をグランドとして RS 足を RC0 とそして E を RC1 とつなぎます 8 ビットとの違いはデータの通信が 2 回やります 上の 4 ビットと下の 4 ビットです 初期化をする前に必ず 03h(0011) のデータを LCD の D7-D4 の足に送り Enable 信号を 2 回通信し LCD の状態を準備します それから 02h の命令を D7-D4 の足に送り また Enable 信号を送り LCD が 4 ビットのデータに対応するようにさせるからです - 20 -

図 25 4 ビットデータの接続 LCD に命令を書き込む 1. RS の足を 0 にします 2. 上 4 ビットの命令 ( ビット7-ビット4) を 4 本のデータ足に送信します 3. Enable palse を E 足に送ります 4. 下の 4 ビットの命令 ( ビット3-ビット0) を 4 本のデータ足に送信します 5. Enable palse を E 足に送ります LCD にデータを書く込む 1. RS の足を 1 にします 2. 上 4 ビットのデータ ( ビット7-ビット4) を 4 本のデータ足に送信します 3. Enable palse を E 足に送ります 4. 下の 4 ビットのデータ ( ビット3-ビット0) を 4 本のデータ足に送信します 5. Enable palse を E 足に送ります LCD をコントロールする命令 画面を空にする - 21 -

命令のデータは 0x01 です この命令のデータを LCD に送れば空のデータを DDRAM に書き込み DDRAM は LCD 画面に表示するデータの保存場でありますから LCD の画面が空状態になります カーソルの位置が一番左に戻ります Return Home の命令 命令のデータは 0x02 或いは 0x03 でカーソルの位置を一番左に戻す命令です 示して いるデータがそのまま変更しません *D0 の X は任意の数字です データ書き込みモードにする命令 (Entry mode set) I/D : データを書き込み後 DDRAM のアドレスの変更を表すビットです 0 =アドレス 1 個減ります 1 =アドレス 1 個増えます S : 表示モードを決めるビット 0 = 新しく入力するときカーソルの位置が右に移します 1 =カーソルの位置が一定で文字列が左に移します データを表示するモードをコントロールする命令 LCD 画面の動作を決める命令で 3 つあります D : LCD 画面のオン オフにするビット 0 = 画面をオフにする 1 = 画面をオンにする C : カーソルの表示をコントロールする 0 =カーソルを表示しない - 22 -

1 =カーソルを表示する B : LCD の画面を点灯する文字を設定するビット 0 = 点灯しない 1 = 点灯する - 23 -

カーソルと文字の移しをコントロールする命令 カーソルと文字の移しをコントロールする命令でさまざまな設定値が下記のようにあります S/C : カーソルを移すか文字を移すかを決めるビット 0 : カーソルを移す 1 : 文字を移す R/L : 右か左か 移す方向を決めるビット 0 : 左に移す 1 : 右に移す D0 と D1 はどの数字でもよいです LCD の機能を決める命令 LCD のさまざまな機能を決める命令です 設定値は以下のようになります DL : LCD と接続するモードを決めるビット 0 =4 ビットの動作にする 1 =8 ビットの動作にする N : 表示する行の個数を決めるビット 0 =1 行表示する 1 =2 行以上表示する F : 表示する文字の解像度を決めるビット 0 =5x7 ポイントの解像度で表示します 1 =5x10 ポイントの解像度で表示します * 不連続アドレスの 16 文字 1 行の LCD を使う際 行の個数つまり N ビットを 1 にし LCD がすべてのアドレスを見えるように 2 行以上を表示するときと同じく設定してください - 24 -

CGRAM のアドレスを選択する命令 CGRAM のアドレスを選択する命令です D7 を 0 にし D6 を 1 にして 残り 6 ビット D5-D0 がそのつなげたい CGRAM のアドレスです 事前につなげる CGRAM の アドレスを決めなければなりません DDRAM のアドレスを選択する命令 D7 を 1 にして後残り 6 ビットが DDRAM のアドレスを指定します - 25 -

2. 実験する前の案内実験装置の案内ブレッドボード (Project Board) は実験の電子回路と取り付けるボードで実験用ボートのみ付いてあります 図 26 ブレッドボードの写真 図 27 ブレッドボート上電子回路の配置を表す写真 - 26 -

ボート上の電子回路のつなげる例 図 28 直列に抵抗器をつなげる回路 図 29 並列に抵抗器をつなげる回路 - 27 -

実験手段の案内本実験は CPU PIC をさまざまな I/O デバイスとともに稼動することを学び 容易の実験から始め より複雑な稼動するプログラムまでやらせます したがって実験者はその I/O デバイスの一般知識を知った上で実験を行うことが望ましいです われわれはその I/O デバイスを前項に説明しましたので参照してください 本実験は Assembly 言語と Basic 言語そして PIC 16F877 と PIC 18F458 両方対応するように書かれています Assembly 言語を使うときにプログラムを 2 部に分けます PIC 16F877 の CPU に対応するのと PIC 18F458 に対応するプログラムです Basic 言語を使う場合同じプログラムで両方の CPU に対応します ソースコードをコンパイルするときに CPU を選択することができます 周波数について CP-PIC ボードには 10MHz のクリスタル発振器 (Oscillator) を搭載してありますが 18F458 の CPU が 2 つの周波数 外部のクリスタル 10MHz と 4 倍の外部のクリスタル 40MH zです しかし PIC 16F877 は 1 つの周波数 10MHz のみです 共通に対応できるためにわれわれが同じ 10MH zの周波数にして実験を行います よって プログラミングするときに時計の信号モードを毎実験 HS に設定します 最初の実験はわかりやすいため実験の手順を細かく説明しますがそれ以降の実験については実験 1と似たような手順を省き重要なところだけ説明することにします わからないところがあったら実験 1に参照してください - 28 -

3. 実験 1 Self Test Board 実験目的 1. プログラムを開発する手段を学ぶ 2. コンパイラーの使い方とプログラムをダウンロードしかたを学ぶ 3. サンプルプログラムを実践に適応できるようにする 実験装置 1. マイコンボート CP-PIC V3.0&V4.0 2. LED 1 個 実験前の説明この実験はマイコンの I/O ポートそしてエディタとコンパイラーを学び さらにプログラムのダウンロードも使いこなせるように簡単なプログラムを例とし出力ポートをコントロールし LED が点灯させます その際 CP-PIC V3.0&V4.0 に添付している LED Self Test のプログラムを使います エディタプログラムが MPLAB そしてコンパイラーが MPASM 二つとも Microchip(www.microchip.com) のプログラムです CPU にダウンロードするプログラムは EPICWin を使用します 図 1.1 ボードの形状と LED の位置 - 29 -

Assembly 言語でプログラミングする手段 1. MPLAB プログラムを開く 図 1.2 MPLAB プログラムを開く プログラムを開くと次の画面が出てきます - 30 -

図 1.3 MPLAB プログラムの画面を示す 図 1.3 によって 幾つかのコマンドメニューがありますがここでは重要なコマンドを紹介 します 2. プロジェクトを新規作成します 図 1.4 のように Project New Project を選んでくださ い 図 1.4 メニューを開き 新規プロジェクトを作成するプロジェクトの新規作成をクリックした後下図 1.5 の画面が出てき File name 欄にプロジェクトの名前を入力し この作成したファイルの拡張子が.pjt になります Directories の欄でプロジェクトファイルを保存したいダイレクトリーを選びます 他のファイルと混乱しないようにこのプロジェクト専用のダイレクトリーを新規作成してそこで保存することが勧めます 以下の例では LAB というプロジェクトを作成し C:\lab_pic のダイレクトリーに保存します OK をクリックし次へ進みます 図 1.5 プロジェクトの新規作成 - 31 -

プロジェクトの名前をつけ終わったら図 1.6 のように Edit Project( プロジェクト編集 ) の画面が表し プログラムの設定値を決めます この設定値はプログラム書き終わった後でも変更可能です 今 ASM ファイルがないからこの手段を飛ばして Cancel ボタンをクリックして終了してください 図 1.6 Edit Project の画面 3. Edit Project の画面を閉じてから図 1.3 のように MPLAB プログラムの Dialog が示し File New (Ctrl+N) を選んで下図 1.7 が表します そこで Assembly のソースプログラム を書き込む - 32 -

図 1.7 プログラムを書く込むファイルを作成 プログラムを書き込む画面に次のサンプルプログラムを入力してください Assembly 言 語を使うので PIC 16F877 と PIC 18F458 に対応するソースコードそれぞれ分かれています CPU PIC 16F877 に対応する Assembly 言語 List p = 16f877 ; list directive to define processor #include <p16f877.inc> ; processor specific variable definitions DT1 EQU 0x20 ; Delay を保存する変数 DT2 EQU 0x21 ; Delay を保存する変数 DT3 EQU 0x22 ; Delay を保存する変数 ORG 0x0000 BSF STATUS,RP0 BCF STATUS,RP1 ; バング1を選択する MOVLW 0x07 MOVWF ADCON1 ; PORT A を Digital I/O にする CLRF TRISA ; PORT A を出力にする BCF STATUS,RP0 ; バング 0 を選択する LOOP BCF PORTA,0 ; Low PORTA,0 (Off LED) CALL DELAY ; タイミングするプログラム BSF PORTA,0 ; High PORTA,0 (ON LED) - 33 -

CALL DELAY ; タイミングするプログラムを呼び出し GOTO LOOP ; 繰り返し DELAY MOVLW 0x04 ; タイミングするプログラム MOVWF DT1 DEL0 CLRF DT2 DEL1 CLRT DT3 DEL2 DECFSZ DT3,F GOTO DEL2 DECFSZ DT2,F GOTO DEL,1 DECFSZ DT1,F GOTO DEL0 RETURN END プログラムの解説 このプログラムは PORTA,0 とつながる LED を制御するプログラムです LED を光っ たり消えたりするようにさせ その光る頻度がタイミングプログラムのDT1,DT2, DT3 の値によって決まります CPU PIC 18F458 に対応する Assembly 言語 List p = 18f458 ; list directive to define processor #include <p18f458.inc> ; processor specific variable definitions DT1 EQU 0x20 ; Delay を保存する変数 DT2 EQU 0x21 ; Delay を保存する変数 DT3 EQU 0x22 ; Delay を保存する変数 ORG 0x0000 MOVLW 0x07 MOVWF ADCON1 ; PORT A を Digital I/O にする CLRF TRISA ; PORT A を出力にする LOOP BCF PORTA,0 ; Low PORTA,0 (Off LED) CALL DELAY ; タイミングするプログラム BSF PORTA,0 ; High PORTA,0 (ON LED) CALL DELAY ; タイミングするプログラム GOTO LOOP ; 繰り返し - 34 -

******DELAY LOOP******* DELAY MOVLW 0x04 ; タイミングするプログラム MOVWF DT1 DEL0 CLRF DT2 DEL1 CLRF DT3 DEL2 DECFSZ DT3,F GOTO DEL2 DECFSZ DT2,F GOTO DEL1 DECFSZ DT1,F GOTO DEL0 RETURN END プログラムの解説 このプログラムは前の 16F877 に対応するプログラムと同じ動作です 違うところは CPU 18F458 のソースコードには register を同じバングにおき 前のプログラムのバン グの入れ替えコマンドを書かなくても良いです さらに最初に指定する CPU を 18F458 にすることが忘れてはなりません # 注 :) 実験するときにコメントの文章を書かなくてもよいです ( ; の記号の後にはコメ ントです ) 4. ソースコードを入力し終わったら File Save または Ctrl+S で Save File As( 別名保存 ) の画面が出てき ファイル名をつけて拡張子を.asm にしてプログラムを保存します ただし 保存ダイレクトリーは前のプロジェクトファイル (.pjt) と同じダイレクトリーにしなければなりません ここでは lab_pic のダイレクトリー下で LAB1.asm と名付て保存します ( 図 1.9 参照 ) - 35 -

図 1.9 プログラムファイルを保存する 5. コンパイルの設定値を選択します ファイルを保存した後 CPU にダウンロードできるように ASM file を HEX file に変換しなければなりません この手段は Build またはコンパイルと呼びます コンパイルする前にコンパイルの設定値を決めます Project Edit Project(Ctrl+F3) を選択して図 1.10 の画面が出てきます 図 1.10 Edit Project の画面を示す - 36 -

5.1 Change のボタンをクリックして Development Mode の画面が出てきます Tools のタブを選んで MPLAB SIM Simulator を選択し Processor 欄に自分の CPU の番号を入力し ます この例では PIC 16F877 にします 図 1.11 Development Mode の画面 5.2 Clock の欄には Oscillator の設定値を設定します ここでは Hs Mode で周波数 10MHz 図 1.12 のようにします 図 1.12 Oscillator の設定 - 37 -

その後 OK ボタンをクリックして次のメッセージが出てきます 図 1.13 Import エラーのメッセージ このメッセージがでたのはわれのプロジェクトに HEX ファイルが作成されないからです OK をクリックしてください 図 1.14 Project エラーのメッセージ Project エラーのメッセージがでたら OK ボタンをクリックしてください 図 1.15 Simulator Program Memory Warning の警告 今われのプロジェクトがまだ Build していないから 図 1.15 のメッセージは新規プロジ ェクトを Build( コンパイル ) する警告です OK をクリックしてまた図 1.10 のように Edit Project の画面に戻ります - 38 -

5.3 Add Node のボタンをクリックしてコンパイルしたいソースコードを選びます Add Node をクリックすると図 1.16 のような画面が出てきます 図 1.16 Add Node の画面 5.4 コンパイルしたい ASM ファイルを選択します ここでは lab1.asm を選んで OK をクリックすると Edit Project の画面で Project Files の欄に lab1[.asm] ファイルが表れます ( 図 1.17 参照 ) 図 1.17 Add Node した後の Edit Project 画面 - 39 -

次に Node Properties をクリックしてください まだ Node Properties のボタンを選択できなければ lab1[.hex] をクリックしてから Node Properties を選んで Node Properties の画面が出てきます プログラムをコンパイルする MPASM のさまざまな Options を設定することができます コンパイルしたファイルの種類も選ぶことができます 図 1.18 のように設定すればコンパイルした後 Hex File, Error File, List File などができます 選択し終わったら OK をクリックしてください 図 1.18 Node Properties の画面 すると Edit Project の画面に戻ります 今の段階ではすべてのコンパイル準備がおわりまし たので次はプログラムをコンパイルします 6. プログラムをコンパイルするには Edit Project の画面で Build Node のボタン Project Build All または Project Build Node あるいはのボタンをクリックします 正確にコンパイルできたら Hex ファイルと他のファイルが得られますが CPU にダウンロードするファイルはただ.HEX のみです エラーメッセージがでたらプログラムの文法などエラーの原因を表示するメッセージがでてきます - 40 -

図 1.19 コンパイルエラーメッセージの例 図 1.19 はコンパイル結果を表す画面です エラーが出た場合エラーメッセージに注目 してその原因を修正してください 7.CPU にプログラムをダウンロードするこの手段ではコンパイルして出来た HEX File を CPU にダウンロードします CP-PIC V3.0&V4.0 ボードに対応するダウンロードプログラムは High Voltage Programming 式 (VPP=13V によるオンボード書き込み制御回路 ) の EPICWin です ダウンロード手段は次のようになります 7.1 CP-PIC ボートと PC をダウンロードケーブルでつなげます CP-PIC の端は RJ-45 のコネクタを使い PC 側は DB25(PRINTER PORT) を用います 7.2 CP-PIC ボードに 13-16VDC の電気を流します 7.3 RUN/PROG のスイッチを PROG の位置に移しプログラムモードに設定します 7.4 EPICWIN プログラムを開いて図 1.20 のようになります 図 1.20 EPICWin プログラムの画面 7.5 ダウンロードするファイルを File Open またはで開きます - 41 -

図 1.21 ダウンロードするファイルを開く ダウンロードする HEX ファイルを選びます 7.6 Device 欄で自分の CPU の番号と一致するように選択します 7.7 View Configuration で設定を行います 図 1.22 Configuration メニューを開く - 42 -

図 1.23 Configuration の値を設定する 7.8 CPU にプログラムを詰め込み 普段プログラム手順は次のようになります Erase Blank Check Program Verify ( データ削除 記憶容量をチェック プログラム 確認 ) 7.9 プログラムが終わったら RUN/PROG のスイッチに RUN の位置に戻して PORTA,0 についている LED Self Test で CPU の動作を観察し LED が光ったり消えたり成功です PORTA.0 と LED Test がつなぐようにここでは Shot Jumper Test をしなければなりません Basic 言語でプログラミングする手段 Basic 言語で実験を行う場合には BASIC 言語のコンパイラーを用意しなければなりません 普段はさまざまな会社のコンパイラーを有償で入手できますがここでは Micro Engineering Lab の PicBasic Pro のコンパイラーを用います 以前述べたように Basic 言語を使う場合同じソースコードで両方の CPU (PIC 16F877 と PIC 18F458) に対応しますがコンパイルするときに CPU 番号を指定しなければなりません コンパイルしたら HEX ファイルが生じてそれを CPU にダウンロードします プログラムする手段は下記のチャートで表しま - 43 -

す テキストファイル形でソースコードを作成 修正する テキストファイルを HEX ファイルに変換する 不可 ソースコートを修正 マイコンに HEX ファイルをダウンロードする プログラムの動作を確認 不正 プログラムを実現する 図 1.24 プログラム開発チャート - 44 -

1. 下記のサンプルソースプログラムをテキストエディターに入力してください Basic 言語のプログラム INCLUDE modedefs.bas プログラムを呼び出す DEFINE OSC 10 周波数を 10MHz にする ADCON1 = 7 PORTA を Digital I/O にする TRISA = $00 PORTA を出力にする Loop; High PORTA.0 On LED Pause 300 タイミング 300 ms Low PORTA.0 Off LED Pause 300 タイミング 300 ms GOTOloop プログラムの解説このプログラムは Basic 言語で書かれましたが前の Assembly 言語で書いたプログラムと同じ動作をさせます DEFINE OSC 10 の行はプログラムを周波数 10MHz で稼動し PORTA を出力にして論理 1 を RAO の足に送ってタイミングします そして論理 0 を RA0 の足に送ってタイミングします この動作を繰り返し LED が光ったり消えたりするように見えます 2. プログラムをコンパイルします CPU の番号を実験するのと一致するように注意してください うまくコンパイルできれば HEX ファイルがでてきます 3. CPU に出来上がった HEX ファイルをダウンロードします Assembly 言語の段階 7と同じように行います 4. PORTA.0 につける LED Test の変動でプログラムの動作を観察します 実験結果 下記の手段を行えば LED が光ったり消えたりするように見えます タイミングによって その頻度が異なります 実験後の問題 1.1 Port A を使用するときに Register の値を 07h に設定するのはなぜでしょうか? そしてその値を決定するのは何を意味するでしょう? 1.2 この実験によるともっと LED の光る頻度を増やすにはとうしたらよいでしょう? - 45 -

4. 実験 2 OUTPUT ポートの使い方 実験目的 1. 基本的な電子回路をつなげられること 2. 出力ポートの制御プログラムを書くことができること 3. サンプルプログラムを拡張して適応できること 実験装置 1. マイコンボート CP-PIC V3.0EXPAND 2. LED 8 個 3. 560 オームの抵抗器 8 個 4. ケーブル 実験前の説明 本実験はマイコン PIC と共に稼動する I/O ポートの使い方を学びます PIC マイコンのポ ートはすべて入力 出力として扱うことができますがここでは出力としての振る舞いを観 察します CPU PIC のビットごとにシング (sink) とソース (source) の電流が最高 25 m A 流れ ていますから基本的なデバイスとつなげることができます 本実験出力ポートの動作を LED で表しますので ある手段は実験 1と同様 または実験 1の継続する手段です よって 分からないところがあったら実験 1の説明を参照してください 実験の手段 1. 下記図のように回路をつけてください 図 2.1 実験回路 - 46 -

2. プログラムファイルを新規作成します File New(Ctrl+N) を選んで空き画面が出てき ます そこでプログラムを作りこみます 図 2.2 ファイルを新規作成 次のサンプルプログラムを入力してください CPU の種類によってソースコードがこと なることに注意してください PIC 16F877 用の Assembly 言語ソースコード List p=16f877 ; list directive to define processor #include <p16f877.inc> ; processor specific variable definitions ORG 0x0000 BCF STATUS,RP1 BSF STATUS,RP0 ;Select BANK1 MOVLW 0x00 ; 00000000 MOVWF TRISD ; PORTD を出力ポートにする BCF STATUS,RP0 ; Select BANK 0 MOVLW 0x55 ; 01010101 MOVWF PORTD ; PORTD にデータを送る GOTO $ ; Stop END - 47 -

PIC 18F458 用の Assembly 言語ソースコード List p=18f458 ; list directive to define processor #include <p18f458.inc> ; processor specific variable definitions ORG 0x0000 MOVLW 0x00 ; 00000000 MOVWF TRISD ; PORTD を出力ポートにする MOVLW 0x55 ; 01010101 MOVWF PORTD ; PORTD にデータを送る GOTO $ ; Stop END プログラムの解説このプログラムは Assembly 言語で I/O ポートの出力機能を確認するプログラムです ここでは PORTD を使います PIC の I/O ポートは出力 入力の両方機能できますから I/O ポートを使う前にそのポートの機能を決めなければなりません Register の TRISD の値を 1 にすれば入力に 0 にすれば出力になります この例では TRISD に送る数字は 00000000 つまりすべての PORTD のビットを出力にし そして PORTD に送るデータは 55h( 01010101 ) で PORTD が Latch され 新たなデータを取得できるまでその状態を保ちます Basic 言語の場合 INCLUDE modedefs.bea プログラムを呼び出し DEFINE OSC 10 周波数を 10MH zに決める TRISD = $00 PORTD を出力にする PORTD = $55 PORTD に 01010101 データを送る Loop; GOTO loop プログラムの解説 Basic 言語で書かれたプログラム 前と同様な動作をさせます DEFINE OSC 10 の行はプログラムの実行する周波数を 10MHz にします PORTD を出力にし データをPORTD に送ります - 48 -

3. 作成したファイルを実験 1 のプログラムと同じダイレクトリーに保存し ここで lab_pic の下で lab2.asm を名づけて保存します 4. プログラムをコンパイルします 図 2.3 新規作成したファイルを名づけて保存 -Project Edit Project(Ctrl+F3) で Edit Project の画面を開きます 図 2.4 Edit Project の画面 - 49 -

図 2.4 により プロジェクトファイルはまだ過去のファイル (lab1) になっていますのでそのファイル名を lab2.asm と lab2.hex に変更しなければなりません まず lab1[.asm] をクリックし Delete Node を選んで そして新しいファイルを追加し Add Node 選択すると図 2.5 の画面が現れます 図 2.5 コンパイルするファイルを選択 図 2.5 より lab2.asm ファイルを選択し OK をクリックすると図 2.6 のようにファイル 名が lab2 に変えます これでコンパイルすることができます コンパイル手段は実験 1 の段階 6 と同じです - 50 -

図 2.6 新しいファイル追加後の Edit Project 画面 5. コンパイル完了したら CPU にダウンロードします ダウンロード手順は実験 1の段階 7と同じです 6. 0x55 または $55 の変数の値を変更してまたコンパイル ダウンロード 実行して LED の振る舞いを観察します 実験結果段階 1-5 をうまく動けば LED の表示は下図のようになります 段階 6 はその変更した変数に応じて結果が異なります - 51 -

実験後の問題 2.1 マイコンの I/O ポートの機能を入力 出力を決めるにはどうすればよいでしょう? 2.2 実験 2 のプログラムによると LED をすべて点灯するにはどう変更するでしょう? 2.3 ポート D のほかに出力ポートとして機能することができますか? - 52 -

5. 実験 3 走る光のプログラム 実験目的 1. 基本的な電子回路をつなげられること 2. 出力ポートを制御するプログラムを作成すること 3. サンプルプログラムを拡張し適応できること 実験装置 1. マイコンボード CP-PIC V3.0EXPAND 2. LED 8 個 3. 560Ω の抵抗器 8 個 4. 電線 実験前の説明 この実験は前より若干難しいプログラムです 要するに移動命令または論理の回転を左 にさせて 8 個の LED を制御し右から左へ光が走るように見えます 実験 1と同様な基本的 な手段は省きます わからないところがあれば実験 1の説明を参照してください 実験の手段 1. 回路を次のように設計してください 図 3.1 実験の回路 - 53 -

2. 下記のソースコードを入力してコンパイルしてください PIC 16F877 用 Assembly 言語 List p = 16f877 ; list directive to define processor #include <p16f877.inc> ; processor specific variable definitions DT1 EQU 0x20 ; Delay を保存する変数 DT2 EQU 0x21 ; Delay を保存する変数 DT3 EQU 0x22 ; Delay を保存する変数 ORG 0x0000 BSF STATUS,RP0 ; Bank1 を選択する CLRF TRISD ; PORTD を出力にする BCF STATUS,RP0 ; Bank0 を選択する MOVLW 0x01 ; 00000001 MOVWF PORTD LOOP CALL DELAY ; タイミングするプログラム RLF PORTD,F ; データを左に 1 つ移動する GOTO LOOP ; 繰り返し ******DELAY LOOP****** DELAY MOVLW 0x04 MOVWF DT1 DEL0 CLRF DT2 DEL1 CLRF DT3 DEL2 DECFSZ DT3,F GOTO DEL2 DECFSZ DT2,F GOTO DEL1 DECFSZ DT1,F GOTO DEL0 RETURN END ; タイミングするプログラム - 54 -

PIC 18F458 用 Assembly 言語 List p = 18f458 ; list directive to define processor #include <p18f458.inc> ; processor specific variable definitions DT1 EQU 0x20 ; Delay を保存する変数 DT2 EQU 0x21 ; Delay を保存する変数 DT3 EQU 0x22 ; Delay を保存する変数 B0 EQU 0x23 ; データを保存する変数 ORG 0x0000 CLRF TRISD ; PORTD を出力にする MOVLW 0x01 ; 00000001 MOVWF B0 ; 初期化を B0 にする LOOP MOVFF B0,PORTD ; PORTD に B0 の値を送る CALL DELAY ; タイミングするプログラム RLF PORTD,F ; データを左に 1 つ移動する GOTO LOOP ; 繰り返し ******DELAY LOOP****** DELAY MOVLW 0x04 MOVWF DT1 DEL0 CLRF DT2 DEL1 CLRF DT3 DEL2 DECFSZ DT3,F GOTO DEL2 DECFSZ DT2,F GOTO DEL1 DECFSZ DT1,F GOTO DEL0 RETURN END ; タイミングするプログラム - 55 -

プログラムの解説このプログラムは PORTD とつなぐ LED を制御するプログラムです 光る LED を 1 個ずつ左に移動させ 8 番目まで終わったらまた 1 番目まで戻り走る光と呼びます 最初に変数の値を決め PORTD を出力にします LED を 1 個ずつ点灯しますので表示するデータは 00000001 にして Carry Flag を通じてデータを左回転させます よって プログラムの概要は繰り返し LED を表示させ 目で LED の変更を観察できるようにタイミングすることが必要です ( タイミングしないと CPU の高速度で観察できないことがあります ) BASIC 言語 INCLUDE modedefs.bas プログラムを呼び出し DEFINE OSC 10 周波数を 10MHz B0 VAR BYTE i Var BYTE TRISD = $00 PORTD を出力にする start; B0 = $01 PORTD に 00000001 のデータを送る PORTD = B0 B0 のデータを PORTD に送る FOR i=0 TO 8 loop を8にする PAUSE 200 200ms タイミングする B0 = B0 << 1 データを左 1ビットに移動する PORTD = B0 PORTD にデータを送る NEXT i GOTO start プログラムの解説 このプログラムは Basic 言語で書かれた前のプログラムと同じ動作です したがって プログラムの概要はほとんど一緒 最初に変数の値を決め PORTD の機能を出力にし DEFINE OSC 10 の行はプログラムの Oscillator の周波数を 10MHz にします このプログ ラムでは 8 回繰り返しデータを左に移動させ よって LED を右から左順に 1 個ずつ光り ます 3. コンパイルして HEX ファイルを CPU にダウンロードして実行すると PORTD とつ なぐ LED の様子を観察してください - 56 -

実験結果 手段 1-3 をうまく動けば LED の様子が下のように光ります 実験後の問題 3.1 DT1 変数の値を変えれば LED の様子はどうなりますか なぜでしょうか? 3.2 下図のように LED を 2 個ずつ光って右から左へ走らせるようにどうすればよいでしょうか? 3.3 LED の表示を逆方向つまり左から右に走らせるのはどうすればよいでしょうか? 6. 実験 4 INPUT ポートの使い方 - 57 -

実験目的 1. 基本的な電子回路をつなげられること 2. 入力ポートを制御するプログラムを作成すること 3. サンプルプログラムを拡張し適応できること 実験装置 1. マイクロコントローラーボード CP-PIC V3.0EXPAND 2. LED 8 個 3. SW DIP 8 1 個 4. 560 オームの抵抗器 8 個 5. 10 Kの抵抗器 8 個 6. 電線ケーブル 実験前の説明 この実験は CPU の I/O ポートを通して外部スイッチからのデータを受信するプログラム を試験します PIC の I/O ポートは各ポートのコントロールレジスターで入力 出力の機能 を選ぶことができます この実験にはスイッチ回路を PORTB につけて PORTD についてい る LED で実験結果を表します 実験手順 回路を下図のようにつけてください 図 4.1 実験回路 - 58 -

4.1 次のソースコードを書き込んでコンパイルします Assembly 言語 PIC 16F877 専用 list p = 16f877 ;list directive to define processor #include <p16f877.inc> ;processor specific variable definitions ORG 0x0000 BCF STATUS,RP1 BSF STATUS,RP0 ;Bank 1 を選択 CLRF TRISD ;PORTD を出力にする MOVLW 0xFF ; 11111111 MOVWF TRISB ;PORTB を入力にする BCF STATUS,RP0 ;Bank 0 を選択 LOOP MOVF PORTB,W ;PORTB からのデータを受信する MOVWF PORTD ;PORTD にデータを送信する GOTO LOOP END Assembly 言語 PIC 18F458 用 list p=18f458 ;list directive to define processor #include <p18f458.inc> ;processor specific variable definitions ORG 0x0000 CLRF TRISD ;PORTD を出力にする MOVLW 0xFF ; 11111111 MOVWF TRISB ;PORTB を入力にする LOOP MOVF PORTB,W ;PORTB からのデータを受信する MOVWF PORTD ;PORTD にデータを送信する GOTO LOOP END プログラムの解説ポート B のスイッチからのデータを受信し ポート D の LED で結果を表示するプログラムです 最初に PORTD を出力に PORTB を入力にして データの送受信の無限ループに入り PORTB の変動によって PORTD についている LED で様子を観察します - 59 -

BASIC 言語 INCLUDE modedefs.bas プログラムを呼び出す DEFINE OSC 10 振動数を 10MHz にする TRISD = $00 PORTD を出力にする TRISB = $FF PORTB を入力にする start; PORTD =PORTB PORTB のデータを PORTD に送信する GOTO start プログラムの解説このプログラムは Assembly 言語で書いた前のプログラムと同じ動作をします スイッチからデータを受信して PORTD の LED で表示します ソースコートをコンパイルして CPU に HEX ファイルをダウンロードしてからスイッチ の位置を変動して実験の結果を観察します 4.2 上記のプログラムを拡張して実験 3 の走る光の速度を DIP スイッチで制御できるよ うに次のソースコートを書き込み コンパイルして HEX ファイルをダウンロードして Dip スイッチの値の変動によってプログラムの動作を観察します Assembly 言語 PIC 16F877 用 list p = 16f877 ;list directive to define processor #include <p16f877.inc> ;processor specific variable definitions DT1 EQU 0x20 DT2 EQU 0x21 ORG 0x0000 BSF STATUS,RP0 ;Bank1 を選択する CLRF TRISD ;PORTD を出力にする MOVLW 0xFF ; 11111111 MOVWF TRISB ;PORTB を入力にする BCF STATUS,RP0 ;Bank0 を選択する MOVLW 0x01 ; 00000001 MOVWF PORTD LOOP CALL DELAY ; タイミングプログラム RLF PORTD,F ; データを 1 つ左に移す GOTO LOOP ; 繰り返す - 60 -

DELAY MOVF PORTB,W ;PORTB のデータを受信する MOVWF DT1 ;Delay を保存する変数にデータを送信する DEL MOVLW 0x00 MOVWF DT2 DEL1 DECFSZ DT2,F GOTO DEL1 DECFSZ DT1,F GOTO DEL RETURN END Assembly 言語 PIC 18F458 用 list p = 16f877 ;list directive to define processor #include <p18f458.inc> ;processor specific variable definitions DT1 EQU 0x20 DT2 EQU 0x21 B0 EQU 0x22 ORG 0x0000 CLRF TRISD ;PORTD を出力にする MOVLW 0xFF ; 11111111 MOVWF TRISB ;PORTB を入力にする MOVLW 0x01 ; 00000001 LOOP MOVF B0,W MOVWF PORTD ;PORTD にデータを送信する CALL DELAY ; タイミング RLCF B0,F ; データを左に 1 つシフトする GOTO LOOP *******DELAY LOOP******* DELAY MOVF PORTB,W ;PORTB からデータを受信する MOVWF DT1 ;Delay を保存する変数にデータを送信する DEL CLRF DT2 DEL1 DECFSZ DT2,F GOTO DEL1-61 -

DECFSZ DT1,F GOTO RETURN END DEL プログラムの解説このプログラムは DIP スイッチと LED を共に動作し実験 3 の走る光のようにさせます PORTB の DIP スイッチの位置を移すことによってタイミングのところが変動します よって DIP スイッチを動かせば LED の走る速度が変わります BASIC 言語 INCLUDE modedefs.bas プログラムを呼び出す DEFINE OSC 10 ⅰ VAR BYTE B0 VAR BYTE DELAY VAR BYTE TRISD = $00 PORTD を出力する TRISB = $FF PORTB を入力する START; B0=$01 00000001 のデータを PORTD に送信する FOR ⅰ =0 TO 8 繰り返す回数を 8 にする PORTD = B0 PORTD にデータを送信する DELAY=PORTB PORTB の Delay の値を決める PAUSE DELAY タイミング B0=B0<<1 でーたを左に 1 つシフトする NEXT ⅰ GOTO START プログラムの解説このプログラムは Assembly 言語で書いたプログラムと同じ動作をし DELAY という変数にはタイミングする時間を保ち DIP スイッチによって 0-225 まで設定することができる - 62 -

実験結果段階 4.1 を実行するとスイッチの位置によって LED の変動が起こり 段階 4.2 は I/O ポートを両方応用して走る光の速度をコントロールできるようになります スイッチの値は 00- FFh の間のみです 実験後の質問 4.1 CPU の I/O ポートを入力にする手法を教えてください 4.2 実験 4.2 におけて DIP-SWITCH 8 を変動することによってプログラムの振る舞いはどう変えるか? なぜでしょうか? - 63 -

7. 実験 5 7-Segment の使い方 実験目的 1. 基本的な電子回路をつなげられること 2.7-Segment を制御するプログラムを作成すること 3. サンプルプログラムを拡張し適応できること実験装置 1. マイクロコントローラーボード CP-PIC V3.0EXPAND 2.7-Segment (Common Cathode) 1 個 3 3.560 オームの抵抗器 8 個 4. ケーブル実験前の説明この実験は 7-Segment を制御するプログラムを作成します 最初に 7-Segment を表す数字の形を決めます 7-Segment の表示しかたは下記の表を参考してください 7-Segment は 7 個の LED を組み合わせ数字の形に見えるように配置されています LED の位置によって名をつけられ a,b,c,d,e,f とgそして dp は小数を示すのに使います 7-Segment に入っている LED が同じ共通の足をもち 共通アノード足 (Common Anode) と共通カソード足 (Common Cathode) に分けられます LED 7-Segment のカソード足を点灯するのにマイナス極性の電流をカソード足に接続しプラス足をアノード ( 各 LED の足 ) につけます 一方 アノード足の LED 7-Segment の場合はプラス電流をアノード足に マイナス電流をカソード足 ( 各 LED の足 ) に接続します 図 5.1 7-Segment の回路 CPU の出力電流が十分に高いため IC バッファーを使わずに直接に LED 7-Segment を動かせることができます LED 7-Segment をつける CPU の出力ポートには電流を高すぎないように各 LED に抵抗器をつけなければなりません LED 7-Segment を数字の形に表示させるのに事前に各 Segment(LED) の動作を決めます 次のページに載っている表を参照してください - 64 -

LED 7-Segment のデジタルデータ dp g F e d c b a D7 D6 D5 D4 D3 D2 D1 D0 カソード足を使用するときの 16 進数 LED で表示する数字 0 0 1 1 1 1 1 1 3F 0 0 0 0 0 0 1 1 0 06 1 0 1 0 1 1 0 1 1 5B 2 0 1 0 0 1 1 1 1 4F 3 0 1 1 0 0 1 1 0 66 4 0 1 1 0 1 1 0 1 6D 5 0 1 1 1 1 1 0 1 7D 6 0 0 1 0 0 1 1 1 27 7 0 1 1 1 1 1 1 1 7F 8 0 1 1 0 1 1 1 1 6F 9 0 1 1 1 0 1 1 1 77 A 0 1 1 1 1 1 0 0 7C B 0 0 1 1 1 0 0 1 39 C 0 1 0 1 1 1 1 0 5E D 0 1 1 1 1 0 0 1 79 E 0 1 1 1 0 0 0 1 71 F 1 1 1 1 1 1 1 1 FF 8. - 65 -

実験手法 1. 回路を下図のようにつなげてください 図 5.2 実験回路 2. 次のソースコードを書き込んでコンパイルします Assembly 言語 PIC 16F877 用 list p=16f877 ;list directive to define processor #include <p16f877.inc> ;processor specific variable definitions OFFSET EQU 0x20 COUNT1 EQU 0x21 COUNT2 EQU 0x22 COUNT3 EQU 0x23 ORG 0x0000 BCF STATUS,RP1 BSF STATUS,RP0 ;Bank1 を選択 CLRF TRISD ;PORTD を出力にする BCFSTATUS,RP0 ;Bank0 を選択 ST CLRF OFFSET ;Start OFFSET =0 START MOVFOFFSET,W ;offset 値を Register W に送る CALL TAB ;Table からのデータを取得するプログラ ム - 66 -

ADDLW 0 ;W=W+0 BTFSC STATUS,Z ; データが 0 であるかどうか確認す る GOTO ST ; データ =00 MOVWF PORTD ;PORTD にデータを送る CALL DELAY ; タイミング INCF OFFSET,F ;Offset の値を増加する offset=offset+1 GOTO START DELAY MOVLW 0x08 ; タイミングするプログラム MOVWF COUNT1 DEL CLRF COUNT2 DEL0 CLRF COUNT3 DEL1 DECFSZ COUNT3,F GOTO DEL1 DECFSZ COUNT2,F GOTO DEL0 DECFSZ COUNT1 GOTO DEL RETURN TAB ADDWF PCL ;PC lower に offset 値を代入 DT 0x3F,0x06,0x5B,0x4F,0x66,0x7D,0x27,0x7F,0x6F,0x77,0x7C,0x39,0x5E, 0x79,0x71,0xFF,0x00 END Assembly 言語 PIC 18F458 用 list p=18f458 ;list directive to define processor #include<p18f458.inc> ;processor specific variable definitions OFFSET EQU 0x20 COUNT1 EQU 0x21 COUNT2 EQU 0x22 COUNT3 EQU 0x23 ORG 0x0000 CLRF TRISD ;PORTD を出力にする ST CLRF OFFSET ;Start OFFSET=0 START MOVF OFFSET,W ;offset 値を Register W に送る - 67 -

CALL TAB ;Table からデータを取得するプログラム ADDLW 0 ;W=W+0 BTFSC STATUS,Z ; データが 0 であるかどうか確認す る GOTO ST ; データ =00 MOVWF PORTD ;PORTD にデータを送信 CALL DELAY ; タイミング INCF OFFSET,F INCF OFFSET,F ;offset=offset+2 GOTO START DELAY MOVLW 0x08 ; タイミングするプログラム MOVWF COUNT1 DEL CLRF COUNT2 DEL0 CLRF COUNT3 DEL1 DECFSZ COUNT3,F GOTO DEL1 DECFSZ COUNT2,F GOTO DEL0 DECFSZ COUNT1 GOTO DEL RETURN ******Table of data****** TAB ADDWF PCL ;offset 値を PC lower に代入する DT 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x27,0x6F,0x77,0x7C,0x39,0x5E,0x79, 0x71,0xFF,0x00 ;0,1,2,3,4,5,6,7,8,9,A,b,C,d,E,F,8. END プログラムの解説 7-Segment でさまざまな数字を表示するプログラムです 主に数字を表示するデータを表に代入してその表を読み込んで 7-Segment を点灯します OFFSET 値と Register PCL を足し算して 表に入っている特定のデータをアプローチします DT コマンドは表にデータを代入するコマンド RETLW と同様です DT 0x01,0x02 は次のコマンドと同じ作業です RETLW 0x01 RETLW 0x02-68 -

このコマンドの動作は元に戻し (Return) さらに Register W に定数を代入します つまり次のようなプログラムを一緒です MOVLW 0x01 RET プログラムの最初に PORTD を出力にして OFFSET の値をクリアにして 0 にします この OFFSET 値は Register W に送り 表に保存しているデータの位置を特定できるようにこの W と PCL を足し算して そのデータを読み込んで Register W に保存します 次に最後のデータを確認します 普段 表の終わりがわかるように最後の値に 0x0 に設定します 確認するプログラムは ADDLW コマンドを用いて表から取得したデータと 0x0 を足し算してそのデータは 0 であるかどうか確認します 0 だったら Zero Bit の値が 1 になります プログラムがまた最初に戻って繰り返します 0 でなければ Zero Bit が 0 になり そのデータを PORTD に送って LED の変動を観察しやすくするようにタイミングします それから OFFSET の値を増加します CPU PIC 18F458 は 16 Bit のデータに対応しますからデータをアプローチするには PC+2 つまり 2 回増加することになります 一方 PIC 16F877 の場合は 1 回足し算します OFFSET の値を増加した後 次のデータを取得して表示して最後のデータつまり 0x0 を見つかったら ST ロープにまた戻ります - 69 -

Basic 言語 INCLUDE modedefs.bas プログラムを呼び出す DEFINE OSC 10 振動数を 10MHz にする i VAR BYTE TRISD = $00 PORTD を出力にする loop; FOR i=0 to 17 LOOKUP i,[$3f,$06,$5b,$4f,$66,$6d,$7d,$27,$7f,$6f,$77,$7c,$39,$5e, $79,$71,$FF],PORTD 0,1,2,3,4,5,6,7,8,9,A,b,C,d,E,F,8. のデータ PAUSE 500 NEXT i GOTO loop プログラムの解説 このプログラムは Assembly 言語で書いた前のプログラムと同じ構造ですが Basic 言語 にはさまざまな機能がついているため Assembly 言語のプログラムと比べ割りと短くな ってきました このプログラムでは表を開くのに LOOKUP の機能を使い i の変数がデー タの場所を特定します 例え i の値が0のとき表の 0 の位置に保存しているデータ ( この 例では 3FH) を取得して PORTD に送って表示させ タイミングして FOR NEXT のコマ ンドによって i の値を1に増加し次の場所に移動しまたデータを表示します 17 数字 ( 文 字 ) を表示したあとまた元に戻ります 3. プログラムをコンパイルして CPU に HEX ファイルをダウンロードして実行し 7-Segment の変化を観察します 実験結果上記の手順をうまくやれば 7-Segment の変化は 0,1,,8. そして 0 にまた繰り返すように表示されます 実験後の問題 1. 上のプログラムは 0 から F まで表示させましたが逆順に F から 0 までに表示たければプログラムはどう変更しますか? 2. Assembly 言語のプログラム中 DT コマンドの意味を示し 表の最後に 0x00 のデータを代入するのは何のだめでしょう? - 70 -

8. 実験 6 7-Segment とスイッチを共に稼動する実験目的 1. 基本的な電子回路をつなげられること 2. スイッチで 7-Segment を制御するプログラムを作成すること 3. サンプルプログラムを拡張し適応できること実験装置 1. マイクロコントローラボード CP-PIC V3.0EXPAND 2.7-Segment (Common Cathode) 1 個 3.560 オームの抵抗器 8 個 4. スイッチ ( 押 / 放 ) 2 個 5. ケーブル実験前の説明この実験ではスイッチ ( 押 / 放型 )2 個を用いて 7-Segment の表示をコントロールし 数字を増加したり 減少したり スイッチを押すことによって変動させることができます 実験の手段 1. 回路を下図のようにつなげてください 図 6.1 実験回路 - 71 -

図 6.2 実験回路 ( つづき ) LED 7-Segment のデジタルデータ dp g F e d c b a D7 D6 D5 D4 D3 D2 D1 D0 カソード足を使用するときの 16 進数 LED で表示する数字 0 0 1 1 1 1 1 1 3F 0 0 0 0 0 0 1 1 0 06 1 0 1 0 1 1 0 1 1 5B 2 0 1 0 0 1 1 1 1 4F 3 0 1 1 0 0 1 1 0 66 4 0 1 1 0 1 1 0 1 6D 5 0 1 1 1 1 1 0 1 7D 6 0 0 1 0 0 1 1 1 27 7 0 1 1 1 1 1 1 1 7F 8 0 1 1 0 1 1 1 1 6F 9 0 1 1 1 0 1 1 1 77 A 0 1 1 1 1 1 0 0 7C B - 72 -

0 0 1 1 1 0 0 1 39 C 0 1 0 1 1 1 1 0 5E D 0 1 1 1 1 0 0 1 79 E 0 1 1 1 0 0 0 1 71 F 1 1 1 1 1 1 1 1 FF 8. 2. 次のようにプログラムを書き込んで HEX ファイルにコンパイルします Assembly 言語 PIC 16F877 用 list p=16f877 ;list directive to define processor #include <p16f877.inc> ;processor specific variable definitions OFFSET EQU 0x20 COUNT1 EQU 0x21 COUNT2 EQU 0x22 ORG 0x0000 BSF STATUS,RP0 ;Bank1 を選択する MOVLW 0xFF MOVWF TRISB ;PORTB を入力にする CLRF TRISD ;PORTD を出力にする BCF STATUS,RP0 ;Bank0 を選択する CLRF PORTD CLRF OFFSET ;offset=0 にする START BTFSS PORTB,0 ;UP ボタンの値を読む GOTO DATA_UP ;UP ボタンを押した場合 BTFSS PORTB,1 ;DOWN ボタンの値を読む GOTO DOWN ;DOWN ボタンを押した場合 GOTO START ; またキーの値を読む DATA_UP MOVEW.16 ; 最後の offset 値 SUBWF STATUS,Z ;flax Z の結果を試験 INCF OFFSET,F ;OFFSET<16 なら OFFSET を増加する GOTO DISPLAY ;OFFSET=16 DOWN MOVLW.0 ; 最初の offset ADDWF OFFSET,W ;W+OFFSET BTFSS STATUS,Z ;flax Z の結果を試験 DECF OFFSET,F ;OFFSET 0 なら OFFSET を減少する - 73 -

DISPLAY CALL DELAY ; スイッチにより Debounce を減らす CALL DELAY MOVE OFFSET,W ;offset 値を W に代入 CALL TAB ;Table からのデータを取得 MOVWF PORTD ;PORTD にデータを送信する GOTO START DELAY CLRF COUNT1; タイミングするプログラム DEL0 CLRF COUNT2 DEL1 DECFSZ COUNT2,F GOTO DEL1 DECFSZ COUNT1,F GOTO DEL0 RETURN *******Table of data******** TAB ADDWF PCL ;Move offset to PC lower DT 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x27,0x7F,0x6F,0x77,0x7C,0x39,0x5E, 0x79,0x71,0xFF END Assembly 言語 PIC 18f458 用 list p=16f877 ;list directive to define processor #include<p18f458.inc> ;processor specific variable definitions OFFSET EQU 0x20 COUNT1 EQU 0x31 COUNT2 EQU 0x32 ORG 0x0000 SETF TRISB ;PORTB を入力にする CLRF TRISD ;PORTD を出力にする CLRF OFFSET ;offset=0 にする START BTFSS PORTB,0 ; UP ボタンの値を読む GOTO DATA_UP ;UP ボタンを押した場合 BTFSS PORTB,1 ;DOWN ボタンの値を読む GOTO DOWN ;DOWN ボタンを押した場合 GOTO START ; またキーの値を読む - 74 -

DATA_UP MOVEW.32 ; 最後の offset 値 CPFSGT OFFSET ;offset 値を 32 と比較 INCF OFFSET,F ;OFFSET<32 なら OFFSET を増加する GOTO DISPLAY DOWN MOVLW.0 ; 最初の offset CPFSEQ OFFSET ;offset 値を 0 と比較 DECF OFFSET,F ;OFFSET 0 なら OFFSET を減少する DISPLAY CALL DELAY ; スイッチの Debounce を減らす MOVE OFFSET,W ;offset 値を W に代入 CALL TAB ;Table からのデータを取得 MOVWF PORTD ;PORTD にデータを送信 GOTO START *****DELAY TIME***** DELAY CLRF COUNT1; タイミングする DEL0 CLRF COUNT2 DEL1 DECFSZ COUNT2,F GOTO DEL1 DECFSZ COUNT1,F GOTO DEL0 RETURN TAB ADDWF PCL ;Move offset to PC lower DT 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x27,0x7F,0x6F,0x77,0x7C,0x39,0x5E, 0x79,0x71,0xFF END プログラムの解説このプログラムは 2 個のスイッチ UP と DOWN を押すことによって 7-Segment を変動させます UP を押すと数字を 1 増加し DOWN を押すと 1 減少し数字の順は次のようになります 0,1,2,3,4,5,6,7,8,9,A,b,C,d,E,F と 8. プログラムによって前の実験と同じような作業をしつまり表を開きデータを獲得出力します ところが本実験スイッチを押されるかを確認し UP のスイッチが押されたとき OFFSET の値を 1 つ上げて PIC に入っているデータの個数を超えないように OFFSET 値を制限します PIC 16F877 の場合 最高の OFFSET 値は 16(OFFSET+1) 一方 PIC18F458 の場合は 32(OFFSET+2) までです この実験に使っているデータ表は 17 個までであるので UP ボタンを押すときに OFFSET の値を最高値 (PIC16F877 が 16 18F458 が 32) と比較します - 75 -

同様に DOWN スイッチを押すと OFFSET 値が 1 下げるが 0 以下にならないようにチェックする必要があります 前の実験と同じく OFFSET 値によって表に入っているデータを取得して出力します Basic INCLUDE modedefs.bas プログラムを呼び出し DEFINE OSC 10 振動数を指定する I VAR BYTE TRISB = $FF PORTB を入力にする TRISD = $00 PORTD を出力にする PORTD = $00 PORTD をクリア i = 0 i=0 に初期化する START; IF(PORTB,0=0)AND(i<17) THEN i = i +1 UP を押すと i の値が 17 以下なら i を1つ増加 ENDIF IF(PORTB,1=0)AND(i<0)THEN i = i-1 DOWN を押すと i の値が0 以上なら i を 1 つ減少 ENDIF PAUSE 150 LOOKUP i,[$3f,$06,$5b,$4f,$66,$6d,$7d,$27,$7f,$6f,$77,$7c,$39,$5e,$79, $71,$FF],PORTD GOTO START END プログラムの解説 Assembly のプログラムと同じように UP と DOWN スイッチの信号によって表示するデータを変更します UP を押すと 17 より小さければ i を 1 増加し DOWN を押すと 0 より大きければ 1 で減少します その変更した値 (i 値 ) で表に入っている情報を取得し データを表示します 3. ソースコードをコンパイルして HEX ファイルを CPU にダウンロードして 7-Segment - 76 -

の動作を観察します - 77 -

実験結果本実験は 7-Segment とスイッチ共同させ スイッチの信号によって 7-Segment の表示する数字が変更します UP スイッチ押すと 8. まで1で足し算し DOWN を押すと 0 まで 1で引きます Debounce 問題が起こらないようにプログラム中にはタイミングする部分を入れています 実験後の問題 6.1 UP と DOWN のスイッチを押すことによって 7-Segment にどうなりますか? 6.2 スイッチを押した後タイミングするのは何のためでしょうか? - 78 -

9. 実験 7 Mini Speaker/Buzzer 実験目的 1. 基本的な電子回路をつなげられること 2. 小型スピーカーを制御するプログラムを作成すること 3. サンプルプログラムを拡張し適応できること 実験装置 1. マイクロコントローラーボード CP-PIC V3.0EXPAND 2. mini Speaker と Buzzer 1 個 3. トランジスター 1 個 4. Diode 1N4148 1 個 5. 560Ω の抵抗器 1 個 6. ケーブル 実験前の説明この実験は小型スピーカーの動作を学び ここでは mini Speaker と Buzzer を用い 二つとも鳴かすことができますが Buzzer がより使いやすく ただ電圧をいれまたは理論値 1 を Buzzer に送れば鳴かせ 理論値 0 を入れ替えると止まることになります ところが Buzzer から出された音が高低なしに 1 トーンになります 一方スピーカーの場合はプログラム中で振動数を指定することができますがプログラムがもっと複雑になります 本実験では Buzzer と Mini Speaker 両方使うことにします 実験手段 7.1 下図のように回路をつなげます 最初に Buzzer を実験します 図 7.1 実験回路 - 79 -

- 下のソースコードを書き込んで HEX ファイルにコンパイルします Assembly 言語 PIC 16F877 用 list p=16f877 #include <p16f877.inc> COUNT1 EQU 0x31 COUNT2 EQU 0x32 COUNT3 EQU 0x33 ;list directive to define processor ;processor specific variable definition ORG 0x0000 BCF STATUS,RP1 BSF STATUS,RP0 ;Bank1 を選択 CLRF TRISC ;PORTC を出力にする BCF STATUS,RP0 ;Bank0 を選択 START BSF PORTC,0 ;Buzzer を起動 CALL DELAY ; タイミングする BCP PORTC,0 ;Buzzer を閉じる CALL DELAY ; タイミングする GOTO START *****Delay Time***** DELAY MOVLW 0x04 ; タイミングする MOVWF COUNT1 DEL CLRF COUNT2 DEL0 CLRF COUNT3 DEL1 DECFSZ COUNT3,F GOTO DEL1 DECFSZ COUNT2,F GOTO DEL0 DECFSZ COUNT1,F GOTO DEL RETURN END - 80 -

Assembly 言語 PIC18F458 用 list p=18f458 ;list direction to define processor #include<p18f458.inc> ;processor specific variable definitions COUNT1 EQU 0x31 COUNT2 EQU 0x32 COUNT3 EQU 0x33 ORG 0x0000 CLRF TRISC ;PORTC を出力にする START BSF PORTC,0;Buzzer を起動 CALL DELAY ; タイミングする BCF PORTC,0;Buzzer を閉じる CALL DELAY ; タイミングする GOTO START *****Delay Time***** DELAY MOVLW 0x04 ; タイミングするプログラム MOVWF COUNT1 DEL CLRF COUNT2 DEL0 CLRF COUNT3 DEL1 DECFSZ COUNT3,F GOTO DEL1 DECFSZ COUNT2,F GOTO DEL0 DECFSZ COUNT1,F GOTO DEL RETURN END プログラムの解説このプログラムは Buzzer を鳴かせ 理論値 1 を Buzzer とつながる足に代入し 止まるときに 0 を送ります ここでは PORTC を出力にさせて 理論値 1 を BSF PORTC,0 コマンドで送信してから理論値 0 を BCF PORTC,0 でタイミングします このとき Buzzer が鳴いたり止んだりするように繰り返します - 81 -

BASIC 言語 INCLUDE modedefs.bas プログラムを呼び出し DEFINE OSC 10 振動数を 10 MH z に指定する TRISC = $00 PORTC を出力にする PORTC = $00 PORTC をクリア START; HIGH PORTC,0 Buzzer を起動 PAUSE 300 タイミングする LOW PORTC,0 Buzzer を閉じる PAUSE 300 タイミングする GOTOSTART END プログラムの解説 前の Assembly 言語のプログラムと同様に理論値 1 を Buzzer に出してタイミングし てから理論値 0 を送ってまたタイミングします よって Buzzer が鳴いたり止んだり するようになります プログラムをコンパイルして HEX ファイルを CPU にダウンロードして観察します 7.2 mini Speaker を置き換えて回路をつなげます 図 7.2 実験回路 - 82 -

次のソースコードを書き込んでコンパイルします Assembly 言語 PIC 16F877 用 list p=16f877 ;list directive to define processor #include<p16f877.inc> ;processor specific variable definitions #define SPK PORTC,0 ;PORTC,0 COUNT EQU 0x21 COUNT1 EQU 0x22 COUNT2 EQU 0x23 COUNT3 EQU 0x24 ORG 0x0000 BCF STATUS,RP1 BSF STATUS,RP0 CLRF TRISC ;PORTC を出力にする BCF STATUS,RP0 LOOP CALL PULSE ; 音声を発信するプログラム BCF SPK ; 音を閉じる CALL DELAY 2 ; タイミングする GOTOLOOP ; ループを繰り返す PULSE CLRF COUNT ;COUNT=0 PUL BCF SPK ; スピーカーを Off にする CALL DELAY ; タイミングする BSF SPK ; スピーカーを On にする CALL DELAY ; タイミングする DECFSZ COUNT,T GOTOPUL ; ループを COUNT の値回数で繰り返す RETURN *****Delay***** DELAY MOVLW 2 ; タイミングするプログラム MOVWF COUNT1 DEL1 CLRF COUNT2 GOTO DEL2 DECFSZ COUNT1 GOTO DEL1 RETURN - 83 -

*****Delay Loop2***** DELAY MOVLW 5 ; タイミングするプログラム MOVWF COUNT1 DELY CLRF COUNT2 DELY1 CLRF COUNT3 DELY2 DECFSZ COUNT3 GOTO DELY2 DECFSZ COUNT2 GOTO DELY1 DECFSZ COUNT1 GOTO DELY RETURN END Assembly 言語 PIC18F458 用 list p=18f458 ;list directive to define processor #include <p18f458.inc> ;processor specific variable definitions #define SPK PORTC,0;PORTC,0 COUNT EQU 0x21 COUNT1 EQU 0x22 COUNT2 EQU 0x23 COUNT3 EQU 0x24 ORG 0x0000 CLRF TRISC ;PORTC を出力にする LOOP CALL PULSE ; 音声を作成する子プログラム BCF SPK ; 音声を閉じる CALL DELAY2 ; タイミングする GOTO LOOP ; ループを繰り返す ***** 音声パルスを作成する子プログラム ***** PULSE CLRF COUNT ;COUNT=0 PUL BCF SPK ; スピーカーを Off にする CALL DELAY ; タイミングする BSF SPK ; スピーカーを On にする CALL DELAY ; タイミングする DECFSZ COUNT,F - 84 -

GOTO PUL ;COUNT 値と同じ回数を繰り返す RETURN *****Delay***** タイミングする子プログラム DELAY MOVLW 2 MOVWF COUNT1 DEL1 CLRF COUNT2 DEL2 DECFSZ COUNT2 GOTO DEL2 DECFSZ COUNT1 GOTO DEL1 RETURN *****Delay Loop2***** タイミングする子プログラム DELAY2 MOVLW 5 MOVWF COUNT1 DEL CLRF COUNT2 DEL1 CLRF COUNT3 GOTO DEL_2 DECFSZ COUNT2 GOTO DEL_1 DECFSZ COUNT1 GOTO DEL RETURN END プログラムの解説このプログラムはスピーカーを鳴かすようにさせるプログラムです Buzzer を鳴かせるのにただ理論値 1 を送るだけですがそれと違って スピーカーの場合はスピーカーが対応できるような振動数のパルスを作成しておきます プログラム中に 2 つ分けられ 本プログラムは PORTC を出力にして パルスを作成するために子プログラムを呼び出してタイミングします それからプログラムを繰り返します 子プログラムでは Delay を On/Off コマンドで挟んで作成されたパルスの振動数とパルスの個数が順番に DELAY の長さと COUNT の値によって決まります ここでは 0 にするからパルスの個数は 256 個になります - 85 -

BASIC 言語 INCLUDE modedefs.bas プログラムを呼び出し Define OSC 10 振動数を 10MHz にする SPK var PORTC,0 Define speaker pin beep: FREQOUT SPK,1000,2000 1 秒間で振動数を 2KHz にする PAUSE 100 タイミングする GoTo beep プログラムの解説前の Assembly 言語のプログラムと同じくスピーカーを鳴かすプログラムです Basic 言語では FREQOUT を使って音声の振動数を作成させる ここでは 1 秒間で 2000Hz の振動数を鳴かせて PAUSE コマンドで 100ms 音声を止まらせてまた鳴かせるように繰り返します HEX ファイルを CPU にダウンロードして観察します 実験結果手段 7.1 の実験は Buzzer を鳴かすようなプログラムでコンパイルしてダウンロードしたら Buzzer が鳴ったりやんだりするようになります 次に手段 7.2 の実験 mini Speaker の場合音声の振動数のパルスを作成する子プログラムを作る必要があります この子プログラムを改めに書き直すことによって音声のパターンを変えることができます 実験後の問題 7.1 この実験によりスピーカーと Buzzer の違いは何でしょう? 7.2 Mini Speaker を鳴かす方法を挙げてください 7.3 手段 7.2 の Assembly 言語プログラム中 COUNT 変数はどの役割でしょう? - 86 -

10. 実験 8 Keyboard Matrix 4x3 実験目的 1. 基本的な電子回路をつなげられること 2.Keyboard Matrix 4x3 と使用するプログラムを作成すること 3.Matrix 型の Keyboard の原理を学ぶこと 4. サンプルプログラムを拡張し適応できること実験装置 1. マイクロコントローラー CP-PIC V3.0EXPAND 2. Keyboard Matrix 4x3 1 個 3. 7-Segment 1 個 4. 560Ω の抵抗器 1 個 5. ケーブル実験前の説明この実験では Matrix 4x3 型キースイッチを 7-Segment と共に稼動することを学びます ここではキーボードを PORTB とつけます PORTB には pull-up 機能を持っていますから内部に抵抗器をつけなくてもキーボードとつなぐことができます そして 7-Segment を PORTD とつなげてスイッチを押す結果を表示させます 7-Segment を表示するプログラムは前の実験と同様です 実験手段 1. 下図のように回路をつなげて PORTD を 7-Segment と PORTB を Keyboard とつけることに注意します 図 8.1 実験回路 - 87 -

図 8.2 実験回路 ( 続き ) 2. 次のソースコードを書き込んでコンパイルします Assembly 言語 16F877 用 LIST p=16f877 Include <p16f877.inc> ROW EQU 0x30 OFFSET EQU 0x31 COUNT1 EQU 0x32 COUNT2 EQU 0x33 ORG 0x0000 BSF STATUS,RP0 ;bank1 を選択する CLRF TRISD ;PORTD を出力にする MOVLW 0xF0 ; 11110000 MOVWF TRISB ;PORTB<7:1> is input PORTB<3:0> is output BCF OPTION_REG,7 ;enable pull-up PORTB BCF STATUS,RP0 ;bank0 を選択する CLRF PORTD ;LED をクリア *****start to send***** START MOVLW 0xFE ; スキャンデータを 11111110 にする MOVWF ROW ; 変数 ROW に保存する - 88 -

CLRF OFFSET ;OFFSET=00 に初期化する NEXT MOVF ROW,W MOVWF PORTB ; スキャンしたデータを PORTB に送信 BTFSS PORTB,4;1 列目が押されるかどうかチェックする GOTO COL_1 BTFSS PORTB,5;2 列目が押されるかどうかチェックする GOTO COL_2 BTFSS PORTB,6;3 列目が押されるかどうかチェックする GOTO COL_3 MOVLW 3 ;3 キーを押すときに足し算する定数 BCF STATUS,C ;clear carry flag ADDWF OFFSET,F ;count=count+3 BSF STATUS,C ;Set carry flag RLF ROW,F ; 理論値を変えて次の行を読み込む BTFSS ROW,4 ; 最後の行であるかどうかを確認する GOTO START ; また繰り返してスキャンする COL_3 INCF OFFSET,F ;OFFSET+1 COL_2 INCF OFFSET,F ;OFFSET+1 COL_1 MOVF OFFSET,W ;W=OFFSET CALL TAB ; 表を開く子プログラム MOVWF PORTD ;7-Segment にデータを送る CALL DELAY ; タイミングする GOTO START ; 繰り返してスキャンする ;************** DELAY CLRF COUNT1 ; タイミングするプログラム DEL CLRF COUNT2 DEL1 DECFSZ COUNT2,F GOTO DEL1 DECFSZ COUNT1,F GOTO DHL RETURN ****Table Of 7-Segment Code**** TAB ADDWF PCL,F DT 0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x27,0x7F,0x6F,0x77,0x3F,0x7C END - 89 -

Assembly 言語 18F458 用 list p = 18f458 ;list directive to define processor #include <p18f458.inc> ;processor specific variable definitions OFFSET EQU 0x20 ROW EQU 0x21 DT1 EQU 0x22 DT2 EQU 0x23 DA_TA EQU 0x24 ORG 0x0000 *****initial***** CLRF TRISD ;PORTD を出力にする MOVLW 0xF0 ; 11110000 MOVWF TRISB ;PORTB<7:4> is input PORTB<3:0>is output BCF INTCON2,RUPU ;enable pull-up PORTB *****start to send***** START MOVLW 0x0E ; スキャンするデータを 11111110 にする MOVWF ROW ; 変数 ROW に保存する CLRF OFFSET ;OFFSET=00 に初期化する SCAN MOVF ROW,W MOVWF PORTB ; スキャンしたデータを PORTB に送る BTFSS PORTB,4;1 列目押されたかどうかを確認する GOTO COL_1 BTFSS PORTB,5; 2 列目押されたかどうかを確認する GOTO COL_2 BTFSS PORTB,6; 3 列目押されたかどうかを確認する GOTO COL_3 MOVLW 6 ; 3 キーを押すときに足し算する定数 CLRC ;clear carry flag ADDWF OFFSET,F ;count=count+6 MOVLW.24 ; 最後の行を確認するための数字 OFFSEQ OFFSET ;offset 値を比較する GOTO NEXT_SCAN ; 最後の行ではない GOTO START ; すべての 4 行をスキャンして最初に戻る NEXT_SCAN BSF STATUS,C ;set carry flag RICF ROW,F ; 次の行を置き換え - 90 -

GOTO SCAN ; 次の行をスキャンする COL_3 MOVLW.4 ;3 列目用の offset 値 ADDWF OFFSET,W ;w=offset+4 GOTO DISPLAY COL_2 MOVLW.2 ;2 列目用の offset 値 ADDWF OFFSET,W ;w=offset+2 GOTO DISPLAY COL_1 MOVF OFFSET,W ;1 列目用の offset 値 DISPLAY CALL TAB ; 表からデータを取得 MOVWF PORTD ;7-Segment にデータを送る CALL DELAY ; タイミングする GOTO START ; またスキャンを繰り返す DELAY CLRF DT1 ; タイミングするプログラム SD2 CLRF DT2 SD1 DECFSZ DT2 GOTO SD1 DECFSZ DT1 GOTO SD2 RETURN *****Table of 7-Segment Code***** TAB ADDWF PCL,f ;Move offset to PC lower DT 0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x27,0x7F,0x6F,0x77,0x3F,0x7C ;1,2,3,4,5,6,7,8,9,A,0,b END - 91 -

プログラムの解説このプログラムは 4x3 のマトリックス型スイッチの信号を毎行スキャンします はじめに理論値 0 を ROW( 行 ) ごとに送り 列 (COL1,COL2,COL3) とつながるビットをチェックし どの列のビット値が 0 であればその行と列には押されたボタンがあるのです 下図と表はスイッチとそのビット値の変動を表します ROW 1,2,3,4 COL1,COL2,COL3 R1 R2 R3 R4 C1 C2 C3 C1 C2 C3 C1 C2 C3 C1 C2 C3 0 1 1 1 0 1 1 1 0 1 1 1 0 1 1 1 キー 1 を押すキー 2 を押すキー 3 を押す押さない 1 0 1 1 キー 4 を押すキー 5 を押すキー 6 を押す押さない 1 1 0 1 キー 7 を押すキー 8 を押すキー 9 を押す押さない 1 1 1 0 キー * を押すキー 0 を押すキー # を押す押さない 例えば理論値 0 を RB0(ROW1) に送って RB4,RB5,RB6 の状態をチェックし もし RB4 が 0 であればキー 1 が押され または RB5 が 0 のときキー 2 RB6 が 0 のときキー 3 などなど このようなやり方で毎行毎列をスキャンします ここで RB0-RB3 が出力にし RB4-RB6 を入力にします 出力ビットが普段 Pull-up の抵抗器をすべての足につけなければならないがこの実験では内部 pull-up 抵抗器を持っている PORT B を用いますから RBPU のビットをクリアすることによって pull-up を選択することができます 16F877 の場合 レジスター OPTION_REG の 7 ビット目に 18F458 の場合 レジスター INTCON2 の 7 ビット目にあります - 92 -

このプログラム 4 x 3 キーの押された数字をもらって 7-Segment で表示します 前の実験と同様に表を開いてデータを取得しますがここではキーをスキャンするプログラムを追加します あわせて キーを押すと OFFSET 値がそのキーの数字を指定する番号に変更し OFFSET 値で表を開いてデータを取得し 7-Segment で表示します ここでは表に入っているデータが 12 個 1,2,3,4,5,6,7,8,9,A,0 と b になります BASIC 言語 INCLUDE modedefs.bas Include serial modes DEFINE OSC 10 i var byte index var byte keyin var byte keyout var byte PIC16F877 の場合 OPTION_REG.7 LOW INTCON2.7 PIC18F458 の場合 pull-up INTCON2.7 enable PORTB に入れ替 えます TRISB =$0F PORTB<7:4> を出力 PORTB<3:0> を入力にする TRISD =$00 PORTD を出力にする PORTD=$00 PORTD をクリア scan: for i=0 to 2 3 回スキャンする lookup I,[$E0,$D0,$B0],keyout 表を開いてキーをスキャンする PORTB=keyout PORTB に送る Keyin=PORTB&SOF 下の 4 ビット if keyin=$0f then next_scan スキャンした値が $0F ときつまり押さないとき ま たスキャンする pause 50 Debounce スイッチのためにタイミングする keyin=keyin keyout keyin=[keyin or keyout] lookdown keyin,[$ef,$de,$be,$fd,$dd,$bd,$eb,$db,$bb,$e7,$d7, $B7],index lookup index,[$06,$5b,$4f,$66,$6d,$7d,$27,$7f,$6f,$77,$3f,$7c],portd next_scan; next goto scan - 93 -

プログラムの解説このプログラムでは表を開いてキーをスキャンしてから PORTB<3:0> の押されたキーを取得します スイッチが押されてないとき PORTB<3:0> の値が $0F になります 層でなければ PORTB<3:0> の理論値を keyout 変数の理論値と OR( または : 二つの理論値を足し算する ) して表を開きます 最初に lookdown 表を使ってキーの位置を探し そのキーの位置を lookup 表で 7-Segment の記号に変換して PORTD に送ります PORTB の pull-up を決めるには PIC 16F877 の場合レジスター OPTON_REG の RBPU 7 ビット目をクリアします 二つの CPU には RBPU の位置が異なりますから事前に CPU とレジスター RBPU の位置が正確であることに注意します スイッチの配置を表す図 - 94 -