• 検索結果がありません。

マイコンボードの LED 制御 準備編その 1 マイコンとノート PC の役割 どうすれば LED は光るの? 光らせる LED の選択は? マイコン端子に接続された LED マイコン端子の電圧設定 制御用ソフトウェアの注意点 1

N/A
N/A
Protected

Academic year: 2021

シェア "マイコンボードの LED 制御 準備編その 1 マイコンとノート PC の役割 どうすれば LED は光るの? 光らせる LED の選択は? マイコン端子に接続された LED マイコン端子の電圧設定 制御用ソフトウェアの注意点 1"

Copied!
28
0
0

読み込み中.... (全文を見る)

全文

(1)

1

マ イ コ ン ボ ー ドの

LED制御

∼ 準備編そ の 1 ∼

・マイコンとノートPCの役割

・どうすればLEDは光るの?

・光らせるLEDの選択は?

・マイコン端子に接続されたLED

・マイコン端子の電圧設定

・制御用ソフトウェアの注意点

(2)

2

マイコンとノートPCの役割

ノー トPC

タイマー

プログラム

メモリ

発光ダイオード

ブザー

手動スイッチ

温度センサ

光センサ

マ イコ ン ボ ー ド

プログラム実行中での状態モニタと入力

(Accemic MDE)

USBポ ー ト

プログラム作成(Softune)

AD変換器

(アナログ入力をデジタル信号へ変換)

DA変換器

(デジタル信号をアナログ出力へ変換)

(3)

3

ど う す れ ば LEDは 発光す るの ?

LEDに電流を流すと

LEDは発光する

LED+Rの両端はどちらも5V

LED+R両端の電位差はない

LEDに電流は流れず、発光しない

LED+Rの両端で5Vの電位差がある

LEDに電流が流れ、発光する

Vcc (=5V

DC

)

LED

R

S

A

Vcc (=5V

DC

)

LED

R

S

A

Vcc (=5V

DC

)

LED

R

S

A

(4)

4

発光させ る LEDの 選択は ?

Vcc (=5V

DC

)

LED1

R

E1

LED2

R

E2

LED3

R

E3

LED4

R

E4

1 1

1 1

1 1

0 1

E1~E4

1・・・5V

0・・・0V

全て1なのでどのLEDも

光らない

Vcc (=5V

DC

)

LED1

R

E1

LED2

R

E2

LED3

R

E3

LED4

R

E4

E3が0なので、LED3だけが

光る

光らせたいLEDの電源電圧を選択的に設定する

(5)

5

マ イ コ ン 端子に 接続され た

LED回路

LED

LED

P10

P10

14

14

に 接続され て い る 。

に 接続され て い る 。

P10~14

P10~14

0

0

0V

0

V

に す る と 、

に す る と 、

0

0

の 端子に 接続され た

の 端子に 接続され た

LED

LED

が 発光す る

が 発光す る

マイコン

LED

(6)

6

P10~14の 電圧設定

000001

H

番地 

ポート1データレジスタ(PDR1)

000011

H

番地 

ポート1方向レジスタ(DDR1)

アドレス番地

メモリ

役割

P10~14の値のセット

(1)

ポート1データレジスタ

に、P10~14の設定電圧のデータを代入する。

  (0V => 0、5V => 1:例ではP14 だけが0なのでLED5のみが発光する)

(2)ポート1データレジスタのデータが、出力用データか、読み取ったデータか、

の選択を

ポート1方向レジスタ

によって行う

  (読取り用 => 0 、出力用 => 1:例ではP10~14すべてで1なので、ポートデータ

レジスタの各ビット値に従って、P10~14の電圧が設定される )

x x x

0

1 1 1 1

x x x

1 1 1 1 1

レジスタ・・・8ビット

 8ビット <==> 1バイト

(7)

7

プ ロ グ ラ ム 上での

P10~14の 電圧設定

Port 10

Port 10

14

14

1

1

,

,

0

0

状態を 指定す れ ば よ い

状態を 指定す れ ば よ い

16進数で   E  

 F

1 1 1 1 1

0

1 1 1 1

(1 1 1)

x x x

