Full text

(1)

序文

 マイクロコントローラを勉強する際、原理だけではなく実験することが必要です。手を動 かし、実践に問題を解決することによってマイコンの知識を理解し使いこなせるようにな ります。この実験マニュアルにはプログラムを書くのをはじめ、ハードウェアの回路の知識 までもたらします。  この実験マニュアルに説明してあるほとんどの実験は 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   等で販売されています。

(2)

目次

項目 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. 付属

(3)

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

(4)

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

(5)

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

(6)

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

(7)

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

(8)

発光ダイオード(LED:Light Emitting Diode)

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

(9)

図 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 に供給します。

(10)

理(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 でグランドに入ります。

(11)

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)

(12)

図 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)につなげます。(下図参照)

(13)

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

(14)

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 本をつないで使います。 ステッピング・モータの駆動 ステッピング・モータを駆動させるために電線を必ず正確につなげることです。ステッ ピング・モータの駆動パターンは主に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 少し時間ずれの電子信号を入れれば前の例 と逆方向に回転することになります。このような駆動パターンはモータの動作が以

(15)

下の表になります。 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 を回転するときに連 続に駆動します。

(16)

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 の足にデータを転送し、ステッピング・モータが前のデータに従え稼動してまた 新しいデータを受信し実行するためにデータを送るときにステップ間に時間をおく必要が

(17)

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

(18)

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 に示します。足 の詳細も下記の表に説明します。 図 22 トランジスターの記号と構造 図 23 LCD の足の配置

(19)

LCD の足の名前とその機能を表す表 足の番目 足の名前 役割 1 GND 電子回路のグランド 2 +VDD +5V の電圧の電流と取り付ける足 3 Vo LCD の明るさを調整する電圧を入れる足 4 RS 命 令 レ ジ ス タ ー か デ ー タ レ ジ ス タ ー を 選 ぶ 足 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-RD0-D7 とつなげ、RS 足と RC0 足、E 足と RC1 足、そして R/W 足がグランドとつ なぎ、LCD の明るさを調整するために Vo は 10 k Ω の抵抗器とつなぎます。

(20)

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 ビットのデータに対応するようにさせるからです。

(21)

 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 をコントロールする命令  画面を空にする 図 25 4ビットデータの接続

(22)

命令のデータは 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”=カーソルを表示しない

(23)

“1”=カーソルを表示する

   B : LCD の画面を点灯する文字を設定するビット “0”=点灯しない

(24)

 カーソルと文字の移しをコントロールする命令   カーソルと文字の移しをコントロールする命令でさまざまな設定値が下記のようにあ ります。   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 行以上を表示するときと同じく設定 してください。

(25)

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

(26)

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

(27)

ボート上の電子回路のつなげる例

図 28 直列に抵抗器をつなげる回路

(28)

実験手段の案内

 本実験は 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に参照してください。

(29)

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 を使用します。

(30)

Assembly 言語でプログラミングする手段 1. MPLAB プログラムを開く

図 1.2 MPLAB プログラムを開く

(31)

図 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 プロジェクトの新規作成

(32)

 プロジェクトの名前をつけ終わったら図 1.6 のように Edit Project(プロジェクト編集)の画 面が表し、プログラムの設定値を決めます。この設定値はプログラム書き終わった後でも変 更可能です。今 ASM ファイルがないからこの手段を飛ばして Cancel ボタンをクリックして 終了してください。

図 1.6 Edit Project の画面

3. Edit Project の画面を閉じてから図 1.3 のように MPLAB プログラムの Dialog が示し、 FileNew (Ctrl+N)を選んで下図 1.7 が表します。そこで Assembly のソースプログラム を書き込む

(33)

図 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)

(34)

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 ; 繰り返し 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 の値によって決まります

(35)

#注:)実験するときにコメントの文章を書かなくてもよいです。 ( ; の記号の後にはコメ ントです。)

4. ソースコードを入力し終わったら FileSave または Ctrl+S で Save File As(別名保存)の 画面が出てき、ファイル名をつけて拡張子を.asm にしてプログラムを保存します。ただ し、保存ダイレクトリーは前のプロジェクトファイル(.pjt)と同じダイレクトリーにしな ければなりません。ここでは lab_pic のダイレクトリー下で LAB1.asm と名付て保存し ます(図 1.9 参照) ******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 にすることが忘れてはなりません。

(36)

図 1.9 プログラムファイルを保存する

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

(37)

  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 のようにします

(38)

その後 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 の画面に戻ります。

(39)

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 参照)

(40)

次に 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 のみです。エラーメッセージがでたらプログ ラムの文法などエラーの原因を表示するメッセージがでてきます。

(41)

図 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 または で開きます。

(42)

図 1.21 ダウンロードするファイルを開く

  ダウンロードする HEX ファイルを選びます。

  7.6 Device 欄で自分の CPU の番号と一致するように選択します。   7.7 ViewConfiguration で設定を行います。

(43)

図 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 ファイルが

(44)

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

(45)

1. 下記のサンプルソースプログラムをテキストエディターに入力してください。