16進数で   1  

 F

(0 0 0)

x x x

1.P14 だけを0にセット

2.P10~14すべてで1なので、

ポートデータレジスタの各ビッ

ト値に従って、P10~14の電圧

が設定される

LED5のみが発光

いかなる場合もこの部分

は消してはいけない!

(8)

8

開発環境の イ ン ス トー ル

USB

USB

仮想

仮想

Serial Port

Serial Port

ドラ イバ の イン ス トー ル

ドラ イバ の イン ス トー ル

統合開発環境の イン ス トー ル

統合開発環境の イン ス トー ル

ACCEMIC MDE

ACCEMIC MDE

モ ニ タ?)の イン ス トー ル

モ ニ タ?)の イン ス トー ル

USB_driver_installation_manual_J.pdfを参照

⇒ユ ー ザ ー ズ マ ニ ュ ア ル

(第1章∼1.1.3 ま で)

jouet_bleu_start_kit_manual_J.pdf) を 参照

⇒ユ ー ザ ー ズ マ ニ ュ ア ル

(本資料6∼7ペ ー ジ目)

実習

実習

実習

実習

CD

CD

ROM

ROM

の 内容を

の 内容を

HDD

HDD

デ ス ク トッ プ 等)に コ ピ ー して くだ さい

デ ス ク トッ プ 等)に コ ピ ー して くだ さい

実習

実習

(9)

9

マ イ コ ン ボ ー ドの

LED制御

∼ 準備編そ の 2 ∼

<0>システムの概要と留意点

<1>動作確認

<2>プログラムの作成/編集/保存/読み出し

 ・プログラムの作成と編集

 ・作成したプログラムの保存

 ・作成したプログラムの読み出し

<3>プログラム実行時の変数のモニタと入力

    (scanf/printfの代用方法)

(10)

10

システムの概要

各要素の(最低限の)役割

<Softune>

 ・プログラムの作成/編集とコンパイル

<Accemic MDE>

 ・マイコンボード上でのプログラムの実行

 ・実行中におけるグローバル変数のモニタ(printf文に相当)

 ・実行中におけるグローバル変数への入力(scanf文に相当)

マイコンボード

ノートパソコン

USB

インターフェース

<Softune・・・実行以前>

 ・プログラムの作成/編集/コンパイル

 ・コンパイルしたプログラムの書き出し

<Accemic MDE・・・実行時以降>

 ・マイコンボード上での実行

 ・グローバル変数のモニタ

 ・グローバル変数への入力

(11)

11

留意点

(1)マイコンボードは,特定のUSBポートでのみ動作するように設定されている。複

数のUSBポートがある場合は,どのUSBポートで動作するかを確認すること。

(2)

講義で用いるノートPCは他の講義との共用のため,自作したプログラムは,次

回の講義まで残っている保証はない。

従って,自作したプログラムは, 「メモ帳」や

「ワードパッド」などを用いて,別のテキストファイルとして保存する。

(3)

講義で用いるノートPCは最新の状態になっていないため,講義のノートPCはウィ

ルスに感染されている可能性がある。従って,個人のUSBメモリ等を直接講義のノー

トPCに接続することを禁止する。

(4)講義で用いるノートPCで作成したファイルを各自の環境に持ち込むため,USB

メモリを貸与する。ただし,

貸出したUSBメモリについてもウィルスの感染を否定で

きないため,貸出したUSBメモリを各自個人所有のノートPCにせつぞくすることを禁

止する

(4)

自作したプログラムを各自の環境に保存したい場合は,以下の手順を経ること。

・講義のノートPCに貸出したUSBメモリを接続し,そのUSBメモリに自作したプログ

ラムのテキストファイルを保存する。

・そのUSBメモリを学情センターのデスクトップパソコンに接続し,webメールでの添

付ファイルなどを使ってネットワーク経由で各自の環境にファイルを移す。

・USBメモリやファイルそのものが汚染されている場合は,学情センターのデスクトッ

プパソコンに接続したときに感染されている旨のメッセージが出力されるので,速

やかに作業を中断し,担当の教員に相談すること。

(12)

12

動作確認(1)∼プログラムの編集とコンパイル

<Softuneの起動とプログラム編集>

(1) スタートメニュー → プログラム → Softune V3 → FFMC-16 Family Softune Workbench(trial version) 起動

(2) Softuneで ファイル → ワークスペースを開く → 「Start_kit.wsp」を選択

(3) プロジェクトリストのプロジェクト「Sample.abs」にマウスを合わせ,右クリックで「アクティブプロジェクトに設定」を選択。

(4) プロジェクト「Sample.abs」をダブルクリック → フォルダ「Source files」をダブルクリック → 「main.c」をダブルクリッ

ク によりプログラム編集画面を表示。

(5) main.cのプログラムの中身を,テストプログラムに置き換える。

・授業ホームページからテストプログラム「test_prog1.txt」をダウンロードして「メモ帳」等で開き,全てを選択しコピー。

・main.cのプログラムリストを全て選択して,ペースト(貼り付け)する。

(6) プロジェクト → ビルド によりコンパイルする。main.cの中身が保存されていない場合は保存を促すメッセージが

出力されるので,「はい」をクリックする。

プログラム編集画面

メッセージエリア

<Softuneの画面>

<= プログラムの編集は,プログラムリストの中で行う。

(13)

13

動作確認(2)∼プログラムの実行

<Accemic MDEの起動とプログラムの実行>

(1) プログラムにエラーがなければAccemic MDE

が自動的に起動し,「OK」をクリックするとモニタ

画面が表示される。

(2) Accemic MDEで「実行ボタン」をクリックし,プ

ログラムを実行する。

(3) マイコンボード上のLEDが,プログラムに従っ

て明滅することを確認する。

実行ボタン

<Accemic MDEの画面>

(14)

14

プログラムの作成/編集

プログラム編集画面

メッセージエリア

Softuneのプログラム編集画面で,プログラムの作成/編集を行う。

(15)

15

作成したプログラムの保存

Softuneのプログラム編集画面で作成したプログラムを,別の

テキストファイルとして保存する。

(1) Softuneのプログラム編集画面のプログラムを全て選択

し,コピーする。

(2) スタート → プログラム → アクセサリ から,「メモ帳」

を立ち上げ,新規のウィンドウにペースト(貼り付け)する。

(3) 「メモ帳」で,ファイル → 名前をつけて保存 より,ファ

イル名をつけて適切な場所に保存する。

(16)

16

作成したプログラムの読み出し

「メモ帳」によりテキストファイルとして保存されているプログラム

ファイルの中身を,Softuneのプログラム編集画面に貼り付ける

ことで,「ファイルの読み出し」に相当する作業を行う。

(1) テキストファイルとして保存されているプログラムファイル

を「メモ帳」などにより開き,全てを選択してコピーする。

(2) Softuneのプログラム編集画面で,全て選択してdeleteキー

などにより,プログラムを削除した後,ペースト(貼り付け)する。

(17)

17

プログラム実行中における変数のモニタと入力

∼scanf/printfの代用法∼

Accemic MDEでは,プログラム実行中に

グローバル変数の値をモニタ表示す

ると同時に,グローバル変数に値を入力する

ことができる。

前者はprintf文,後者はscanf文に相当する。

<Accemic MDEの画面>

(1)「test_prog2.txt」の内容を,softune 上

のプロジェクト「sample.abs」中のmain.cに

差し替えてプログラムを実行する。

(1)Accemic MDEにおいて,変数タブが

「Globals」となっていることを確認する。

(2)50音順の変数リストから,目的のグ

ローバル変数を見つけ,その数値の内容

を確認する(printfに相当)。

(3)そのグローバル変数の数値をダブル

クリックし,表示される入力欄から所望の

数値を入力する(scanfに相当)

※入力する数値が10進数の場合は

「DEC」,16進数の場合は「HEX」を選択。

変数タブ

(18)

18

test_prog1.txt

/** THIS IS A SAMPLE CODE of “test_prog1” FOR SOFTWARE ENGINEERING A **/