2. プログラムをコンパイルします。CPU の番号を実験するのと一致するように注意してく ださい。うまくコンパイルできれば HEX ファイルがでてきます。

3. CPU に出来上がった HEX ファイルをダウンロードします。Assembly 言語の段階7と同 じように行います。

4. PORTA.0 につける LED Test の変動でプログラムの動作を観察します。 実験結果  下記の手段を行えば LED が光ったり消えたりするように見えます。タイミングによって その頻度が異なります。 実験後の問題 1.1 Port A を使用するときに Register の値を 07h に設定するのはなぜでしょうか?そして その値を決定するのは何を意味するでしょう? 1.2 この実験によるともっと LED の光る頻度を増やすにはとうしたらよいでしょう? 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 が光ったり消 えたりするように見えます。

(46)

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 実験回路

(47)

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

(48)

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 に送ります。

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 され、新たなデータを取得できるまでその状 態を保ちます

(49)

3. 作成したファイルを実験1のプログラムと同じダイレクトリーに保存し、ここで lab_pic の下で lab2.asm を名づけて保存します。

図 2.3 新規作成したファイルを名づけて保存 4. プログラムをコンパイルします

(50)

図 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と同じです。

(51)

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

(52)

実験後の問題

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

(53)

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

(54)

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

(55)

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

(56)

3. コンパイルして HEX ファイルを CPU にダウンロードして実行すると PORTD とつ なぐ LED の様子を観察してください。

プログラムの解説

 このプログラムは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 個ずつ光り ます。

(57)

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

(58)

実験目的 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 実験回路

(59)

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で様子を観察します。

(60)

 ソースコートをコンパイルしてCPUに HEX ファイルをダウンロードしてからスイッチ の位置を変動して実験の結果を観察します。  4.2 上記のプログラムを拡張して実験3の走る光の速度を DIP スイッチで制御できるよ うに次のソースコートを書き込み、コンパイルして HEX ファイルをダウンロードして Dip スイッチの値の変動によってプログラムの動作を観察します。 BASIC 言語 INCLUDE “modedefs.bas” ‘プログラムを呼び出す DEFINE OSC 10 ‘振動数を 10MHz にする TRISD = $00 ‘PORTD を出力にする TRISB = $FF ‘PORTB を入力にする

start; PORTD =PORTB ‘PORTB のデータを PORTD に送信する GOTO start

プログラムの解説

 このプログラムはAssembly 言語で書いた前のプログラムと同じ動作をします。スイッ チからデータを受信してPORTD の LED で表示します。

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 つ左に移す。

(61)

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

(62)

DECFSZ DT1,F GOTO DEL RETURN END プログラムの解説  このプログラムは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まで設定するこ とができる

(63)

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

(64)

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)の動作を決めます。次のページに載っている表を参照してく ださい。

(65)

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.

(66)

実験手法

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 を出力にする   BCF STATUS,RP0 ;Bank0 を選択 ST CLRF OFFSET ;Start OFFSET =0

START MOVFOFFSET,W ;offset 値を Register W に送る

CALL TAB ;Table からのデータを取得するプログラ ム

(67)

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

(68)

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