/** ACCEPTS NO RESPONSIBILITY OR LIABILITY FOR ANY ERRORS OR OMMISSIONS **/ /*****************************************************************************

* Date : 2010/01/06 * PROJECT: Sample * Program: Nakamura

* CPU : FMC-16LX(MB90F387)/jouet_bleu: San-Hayato

/*****************************************************************************/ #include "_ffmc16.h" #include "extern.h" #include "monitor.h" void main(void) { __set_il(7); __EI(); IO_PDR1.byte=0xFE; IO_DDR1.byte=0x1F; } /***************************************************************************** interrupt routine ******************************************************************************/ /* reload timer interrupt routine */

__interrupt void reload_int(void) {

}

/* ADC interrupt routine */ __interrupt void ADC_int(void) {

}

/* Ext interrupt routine */ __interrupt void ext_int(void) {

}

/* Vector Table */

#pragma section INTVECT,locate=0xfffc00

#pragma intvect _start 0x8 0x0 /* Reset Vector */

#pragma intvect reload_int 17 /* reload timer interrupt vecter */ #pragma intvect ADC_int 18 /* AD converter Vector */ #pragma intvect ext_int 24 /* Ext Interrupt vecter */

main関数

← 

データレジスタPDR1を0xFEとし,方向レジ

スタDDR1を0x1Fとしたので, PDR1のビッ

ト0∼5の内容を, LEDに対して出力する。

・・・

PDR1のビット0に接続さ

れたLED1だけが光る

この部分のプログラムを編集する。

(19)

19

test_prog2.txt/

グローバル変数

/** THIS IS A SAMPLE CODE of “test_prog1” FOR SOFTWARE ENGINEERING A **/ /** ACCEPTS NO RESPONSIBILITY OR LIABILITY FOR ANY ERRORS OR OMMISSIONS **/ /*****************************************************************************

* Date : 2010/01/06 * PROJECT: Sample * Program: Nakamura

* CPU : FMC-16LX(MB90F387)/jouet_bleu: San-Hayato

/*****************************************************************************/ #include "_ffmc16.h" #include "extern.h" #include "monitor.h" int led=0xFE; void main(void) { __set_il(7); __EI(); IO_PDR1.byte=0xFE; IO_DDR1.byte=0x1F; while(1) { IO_PDR1.byte=led; } } /***************************************************************************** interrupt routine ******************************************************************************/ /* reload timer interrupt routine */

__interrupt void reload_int(void) {

}

/* ADC interrupt routine */ __interrupt void ADC_int(void) {

}

/* Ext interrupt routine */ __interrupt void ext_int(void) {

}

/* Vector Table */

#pragma section INTVECT,locate=0xfffc00

#pragma intvect _start 0x8 0x0 /* Reset Vector */

#pragma intvect reload_int 17 /* reload timer interrupt vecter */ #pragma intvect ADC_int 18 /* AD converter Vector */ #pragma intvect ext_int 24 /* Ext Interrupt vecter */

main関数

while文の無限ループにより,データレジスタPDR1の値が更

新される。

グローバル変数ledをAccemic

MDEの変数リストから入力すると,

入力されたledに応じて,データレ

ジスタPDR1の値が更新され,そ

れに対応したLEDだけが光る

グローバル変数はここに記述

・・・ main関数の外で整数型変数ledが宣言されている

← 

各自でプログラムを組むのは,主にこの部分。

(20)

20

実習(1)

(1)資料18ページのプログラムを用いて、以下のパターンで

LEDを発光させよ。

  (i)LED3のみ発光 (ii)LED1とLED2を同時に発光  

  (iii)LED2とLED4とLED5を同時に発光

(2)資料19ページのプログラムを実行し、以下のパターンで

LEDが発光されるように、グローバル変数ledを入力せよ。

  (i)LED3のみ発光 (ii)LED1とLED2を同時に発光  

  (iii)LED2とLED4とLED5を同時に発光

(21)

21

マ イ コ ン ボ ー ドの

LED制御

∼ 制御編 ∼

・LEDを点滅させるには?

・LEDの明るさを変えるには?

・マイコンのクロックとプログラムの実行ステップ

・for文を用いた点滅時間の制御

(22)

22

LEDを 点滅させ る に は ?

Vcc (=5V

DC

)

LED

R

E

E

0V

5V

LED

発光させるときだけ点Aの電位0Vにする。

発光

発光

発光

点Aの電位の

周期/デューティー比

LEDの発光の

周期/デューティー比

A

(点Aの電位)

(23)

23

LEDを 明る さを 変え る に は ?

Vcc (=5V

DC

)

LED

R

E

明るさは、30Hz以上の周波数で明滅するときのデューティー比に比例

E

0V

5V

LED

発光

発光

E

0V

5V

LED

発光

発光

人が明滅を判断できるのは、明滅の周波数が

30Hz以下

の場合

発光時のデューティー比によって明るさを制御

発光時のデューティ比:100%

発光時のデューティ比:

50%

発光時の強度は左の半分

周期:T >>1/30秒

周期:T<1/30秒

(24)

24

マ イ コ ン の ク ロ ッ ク と

プ ロ グ ラ ム 実行時の 時間ス テ ッ プ

プログラムの1ステップは、マイコン

のクロック1コ∼数コ分に対応。

マイコンは、クロックと呼ばれ

る”時計”を基準に動作する

void main(void){

void main(void){

__set_iI

__set_iI

(7);

(7);

__EI();

__EI();

IO_PDR1.byte=0xFF;

IO_PDR1.byte=0xFF;

IO_DDR1.byte=0x1F;

IO_DDR1.byte=0x1F;

while(1){

while(1){

IO_PDR1.byte=

IO_PDR1.byte=

0xFF

0xFF

;

;

IO_PDR1.byte=

IO_PDR1.byte=

0xEF

0xEF

;

;

}

}

}

}

1

1

・・・

・・・

2

2

・・・

・・・

3

3

・・・

・・・

4

4

・・・・・

・・・・・

5

5

・・・・・

・・・・・

時間

1 2 3

4

5

3

4

5

3

4

5

OFF

OFF

ON

OFF

ON

OFF

ON

2µs程度

数µs程度の時間幅でON/OFFを繰返す ・・点滅の目視不可

    <== もっとゆっくり点滅させたい!

(25)

25

for文を用い た LEDの 点滅時間の 制御

プログラムの1ステップは、マイコンのクロック1コ分に対応。

マイコンは、クロックと呼ばれる”時計”を基準に動作する

for文による時間制御

void main(){

void main(){

int

int

i;

i;

__set_iI

__set_iI

(7)

(7)

__EI();

__EI();

IO_PDR1.byte=0xFF;

IO_PDR1.byte=0xFF;

IO_DDR1.byte=0x1F;

IO_DDR1.byte=0x1F;

while(1){

while(1){

for(i=0;i<

for(i=0;i<

1000

1000

;i++) IO_PDR1.byte=

;i++) IO_PDR1.byte=

0xFF

0xFF

;

;

for(i=0;i<

for(i=0;i<

1000

1000

;i++) IO_PDR1.byte=

;i++) IO_PDR1.byte=

0xEF

0xEF

;

;

}

}

}

}

for文の繰り返し回数が変わり, LEDが発光する時間が変わる

for文の繰り返し回数が変わり,

LEDが発光しない時間が変わる

時間

1

1

・・・

・・・

2

2

・・・

・・・

3

3

・・・

・・・

4

4

・・・・・

・・・・・

5

5

・・・・・

・・・・・

1 2

3

4

4

4

5

5

5

3

4

4

4

5

5

5

OFF

OFF

OFF

OFF

ON

ON

ON

OFF

OFF

OFF

ON

ON

ON

1000

1000

1000

1000

(26)

26

前ページのプログラムのまとめ

ON/OFFの時間を別々に制御

ON/OFFの

明滅が30Hz以上

(for文の繰り返し数

小)

・LEDは連続的に発光して

いるように見え,明滅はわか

らない。

・ON時間とOFF時間の比

(デューティー比)で発光強

度を変化。

ON/OFFの明滅が30Hz以下

(for文の繰り返し数

大)

・LEDの

明滅が目視でわかり,

明滅時間を変えられる。

・発光時の強度は必ず最大。