(69)

 このコマンドの動作は元に戻し(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 ロープにま た戻ります。

(70)

3.プログラムをコンパイルして CPU に HEX ファイルをダウンロードして実行し 7-Segment の変化を観察します。 実験結果  上記の手順をうまくやれば 7-Segment の変化は”0,1,…,8.”そして”0”にまた繰り返すよ うに表示されます。 実験後の問題 1. 上のプログラムは 0 から F まで表示させましたが逆順に F から 0 までに表示たければ プログラムはどう変更しますか? 2. Assembly 言語のプログラム中、DT コマンドの意味を示し、表の最後に 0x00 のデータを 代入するのは何のだめでしょう? 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 数字(文 字)を表示したあとまた元に戻ります。

(71)

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 実験回路

(72)

図 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

Figure

図 10 正確のつなげ方 図 10 は電流が LED を流し過ぎないようにさせます。その抵抗器はアノード側かカソード 側どちらでも可能です。 上に述べたように LED を通る電圧は 1.7V だから抵抗器の低効率によって LED の通る電 流を計算することができます。 電流を導入するときに LED の低効率が非常に低いため、つけた抵抗器の低効率と比べ無 視することができます。ところが LED での電圧が 1.7V から抵抗器での電圧が 5V のではな くて 3.3V に減少します。したがって、抵抗器を通る電

図 10

正確のつなげ方 図 10 は電流が LED を流し過ぎないようにさせます。その抵抗器はアノード側かカソード 側どちらでも可能です。 上に述べたように LED を通る電圧は 1.7V だから抵抗器の低効率によって LED の通る電 流を計算することができます。 電流を導入するときに LED の低効率が非常に低いため、つけた抵抗器の低効率と比べ無 視することができます。ところが LED での電圧が 1.7V から抵抗器での電圧が 5V のではな くて 3.3V に減少します。したがって、抵抗器を通る電 p.9
図 12 電流の下り側の制御

図 12

電流の下り側の制御 p.10
図 14 Common Anode 型の 7-SEGMENT の構造

図 14

Common Anode 型の 7-SEGMENT の構造 p.11
図 16 下り電流を制御する 7-SEGMENT のつなげ方

図 16

下り電流を制御する 7-SEGMENT のつなげ方 p.12
図 15 Common Cathode 型の 7-SEGMENT の構造

図 15

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

図 17

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

図 19

ステッピング・モータの形状とその構造 p.14
図 28 直列に抵抗器をつなげる回路

図 28

直列に抵抗器をつなげる回路 p.27
図 1.2 MPLAB プログラムを開く

図 1.2

MPLAB プログラムを開く p.30
図 1.3 MPLAB プログラムの画面を示す

図 1.3

MPLAB プログラムの画面を示す p.31
図 1.6 Edit Project の画面

図 1.6

Edit Project の画面 p.32
図 1.7 プログラムを書く込むファイルを作成

図 1.7

プログラムを書く込むファイルを作成 p.33
図 1.10 Edit Project の画面を示す

図 1.10

Edit Project の画面を示す p.36
図 1.9 プログラムファイルを保存する

図 1.9

プログラムファイルを保存する p.36
図 1.11 Development Mode の画面

図 1.11

Development Mode の画面 p.37
図 1.15 Simulator Program Memory Warning の警告

図 1.15

Simulator Program Memory Warning の警告 p.38
図 1.16 Add Node の画面

図 1.16

Add Node の画面 p.39
図 1.18 Node Properties の画面

図 1.18

Node Properties の画面 p.40
図 1.19 コンパイルエラーメッセージの例

図 1.19

コンパイルエラーメッセージの例 p.41
図 1.21 ダウンロードするファイルを開く

図 1.21

ダウンロードするファイルを開く p.42
図 1.23 Configuration の値を設定する

図 1.23

Configuration の値を設定する p.43
図 2.3 新規作成したファイルを名づけて保存 4. プログラムをコンパイルします

図 2.3

新規作成したファイルを名づけて保存 4. プログラムをコンパイルします p.49
図 2.4 により、プロジェクトファイルはまだ過去のファイル(lab1)になっていますので そのファイル名を lab2.asm と lab2.hex に変更しなければなりません。まず lab1[.asm]を クリックし Delete Node を選んで、そして新しいファイルを追加し Add Node 選択する と図 2.5 の画面が現れます。

図 2.4

により、プロジェクトファイルはまだ過去のファイル(lab1)になっていますので そのファイル名を lab2.asm と lab2.hex に変更しなければなりません。まず lab1[.asm]を クリックし Delete Node を選んで、そして新しいファイルを追加し Add Node 選択する と図 2.5 の画面が現れます。 p.50
図 2.6 新しいファイル追加後の Edit Project 画面 5. コンパイル完了したら CPU にダウンロードします。ダウンロード手順は実験1の段 階7と同じです。 6

図 2.6

新しいファイル追加後の Edit Project 画面 5. コンパイル完了したら CPU にダウンロードします。ダウンロード手順は実験1の段 階7と同じです。 6 p.51
図 5.1 7-Segment の回路

図 5.1

7-Segment の回路 p.64
図 5.2 実験回路

図 5.2

実験回路 p.66
TAB     ADDWF PCL ;PC lower に offset 値を代入 DT 0x3F,0x06,0x5B,0x4F,0x66,0x7D,0x27,0x7F,0x6F,0x77,0x7C,0x39,0x5E,  0x79,0x71,0xFF,0x00

TAB ADDWF

PCL ;PC lower に offset 値を代入 DT 0x3F,0x06,0x5B,0x4F,0x66,0x7D,0x27,0x7F,0x6F,0x77,0x7C,0x39,0x5E, 0x79,0x71,0xFF,0x00 p.67
図 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.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 p.72
TAB    ADDWF PCL ;Move offset to PC lower

TAB ADDWF

PCL ;Move offset to PC lower p.75
図 8.2 実験回路(続き) 2.次のソースコードを書き込んでコンパイルします。 Assembly 言語、16F877 用 LIST p=16f877 Include &lt;p16f877.inc&gt; ROW    EQU 0x30 OFFSET   EQU 0x31 COUNT1  EQU 0x32 COUNT2  EQU 0x33 ORG 0x0000 BSF STATUS,RP0 ;bank1 を選択する CLRF TRISD ;PORTD を出力にする MOVLW 0xF0 ;”1111000

図 8.2

実験回路(続き) 2.次のソースコードを書き込んでコンパイルします。 Assembly 言語、16F877 用 LIST p=16f877 Include &lt;p16f877.inc&gt; ROW EQU 0x30 OFFSET EQU 0x31 COUNT1 EQU 0x32 COUNT2 EQU 0x33 ORG 0x0000 BSF STATUS,RP0 ;bank1 を選択する CLRF TRISD ;PORTD を出力にする MOVLW 0xF0 ;”1111000 p.88

References

Related subjects : 序文・「はじめに」