LED

LED

(27)

27

発展:点滅時の発光強度を制御

目視で確認できる点滅

発光強度

いずれもfor文による繰り返し数で制御

2つのfor文を用いて2つのパラメータを制御

( 1つのfor文では,2つのパラメータを制御不可)

void main(){

void main(){

int

int

i;

i;

__set_iI

__set_iI

(7)

(7)

__EI();

__EI();

IO_PDR1.byte=0xFF;

IO_PDR1.byte=0xFF;

IO_DDR1.byte=0x1F;

IO_DDR1.byte=0x1F;

while(1){

while(1){

for(i=0;i<

for(i=0;i<

1000

1000;i++) IO_PDR1.byte=

;i++) IO_PDR1.byte=

0xFF

0xFF;

;

for(i=0;i<

for(i=0;i<

1000

1000

;i++) IO_PDR1.byte=

;i++) IO_PDR1.byte=

0xEF

0xEF

;

;

}

}

}

}

明滅のみ制御

発光させる部分

void main(){

void main(){

int

int

i;

i;

__set_iI

__set_iI

(7)

(7)

__EI();

__EI();

IO_PDR1.byte=0xFF;

IO_PDR1.byte=0xFF;

IO_DDR1.byte=0x1F;

IO_DDR1.byte=0x1F;

while(1){

while(1){

for(i=0;i<

for(i=0;i<

1000

1000;i++) IO_PDR1.byte=

;i++) IO_PDR1.byte=

0xFF

0xFF;

;

for(i=0;i<

for(i=0;i<

100

100

;i++

;i++

{

{

for(i=0;i<

for(i=0;i<

1

1

;i++) IO_PDR1.byte=

;i++) IO_PDR1.byte=

0xFF

0xFF

;

;

for(i=0;i<

for(i=0;i<

10

10

;i++) IO_PDR1.byte=

;i++) IO_PDR1.byte=

0xEF

0xEF

;

;

}

}

}

}

}

}

明滅と発光強度を制御

発光させる部分で短時間で明滅させる

LED

発光

発光

LED

発光

発光

・・・

for文の二重ループ

for(j=0;j<1;j++) IO_PDR1.byte=0xFF;

for(j=0;j<10;j++) IO_PDR1.byte=0xEF;

int i, j;

(28)

28

実習(2)

<1>LED5を点滅させる本資料25ページのプログラムを以下のように変更せ

よ。1つの整数型グローバル変数aを用いること。

(1−1)プログラム実行中に変数aを1から100まで変化させると、デューティ比

50%のままで点滅周期が0.1秒から0.5秒まで長くなる。

(1−2)プログラム実行中に変数aを1から100まで変化させると、点滅周期が

0.5秒のままでデューティ比が0%から100%まで変化する。

(1−3)プログラム実行中に変数aを1から100まで変化させると、発光強度が

0%から100%まで変化する。

<2>本資料25ページのプログラムを変更して、点滅するたびにLED1とLED2

が交互に発光するようにせよ。

<3>本資料27ページのプログラムを変更して、目視可能な点滅周期をグロー

バル変数aにより,また点灯時の強度をグローバル変数bにより,制御するプロ

グラムを作成せよ。ただし各グローバル変数は0∼100の間の整数とする。

参照

関連したドキュメント

行列の標準形に関する研究は、既に多数発表されているが、行列の標準形と標準形への変 換行列の構成的算法に関しては、 Jordan

 第一の方法は、不安の原因を特定した上で、それを制御しようとするもので

LLVM から Haskell への変換は、各 LLVM 命令をそれと 同等な処理を行う Haskell のプログラムに変換することに より、実現される。

注意事項 ■基板実装されていない状態での挿抜は、 破損、

① 新株予約権行使時にお いて、当社または当社 子会社の取締役または 従業員その他これに準 ずる地位にあることを

・子会社の取締役等の職務の執行が効率的に行われることを確保するための体制を整備する

(自分で感じられ得る[もの])という用例は注目に値する(脚注 24 ).接頭辞の sam は「正しい」と

「養子縁組の実践:子どもの権利と福祉を向上させるために」という