...

ものづくりコンテスト電子回路組立 出力回路練習基板・入力回路練習

by user

on
Category: Documents
14

views

Report

Comments

Transcript

ものづくりコンテスト電子回路組立 出力回路練習基板・入力回路練習
ものづくりコンテスト電子回路組立
出力回路練習基板・
入力回路練習基板
プログラム解説マニュアル
(R8C/38A 版)
本マニュアルで
説明しているセット内容
本基板の
対象マイコンボード゙
本基板の
プログラムについての説明
・ものづくりコンテスト電子回路組立 出力回路練習基板
・ものづくりコンテスト電子回路組立 入力回路練習基板
RY_R8C38 ボード
本マニュアルで説明しています。
第 1.00 版
2016.02.03
株式会社日立ドキュメントソリューションズ
注 意 事 項 (rev.6.0H)
著作権
・本マニュアルに関する著作権は株式会社日立ドキュメントソリューションズに帰属します
・本マニュアルは著作権法および、国際著作権条約により保護されています。
禁止事項
ユーザーは以下の内容を行うことはできません。
・第三者に対して、本マニュアルを販売、販売を目的とした宣伝、使用、営業、複製などを行うこと
・第三者に対して、本マニュアルの使用権を譲渡または再承諾すること
・本マニュアルの一部または全部を改変、除去すること
・本マニュアルを無許可で翻訳すること
・本マニュアルの内容を使用しての、人命や人体に危害を及ぼす恐れのある用途での使用
転載、複製
本マニュアルの転載、複製については、文書による株式会社日立ドキュメントソリューションズの事前の承諾
が必要です。
責任の制限
本マニュアルに記載した情報は、正確を期すため、慎重に制作したものですが万一本マニュアルの記述誤り
に起因する損害が生じた場合でも、株式会社日立ドキュメントソリューションズはその責任を負いません。
その他
・本マニュアルに記載の情報は本マニュアル発行時点のものであり、株式会社日立ドキュメントソリューション
ズは、予告なしに、本マニュアルに記載した情報または仕様を変更することがあります。製作に当たりまして
は、最新の内容を確認いただきますようお願いします。
・すべての商標および登録商標は、それぞれの所有者に帰属します。
連絡先
株式会社 日立ドキュメントソリューションズ
〒135-0016 東京都江東区東陽六丁目 3 番 2 号 イースト 21 タワー
E-mail:[email protected]
ものづくりコンテスト電子回路組立 出力回路練習基板・入力回路練習基板 プログラム解説マニュアル
目次
目 次
1. 概要 ............................................................................................................................................................................... 1
2. 構成 ............................................................................................................................................................................... 2
2.1
2.2
2.3
2.4
2.5
2.6
今回の結線 ............................................................................................................................... 3
作業時間................................................................................................................................... 6
制御用コンピュータ② .................................................................................................................. 6
設計製作回路①......................................................................................................................... 7
制御対象回路③......................................................................................................................... 9
出力信号のポート ..................................................................................................................... 10
3. ワークスペース(プログラム)のダウンロード、インストール ............................................................... 12
3.1 ワークスペース(プログラム)のダウンロード .................................................................................... 12
3.2 プログラムの内容 ...................................................................................................................... 14
4. ファイルの構成 ....................................................................................................................................................... 18
5. 「startup.c」ファイル............................................................................................................................................... 19
6. 「common.c」ファイル ............................................................................................................................................ 20
6.1 init 関数 ................................................................................................................................... 20
6.1.1 CPU の動作クロックの切り替え ........................................................................................... 20
6.1.2 ポートの入出力設定 ........................................................................................................ 21
(1) ポートの接続 ............................................................................................................. 21
(2) プログラム ................................................................................................................. 22
6.1.3 タイマ RB の設定 ............................................................................................................. 22
6.1.4 割り込みの許可............................................................................................................... 22
6.2 intTRB 関数 ............................................................................................................................. 23
6.2.1 概要 .............................................................................................................................. 23
6.2.2 制御手順 ....................................................................................................................... 24
(1) 7 セグメント LED の消灯 .............................................................................................. 24
(2) ステッピングモータの制御 ........................................................................................... 25
(3) 7セグメント LED の制御 .............................................................................................. 25
6.2.3 DC モータの制御 ............................................................................................................. 26
(1) 回転させる方法 ......................................................................................................... 26
(2) 使用する変数 ............................................................................................................ 26
(3) フローチャート ........................................................................................................... 27
(4) プログラム ................................................................................................................. 28
6.2.4 ステッピングモータの制御 ................................................................................................. 29
(1) 励磁する手順 ............................................................................................................ 29
(2) 出力データに配列を使う ............................................................................................. 29
(3) 回転数 ..................................................................................................................... 30
(4) 使用する変数 ............................................................................................................ 30
(5) フローチャート ........................................................................................................... 31
(6) プログラム ................................................................................................................. 32
6.2.5 7 セグメント LED の制御 .................................................................................................... 33
- I -
ものづくりコンテスト電子回路組立 出力回路練習基板・入力回路練習基板 プログラム解説マニュアル
目次
(1) 表示する方法 ............................................................................................................ 33
(2) 表示データに配列を使う ............................................................................................. 34
(3) 使用する変数 ............................................................................................................ 35
(4) フローチャート ........................................................................................................... 36
(5) プログラム ................................................................................................................. 37
6.3 「common.c」ファイル-まとめ ...................................................................................................... 38
7. 課題1 ......................................................................................................................................................................... 42
7.1
7.2
7.3
7.4
課題 ....................................................................................................................................... 42
フローチャート .......................................................................................................................... 42
プログラム例 ............................................................................................................................ 43
プログラムの解説 ...................................................................................................................... 44
8. 課題 2 ......................................................................................................................................................................... 45
8.1
8.2
8.3
8.4
課題 ....................................................................................................................................... 45
状態遷移図 ............................................................................................................................. 45
プログラム例 ............................................................................................................................ 46
プログラムの解説 ...................................................................................................................... 47
9. 課題 3 ......................................................................................................................................................................... 48
9.1 課題 ....................................................................................................................................... 48
9.2 状態遷移図 ............................................................................................................................. 48
9.3 プログラム例 ............................................................................................................................ 48
10. 課題 4....................................................................................................................................................................... 50
10.1
10.2
10.3
10.4
課題...................................................................................................................................... 50
状態遷移図............................................................................................................................ 50
プログラム例 ........................................................................................................................... 50
プログラムの解説 .................................................................................................................... 52
11. 課題 5....................................................................................................................................................................... 53
11.1
11.2
11.3
11.4
課題...................................................................................................................................... 53
状態遷移図............................................................................................................................ 53
プログラム例 ........................................................................................................................... 54
プログラムの解説 .................................................................................................................... 55
12. 課題 6....................................................................................................................................................................... 56
12.1
12.2
12.3
12.4
課題...................................................................................................................................... 56
状態遷移図............................................................................................................................ 56
プログラム例 ........................................................................................................................... 57
プログラムの解説 .................................................................................................................... 58
13. 課題 7....................................................................................................................................................................... 59
13.1
13.2
13.3
13.4
課題...................................................................................................................................... 59
状態遷移図............................................................................................................................ 59
プログラム例 ........................................................................................................................... 60
プログラムの解説 .................................................................................................................... 61
14. 参考文献 ................................................................................................................................................................ 62
- II -
ものづくりコンテスト電子回路組立 出力回路練習基板・入力回路練習基板 プログラム解説マニュアル
1. 概要
1. 概要
本マニュアルは、株式会社日立ドキュメントソリューションズのマイコンカーラリー販売サイトで販売している「も
のづくりコンテスト電子回路組立 出力回路練習基板」と「ものづくりコンテスト電子回路組立 入力回路練習基
板」を使用した、プログラム作成について、説明します。マイコンボードは、RY_R8C38 ボードを使用します。
プログラムは、ものづくりコンテストの電子回路組立部門の課題として使えるような内容にしています。
※本マニュアルの内容は、第 11 回高校生ものづくりコンテスト全国大会・電子回路組立部門の資料、課
題を参考に作成しています。
※高校生ものづくりコンテストについては、全国工業高等学校長協会のホームページ(アドレス:
http://www.zenkoukyo.or.jp/)を参照してください。
※高校生ものづくりコンテスト・電子回路組立部門については、全国情報技術教育研究会のホームページ(アド
レス:http://www.zenjouken.com/?page_id=63)を参照してください。
▲第 11 回高校生ものづくりコンテスト全国大会・電子回路組立部門 競技中の様子
- 1 -
ものづくりコンテスト電子回路組立 出力回路練習基板・入力回路練習基板 プログラム解説マニュアル
2. 構成
2. 構成
全体の接続構成を下図に示します。
・設計製作回路①
(競技者が競技時間内
に製作する)
接続
ケーブル
A
・制御用コンピュータ②
(競技者が持参する)
・制御プログラム④
(競技者が競技時間内に
作成する)
・制御対象回路③
(大会時に配布する)
接続
ケーブル
B
接続ケーブル C
・DC+5V 電源
(競技者が持参する)
設計製作回路①
今回は、「ものづくりコンテスト電子回路組立 入力回路練習基板」が該当します。
制御用コンピュータは競技者が自由に構築することができます。全国大会の事前配
付資料には、下記のように記載されています。
開発環境を含め全て持参する。コンピュータの性能・形状等に制限はない。
制御用コンピュータ②
今回の制御用コンピュータ②の構成を、下記に示します。
・制御用コンピュータ②として、ルネサス エレクトロニクス(株)製の R8C/38A マイコ
ンを搭載した、RY_R8C38 ボードを使用します。
・R8C/38A マイコンのプログラム開発として、ルネサス統合開発環境を使用し、言語
は、C 言語を使用します。
・ルネサス統合開発環境での開発には、Windows Vista、または Windows7 搭載のパ
ソコンを使用します。
大会当日に配布される基板です。全国大会の事前配付資料には、下記のように記
載されています。
制御対象回路③
大会当日に競技実行委員から配布する。制御対象回路には制御対象駆動回路と
制御対象が含まれている。なお、制御対象としては、次のようなものが考えられる。
①LED
②7セグメントLED
③DCモータ
④ステッピングモータ等
今回は、「ものづくりコンテスト電子回路組立 出力回路練習基板」が該当します。
全国大会の事前配付資料には、下記のように記載されています。
制御プログラム④
大会当日に提示する仕様に基づいたプログラムを作成する。使用する言語は
自由である。なお、プログラムの仕様例として、次のようなものがある。
①ストップウォッチのプログラム
②回転制御のプログラム
今回は、ルネサス統合開発環境を使い、C 言語でプログラムを行います。
- 2 -
ものづくりコンテスト電子回路組立 出力回路練習基板・入力回路練習基板 プログラム解説マニュアル
2. 構成
2.1 今回の結線
今回、使用する結線を下記に示します。
パソコンの USB コネクタへ接続
分解
⑧USB ケーブル
(A-ミニ B)
④RY-WRITER
③RY_R8C38
マイコンボード
⑨5V 出力
AC アダプター
⑤RY_R8C38 ボード
コネクター変換基板
⑥DC
モータ
②ものづくりコンテスト電子回路組立
入力回路練習基板
※マイコンボード接続用10ピンコネクタ・ケ
ーブルは、入力回路練習基板のセットの
中に付属しています。
⑩マイコンボード・出力回路練習基板
接続ケーブル(2本)
①ものづくりコンテスト電子回路組立
出力回路練習基板
※DC モータ用の 2 ピンコネクタ・ケーブル・コン
デンサ3個、ステッピングモータ用 6 ピンコネ
クタは、本セットに付属しています。
- 3 -
⑦ステッピング
モータ
ものづくりコンテスト電子回路組立 出力回路練習基板・入力回路練習基板 プログラム解説マニュアル
2. 構成
番号
マイコン
カーラリー
販売 型式
マイコンカーラリー販売
製品名
解説
①
M-S323
ものづくりコンテスト電子回路組立
出力回路練習基板
②
M-S322
ものづくりコンテスト電子回路組立
入力回路練習基板
DC モータ用のコード・積層セラミックコンデンサ 3
個・コネクタ、ステッピングモータ用のコネクタを含
んだセットです。
③
M-S181
RY_R8C38
マイコンボードです。
26 ピンコネクタオスは、「RY_R8C38 ボード コネク
ター変換基板」に付属しているものを使用してい
ます。「RY_R8C38」のセットには含まれません。
④
M-S183
RY-WRITER
RY_R8C38 ボード用のプログラム書き込み基板で
す。
⑤
M-S185
RY_R8C38 ボード
コネクター変換基板セット
RY_R8C38 ボードの 26 ピンコネクタを 10 ピンコネ
クタ 3 個に変換する基板です。
⑥
M-S19
モーター
(RC-260RA 18130(MCR 刻印入り))
定格 5~12V 程度の DC モータを使ってくださ
い。
このモータは、定格 6V です。
⑦
M-S320
ステッピングモータ(ST-42BYG0506H)
定格 5~12V 程度の DC モータを使ってくださ
い。
このステッピングモータは、定格 5V です。
⑧
M-S333
USB ケーブル(A-ミニ B 1.5m)
家電量販店で売られている USB ケーブル(A-ミ
ニ B)で構いません。
⑨
M-S206
アダプターセット
5V を出力する AC アダプタです。出力回路練習
基板の CN1 から 5V を供給する場合は、AC アダ
プタは必要ありません。
M-S43
10P メスコネクタ(PS-10SEN-D4P1-1C)
4 個必要です。
M-S45
10 色フラットケーブル(1.27mm ピッチ)
約 18~30cm 程度のケーブルが 2 本必要です。
⑩
- 4 -
ものづくりコンテスト電子回路組立 出力回路練習基板・入力回路練習基板 プログラム解説マニュアル
2. 構成
今回の結線を、下図に示します。
__
※制御対象回路③の回路図にあるステッピングモータについて、コイルの記載は本マニュアルでは
C を A 、D
__
を B としています。
- 5 -
ものづくりコンテスト電子回路組立 出力回路練習基板・入力回路練習基板 プログラム解説マニュアル
2. 構成
2.2 作業時間
電子回路組立部門は主に、①回路図作成 ②基板製作、 ③課題(プログラム)作成(7 問) を制限時間である
2 時間 30 分(150 分)以内で終わらせなければいけません。そのため、時間配分が重要になってきます。生徒にも
よりますが、時間配分例を下記に示します。
項目
時間 [分]
概要の把握(ざっと読む)
3
回路図作成
7
基板製作
30
共通部分ののプログラム
40
課題 1~7 の main 部分のプログラム
70
プログラム
合計
150
2.3 制御用コンピュータ②
本マニュアルでは、RY_R8C38 ボードを使用します。本ボードは、ルネサス エレクトロニクス製の R8C/38A マイ
コンを搭載したボードです。詳しい仕様やサンプルプログラムは、マイコンカーラリー販売サイトのダウンロードペ
ージ( https://www2.himdx.net/mcr/product/download.html) にある「 マイ コン 実習マニ ュアル(R8C/38A
版)」を参照ください。
▲RY_R8C38 ボード(マイコンはルネサス エレクトロニクス製の R8C/38A)
- 6 -
ものづくりコンテスト電子回路組立 出力回路練習基板・入力回路練習基板 プログラム解説マニュアル
2. 構成
2.4 設計製作回路①
設計製作回路①は部品が支給され、競技時間内に競技者が製作します。
今回は、「ものづくりコンテスト電子回路組立 入力回路練習基板」を使用します。
今回、製作する回路図を、下記に示します。
▲回路図
- 7 -
ものづくりコンテスト電子回路組立 出力回路練習基板・入力回路練習基板 プログラム解説マニュアル
2. 構成
今回、製作する部品実装位置を、下記に示します。
この部分の半田面に
Sanhayato. 293
の文字がくるようにする
180
フォトインタラプタ
5 ピン
XH コネクタ
(ストレートオス)
10k
トグルスイッチ
タクトスイッチ
1 … +5V
2 … タクトスイッチ
3 … トグルスイッチ
4 … フォトインタラプタ
5 … GND
10k
10k
遮断:"1"
透過:"0"
上側:"1"
下側:"0"
ON :"1"
OFF:"0"
▲ものづくりコンテスト電子回路組立 入力回路練習基板 実装位置
■回路図についてポイント
課題に対応するために、回路を組み立てる必要がありますが、まずその回路図を正確に書くことが重要です。
採点基準にも書かれていますが、回路図の配置は適当か?回路記号はあっているか?数値は記入されている
か?配線は正しいか?端子にピン番号やピンの名称が書かれているか?そのまま作れば正しく動作するか?な
どが重要です。
配置は、基本的に信号の流れは左から右に、電圧は高いほうが上、低いほうが下です。入出力一体回路など
は必ずしも左から右に書けないこともありますが、今回は入力回路ですのでスイッチやフォトカプラは左側にあっ
て、入力回路の出力端子が一番右側にあるのがいいと思います。回路記号は新記号(JIS C 0617、IEC 60617)
に準拠しますが、まだ書籍や部品表などに旧記号(JIS C 0301)が使われている場合があるので、当面旧記号も
認められています。抵抗などの数値は必須です。端子はピンの丸とそれらを囲む四角で書かれますが、ピン番
号(1,2,3・・・)とピン名称(5V,GND,TCSW など)も記入しましょう。図面の大きさと紙の大きさのバランスも考慮して
見やすい回路図を書きましょう。そして回路図ができたら、それを見ながら実際の回路を組み立てていきます。
タクトスイッチ
トグルスイッチ
▲旧回路記号の例
- 8 -
ものづくりコンテスト電子回路組立 出力回路練習基板・入力回路練習基板 プログラム解説マニュアル
2. 構成
2.5 制御対象回路③
制御対象回路③は、大会で配布される基板です。今回は、「ものづくりコンテスト電子回路組立 出力回路練
習基板」を使用します。ステッピングモータ、DC モータの使用例を下記に示します。
ものづくりコンテスト電子回路組立
出力回路練習基板
回転が分かるように
してきます
DC
モータ
ステッピングモータ
ステッピングモータに貼る、目盛盤と指示針を下記に示します。そのまま使う場合は、1 倍で印刷して、切り取っ
て使ってください。
0
7
1
くり
抜く
6
2
5
3
4
目盛盤
指示針
- 9 -
ものづくりコンテスト電子回路組立 出力回路練習基板・入力回路練習基板 プログラム解説マニュアル
2. 構成
2.6 出力信号のポート
各出力先と R8C/38A マイコンの接続を、下記に示します。
出力先
マイコンの
ポート
"1"を出力した
ときの状態
"0"を出力した
ときの状態
備考
JP3 をショートさせると圧電サウ
ンダーも同時に接続されます。
同時に接続されるだけで、
LED には影響はありません。
p0_7
点灯
消灯
青
p0_6
点灯
消灯
赤
p0_5
点灯
消灯
LED
緑
圧電サウンダー
左側7セグメントLED
カソード
コモン端子
の選択
各セグメ
ントの
LED
制御
p0_7
"0"と"1"のパルスを送ることにより
音を鳴らします。
p0_1
p2_7~p2_0 の値
に従って点灯
全消灯
p2_7(dp セグメント)
点灯
消灯
p2_6(g セグメント)
点灯
消灯
p2_5(f セグメント)
p2_4(e セグメント)
p2_3(d セグメント)
p2_2(c セグメント)
p2_1(b セグメント)
p2_0(a セグメント)
点灯
点灯
点灯
点灯
点灯
点灯
消灯
消灯
消灯
消灯
消灯
消灯
JP3 をショートさせると、p0_7 と
圧電サウンダーが接続されま
す。使用するときは、JP3 をショ
ートさ せ て くださ い 。 ただし 、
p0_7 は緑色 LED と兼用になっ
ています。圧電サウンダーを制
御するとき、緑色の LED も同
時に点灯します。
7 セグメント LED はカソードコモ
ンで、このコモン端子を ON /
OFF するポートです。
p0_1="0"なら各セグメント LED
は p2_7~p2_0 の値に関係なく
消灯します。
p0_1="1"(点灯)のとき、p2_7~
p2_0 でどの LED を点灯させる
か制御します。
右側 7 セグメント LED と共通な
ので、p0_1="1"のときだけ、左
側 7 セグメント LED に出力した
い値を設定します。
右側7セグメントLED
カソード
コモン端子
の選択
p0_2
p2_7~p2_0 の値
に従って点灯
全消灯
7 セグメント LED はカソードコモ
ンで、このコモン端子を
ON/OFF するポートです。
p0_2="0"なら各セグメント LED
は p2_7~p2_0 の値に関係なく
消灯します。
各セグメ
ントの
LED
制御
p2_7(dp セグメント)
p2_6(g セグメント)
p2_5(f セグメント)
p2_4(e セグメント)
p2_3(d セグメント)
p2_2(c セグメント)
p2_1(b セグメント)
p2_0(a セグメント)
点灯
点灯
点灯
点灯
点灯
点灯
点灯
点灯
消灯
消灯
消灯
消灯
消灯
消灯
消灯
消灯
p0_2="1"(点灯)のとき、p2_7~
p2_0 でどの LED を点灯させる
か制御します。
左側 7 セグメント LED と共通な
ので、p0_2="1"のときだけ、右
側 7 セグメント LED に出力した
い値を設定します。
(次のページへ続く)
- 10 -
ものづくりコンテスト電子回路組立 出力回路練習基板・入力回路練習基板 プログラム解説マニュアル
2. 構成
出力先
74HC574
出力端子
マイコンの
ポート
"1"を出力した
ときの状態
"0"を出力した
ときの状態
備考
変化なし
"1"にした瞬間に 74HC574 の
出力端子から p2_3~p2_0 の値
が出力され、ステッピングモー
タが動作します。"1"にした後
は、74HC574 によって出力値
が保持されるので p2_3~p2_0
の値を変化させてもモータの
動作は変わりません。
"0"→"1"になっ
た瞬間に p2_3~
p2_0 の信号が、ス
テッピングモータ
に出力される
p0_0
ステッピングモータ
__
B コイルを
励磁する
__
p2_3( B )
__
B コイルを
励磁しない
__
__
__
A コイルを
励磁する
A コイルを
励磁しない
p2_1(B)
B コイルを
励磁する
B コイルを
励磁しない
p2_0(A)
A コイルを
励磁する
A コイルを
励磁しない
__
p2_2( A )
A E
E A
A E
E A
A E
E A
励磁コイル
の選択
DC モータの
動作選択
p0_4、p0_3
"00":ストップ
"01":時計回りに回転
"10":反時計回りに回転
"11":ブレーキ
- 11 -
__
A→B→ A → B の順に励磁す
るとステッピングモータは反時
計回りし、その逆の順番に励
磁すると時計回りします。1 回
の励磁で 1.8 度動きます。1 周
は 360 度なので、1 周させるた
めに励磁する回数は、
360÷1.8=400 パルスです。
E
E
A
ストップは DC モータの端子間
を解放、ブレーキは DC モータ
の端子間をショートさせます。
ものづくりコンテスト電子回路組立 出力回路練習基板・入力回路練習基板 プログラム解説マニュアル
3. ワークスペース(プログラム)のダウンロード、インストール
3. ワークスペース(プログラム)のダウンロード、インストール
3.1 ワークスペース(プログラム)のダウンロード
マイコンカーラリー販売
サイト
https://www2.himdx.
net/mcr/
にアクセスします。
「ダウンロード」をクリック
します。
1
「各種基板に関する資
料」をクリックします。
2
「 r8c38a_monodukuri_ren
syu_kadai.zip」をダウンロ
ードして、解凍します。
3
- 12 -
ものづくりコンテスト電子回路組立 出力回路練習基板・入力回路練習基板 プログラム解説マニュアル
3. ワークスペース(プログラム)のダウンロード、インストール
「 r8c38a_monodukuri_rensyu_kadai.
exe」を実行して、圧縮解除をクリッ
クします。
※フォルダは変更できません。変
更した場合は、ルネサス統合開
発環境の設定を変更する場合
がでてきます。
4
解凍が終わったら、自動的に「C ド
ライブ→Workspace」フォルダが開
かれます。今回使用するのは、
「r8c38a_monodukuri_rensyu_kadai」で
す。
5
閉じるをクリックして終了です。
6
「C ドライブ→
Workspace→
r8c38a_monodukuri_rensyu_kadai→
r8c38a_monodukuri_rensyu_kadai.hws
をダブルクリックすると、ルネサス
統合開発環境が立ち上がります。
7
r8c38a_monodukuri_rensyu_kadai.hws
※本マニュアルでは開発環境として、ルネサス統合開発環境(無償評価版)を使用します。ルネサス統合開発環
境やその他ファイルの入手、インストール、操作方法については、マイコンカーラリー販売 ダウンロードペー
ジ(https://www2.himdx.net/mcr/product/download.html)にある「ルネサス統合開発環境 操作マニュア
ル(R8C/38A 版)」を参照してください。
- 13 -
ものづくりコンテスト電子回路組立 出力回路練習基板・入力回路練習基板 プログラム解説マニュアル
3. ワークスペース(プログラム)のダウンロード、インストール
3.2 プログラムの内容
ルネサス統合開発環境でのファイルの開き方、操作方法を説明します。
「C ドライブ→
Workspace→
r8c38a_monodukuri_rensyu_kadai→
r8c38a_monodukuri_rensyu_kadai.hws
をダブルクリックすると、ルネサス
統合開発環境が立ち上がります。
1
r8c38a_monodukuri_rensyu_kadai.hws
左側にあるリストが、プログラ
ムファイルになります。
2
- 14 -
ものづくりコンテスト電子回路組立 出力回路練習基板・入力回路練習基板 プログラム解説マニュアル
3. ワークスペース(プログラム)のダウンロード、インストール
登録されているプログラムの内容を、下記に示します。
ファイル名
※
sfr_r838a.h
○
詳細
R8C/38A マイコンのレジスタを定義しているファイルです。全課題共通で使用します。
ファイルの場所:C:\Workspace\common_r8c38a\sfr_r838a.h
マイコン起動時のプログラム(スタートアップルーチン)が記載されているファイルです。全
課題共通で使用します。
ファイルの場所:C:\Workspace\r8c38a_monodukuri_rensyu_kadai\r8c38a_monodukuri_rensyu_kadai\startup.c
課題プログラムを作成する上で、ポートの入出力設定、入力回路部分のプログラム、出力
common.c
× 回路部分のプログラムなど、全課題共通のプログラムをこのファイル内に入れておきます。
ファイルの場所:C:\Workspace\r8c38a_monodukuri_rensyu_kadai\r8c38a_monodukuri_rensyu_kadai\common.c
課題 1 の回答例が入っているファイルです。
kadai1.c
×
ファイルの場所:C:\Workspace\r8c38a_monodukuri_rensyu_kadai\r8c38a_monodukuri_rensyu_kadai\kadai1.c
課題 2 の回答例が入っているファイルです。
kadai2.c
×
ファイルの場所:C:\Workspace\r8c38a_monodukuri_rensyu_kadai\r8c38a_monodukuri_rensyu_kadai\kadai2.c
課題 3 の回答例が入っているファイルです。
kadai3.c
×
ファイルの場所:C:\Workspace\r8c38a_monodukuri_rensyu_kadai\r8c38a_monodukuri_rensyu_kadai\kadai3.c
課題 4 の回答例が入っているファイルです。
kadai4.c
×
ファイルの場所:C:\Workspace\r8c38a_monodukuri_rensyu_kadai\r8c38a_monodukuri_rensyu_kadai\kadai4.c
課題 5 の回答例が入っているファイルです。
kadai5.c
×
ファイルの場所:C:\Workspace\r8c38a_monodukuri_rensyu_kadai\r8c38a_monodukuri_rensyu_kadai\kadai5.c
課題 6 の回答例が入っているファイルです。
kadai6.c
×
ファイルの場所:C:\Workspace\r8c38a_monodukuri_rensyu_kadai\r8c38a_monodukuri_rensyu_kadai\kadai6.c
課題 7 の回答例が入っているファイルです。
kadai7.c
×
ファイルの場所:C:\Workspace\r8c38a_monodukuri_rensyu_kadai\r8c38a_monodukuri_rensyu_kadai\kadai7.c
※ ○は持ち込み可能 ×はコンテスト時に空から作成するファイルです。
startup.c
○
本プロジェクトには、kadai1.c~kadai7.c の課題ファイルが登録されていますが、この中で有効にできるのは 1
つだけです。例えば、課題 1 のときは、「kadai1.c」のみ有効にして、「kadai2.c~kadai7.c」はビルドから除外(ファ
イル左の赤い×マーク)にしておきます。
各課題のプログラムをビルドするときに、ビルドから除外するファイルを下記に示します(ファイルの詳しい構成
は後述します)。
ファイル名
課題 1
課題 2
課題 3
課題 4
課題 5
課題 6
課題 7
startup.c
○
○
○
○
○
○
○
common.c
○
○
○
○
○
○
○
kadai1.c
○
×
×
×
×
×
×
kadai2.c
×
○
×
×
×
×
×
kadai3.c
×
×
○
×
×
×
×
kadai4.c
×
×
×
○
×
×
×
kadai5.c
×
×
×
×
○
×
×
kadai6.c
×
×
×
×
×
○
×
kadai7.c
×
×
×
×
×
×
○
○:有効 ×:ビルドから除外するファイル
- 15 -
ものづくりコンテスト電子回路組立 出力回路練習基板・入力回路練習基板 プログラム解説マニュアル
3. ワークスペース(プログラム)のダウンロード、インストール
右クリック
例えば、課題 2 のファイル
である、「kadai2.c」をビル
ド(MOT ファイルの作成)
し たい場合、次の操作を
行います。
「kadai1.c」の上で右クリッ
クし、「ビルドから除外」をク
リックします。
3
右クリック
「kadai2.c」の上で右クリッ
クし、「ビルドから除外の
解除」をクリックします。
4
リストが、左画面のように
なれば完了です。
5
- 16 -
ものづくりコンテスト電子回路組立 出力回路練習基板・入力回路練習基板 プログラム解説マニュアル
3. ワークスペース(プログラム)のダウンロード、インストール
「ビルド→ビルド」で、kadai2.c などの登録され
ているファイルがビルド(アセンブル、コンパイ
ル、リンク)され最終ファイル(MOT ファイル)が
できあがります。
6
MOT ファイルは、
「 C:\Workspace\r8c38a_monodukuri_rensy
u_kadai\r8c38a_monodukuri_rensyu_kada
i\Debug」フォルダ内にできます。
7
R8C Writer などの書き込みソフトを使って、
プログラムを書き込んでください。
8
- 17 -
ものづくりコンテスト電子回路組立 出力回路練習基板・入力回路練習基板 プログラム解説マニュアル
4. ファイルの構成
4. ファイルの構成
今回のファイル構成を下図に示します。
startup.c
void start( void )
{
CPU レジスタの設定
RAM の初期化
ヒープ領域変数の設定
main();
while( 1 );
}
start 関数がリセット後、最
初に実行される関数です。
start 関数内から、main 関数
が呼ばれ、main 関数が実行
されます。
kadai1~7.c
#include "common.c"
②
void main( void )
{
init();
// 初期化
while( 1 ); // 無限ループ
}
void interrupt_1ms( void )
{
1ms ごとに実行するプログラム
}
このファイルを、
コンテスト内で作ります。
sfr_r838a.h
common.c
③
#include "sfr_r838a.h"
共通のシンボル定義
グローバル変数の定義
④
R8C/38A マイコンの内蔵周
辺機能を制御するためのレ
ジスタ(Special Function
Registers)を定義したファ
イルです。
void init( void )
{
SFR(内蔵周辺機能)の
初期化
}
#pragma interrupt intTRB( vect = 24 )
void intTRB( void )
{
interrupt_1ms 関数の実行
1msごとに実行するプログラム(共通部分)
}
プログラムの動きを、下記に示します。
※「kadai○.c」の○は、1~7 の数字が入ります。
①
マイコンの電源が入ると、start 関数が実行されます。start 関数では、CPU レジスタの設定など、マイコ
ンを動かすための設定を行います。
②
①が終わると、main 関数を実行します。
③
kadai○.c は、common.c ファイルをインクルードしてファイルを取り込みます。
common.c は、kadai○.c のファイルで共通で使う変数や関数を記載しているファイルです。
④
common.c は、sfr_r838a.h ファイルをインクルードしてファイルを取り込みます。
このファイルは、R8C/38A マイコンの内蔵周辺機能を制御するためのレジスタ(Special Function
Registers)を定義したファイルです。
- 18 -
ものづくりコンテスト電子回路組立 出力回路練習基板・入力回路練習基板 プログラム解説マニュアル
5. 「startup.c」ファイル
5. 「startup.c」ファイル
このファイルは、マイコン固有の設定をまとめたファイルです。このまま使用します。変更する部分はありませ
ん。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
/****************************************************************************/
/* 対象マイコン R8C/38A
*/
/* ファイル内容
スタートアッププログラム(C言語版)
*/
/* バージョン Ver.1.22
*/
/* Date
2012.03.08
*/
/* Copyright ジャパンマイコンカーラリー実行委員会
*/
/*
ルネサスマイコンカーラリー事務局
*/
/*
日立インターメディックス株式会社
*/
/****************************************************************************/
/*======================================*/
/* プロトタイプ宣言(ローカル)
*/
/*======================================*/
void main( void );
/*======================================*/
/* スタックサイズの設定
*/
/*======================================*/
#pragma STACKSIZE
0x200
#pragma ISTACKSIZE
0x100
/*======================================*/
/* CPUレジスタの宣言
*/
/*======================================*/
#pragma CREG _flg_ flg
#pragma CREG _isp_ isp
#pragma CREG _sp_ sp
#pragma CREG _sb_ sb
#pragma CREG _fb_ fb
#pragma CREG _intbh_ intbh
#pragma CREG _intbl_ intbl
unsigned
unsigned
unsigned
unsigned
unsigned
unsigned
unsigned
int
int
int
int
int
int
int
_flg_;
_sb_;
_fb_;
*_sp_;
*_isp_;
*_intbh_;
*_intbl_;
/*======================================*/
/* SBの値をコンパイラに設定
*/
/*======================================*/
_asm("
.glb __SB__\n"
"__SB__ .equ 0400H ");
/*======================================*/
/* オプション機能選択レジスタの設定
*/
/*======================================*/
_asm(" .ofsreg 0BFH ");
/* OFS = 0xbf (パワーオンリセット使用) */
/*======================================*/
/* IDコードの設定
*/
/*======================================*/
_asm(" .id ""\"#FFFFFFFFFFFFFF\" ");
/*======================================*/
/* RAMを初期化する関数の定義
*/
/*======================================*/
#define scopy(X,Y,Z) _asm(" .initsct "X","Y","Z"\n"\
" .initsct "X"I,rom"Y",noalign\n"\
" mov.w #(topof "X"I)&0ffffH,A0\n"\
" mov.b #(topof "X"I)>>16,R1H\n"\
" mov.w #(topof "X")&0ffffH,A1\n"\
" mov.w #sizeof "X",R3\n"\
" smovf.b")
#define sclear(X,Y,Z) _asm(" .initsct "X","Y","Z"\n"\
" mov.b #00H,R0L\n"\
" mov.w #(topof "X") ,A1\n"\
" mov.w #sizeof "X",R3\n"\
" sstr.b")
/*======================================*/
/* セクションの先頭アドレスの型定義
*/
/*======================================*/
extern unsigned int _stack_top;
extern unsigned int _istack_top;
extern unsigned int _vector_top;
80 :
81 :
82 :
83 :
84 :
85 :
86 :
87 :
88 :
89 :
90 :
91 :
92 :
93 :
94 :
95 :
96 :
97 :
98 :
99 :
100 :
101 :
102 :
103 :
104 :
105 :
106 :
107 :
108 :
109 :
110 :
111 :
112 :
113 :
114 :
115 :
116 :
117 :
118 :
119 :
120 :
121 :
122 :
123 :
124 :
125 :
126 :
127 :
128 :
129 :
130 :
131 :
132 :
133 :
134 :
135 :
136 :
137 :
138 :
139 :
140 :
141 :
142 :
143 :
144 :
145 :
146 :
147 :
148 :
149 :
150 :
151 :
152 :
153 :
154 :
155 :
156 :
157 :
158 :
159 :
160 :
161 :
162 :
163 :
164 :
165 :
- 19 -
/*======================================*/
/* ヒープ領域の設定
*/
/*======================================*/
#pragma sectaddress heap_NE,DATA
#define __HEAPSIZE__ 0x100
unsigned char heap_area[ __HEAPSIZE__ ]; /* ヒープ領域確保
*/
extern unsigned char _far *_mnext;
/* 次に使用できるメモリの先頭アドレス */
extern unsigned long
_msize;
/* 残りのバイト数
*/
/*======================================*/
/* 固定割り込みベクタアドレスの設定
*/
/*======================================*/
#pragma sectaddress fvector,ROMDATA 0xffd8
_asm(" .addr 0FFFFFFH");
_asm(" .byte 0FFH");
#pragma interrupt/v _dummy_int
#pragma interrupt/v _dummy_int
#pragma interrupt/v _dummy_int
#pragma interrupt/v _dummy_int
#pragma interrupt/v _dummy_int
#pragma interrupt/v _dummy_int
#pragma interrupt/v _dummy_int
#pragma interrupt/v _dummy_int
#pragma interrupt/v start
/*
/*
/*
/*
/*
/*
/*
/*
/*
/*
/*
予約
*/
OFS2
*/
未定義命令割り込みベクタ
*/
オーバフロー割り込みベクタ */
BRK命令割り込みベクタ
*/
アドレス一致割り込みベクタ */
シングルステップ割り込みベクタ
*/
ウォッチドッグタイマなどの割り込みベクタ*/
アドレスブレイク割り込みベクタ
*/
予約
*/
リセットベクタ
*/
/*======================================*/
/* 固定割り込みプログラム
*/
/*======================================*/
#pragma sectaddress interrupt,CODE
#pragma interrupt _dummy_int()
void _dummy_int(void)
{
/* ダミー関数 */
}
/*======================================*/
/* 可変割り込みベクタの設定
*/
/*======================================*/
#pragma sectaddress vector,ROMDATA
/* ここではセクション名の設定のみ行う */
/*======================================*/
/* RAMの初期化
*/
/*======================================*/
#pragma sectaddress program,CODE
void initsct(void)
{
sclear("bss_SE","data","align");
sclear("bss_SO","data","noalign");
sclear("bss_NE","data","align");
sclear("bss_NO","data","noalign");
scopy("data_SE","data","align");
scopy("data_SO","data","noalign");
scopy("data_NE","data","align");
scopy("data_NO","data","noalign");
}
/*======================================*/
/* スタートアッププログラム
*/
/*======================================*/
#pragma entry start
void start( void )
{
_isp_ = &_istack_top;
/*
_flg_ = 0x0080;
/*
_sp_ = &_stack_top;
/*
_sb_ = 0x0400U;
/*
_intbh_ = (unsigned int*)0x00;
/*
_intbl_ = &_vector_top;
/*
initsct();
/*
_mnext = &heap_area[0];
/*
_msize = (unsigned long)__HEAPSIZE__;
_fb_ = 0U;
/*
main();
ISPに割り込みスタックのアドレス設定
FLGのU="1"
USPにユーザスタックのアドレス設定
SB相対アドレッシングの設定
INTBH = vector(上位)に設定
INTBL = vector(下位)に設定
RAMの初期化
ヒープ領域変数の設定
*/
*/
*/
*/
*/
*/
*/
*/
FB = 0
*/
/* main関数実行
*/
while(1);
}
/************************************************************************/
/* end of file
*/
/************************************************************************/
ものづくりコンテスト電子回路組立 出力回路練習基板・入力回路練習基板 プログラム解説マニュアル
6. 「common.c」ファイル
6. 「common.c」ファイル
このファイルは、課題 1~7 のプログラムを作成するとき、共通で使用する定義、グローバル変数、関数などを記
載します。コンテストでは、このファイルは 0 から作成します。回答例のプログラム内容を説明します。
6.1 init 関数
init 関数は、R8C/38A マイコンの内蔵周辺機能に関わる設定を行います。init は、「initialize(イニシャライズ)」
の略です。
void init( void )
{
// R8C/38A マイコンの内蔵周辺機能の初期化
①CPU の動作クロックの切り替え
②ポートの入出力設定
③タイマ RB の設定
④割り込みの許可
}
6.1.1 CPU の動作クロックの切り替え
R8C/38A マイコンは起動時、内蔵の低速オンチップオシレータというクロックで動作しています。このクロックは
125kHz と遅いので、外付けしている 20MHz のクリスタルに切り替えます。
99
100
101
102
103
104
105
106
107
:
:
:
:
:
:
:
:
:
int i;
// クロックを XIN クロック(20MHz)に変更
prc0 = 1;
//
cm13 = 1;
//
cm05 = 0;
//
for(i=0; i<50; i++ );
//
ocd2 = 0;
//
prc0 = 0;
//
プロテクト解除
P4_6,P4_7 を XIN-XOUT 端子にする
XIN クロック発振
安定するまで少し待つ(約 10ms)
システムクロックを XIN にする
プロテクト ON
レジスタの設定について、詳しくは「マイコン実習マニュアル(R8C/38A 版)」を参照してください。
- 20 -
ものづくりコンテスト電子回路組立 出力回路練習基板・入力回路練習基板 プログラム解説マニュアル
6. 「common.c」ファイル
6.1.2 ポートの入出力設定
R8C/38A マイコンは、ポートが 0~9 まで 10 個あります。ポートの端子を入力端子にするか出力端子にするか
設定します。リセット後は、全端子が入力端子です。
(1) ポートの接続
ポートの接続を下記に示します。記入の無いビットは未接続、斜線の欄は端子が無いビットです。
ポート
bit7
bit6
bit5
bit4
bit3
bit2
bit1
bit0
0
制御対象
回路③
CN3
(出力)
制御対象
回路③
CN3
(出力)
制御対象
回路③
CN3
(出力)
制御対象
回路③
CN3
(出力)
制御対象
回路③
CN3
(出力)
制御対象
回路③
CN3
(出力)
制御対象
回路③
CN3
(出力)
制御対象
回路③
CN3
(出力)
RxD0
入力
TxD0
出力
1
2
RY_R8C38 ボ RY_R8C38 ボ RY_R8C38 ボ RY_R8C38 ボ
ード上の SW3 ード上の SW2 ード上の SW1 ード上の SW0
入力
入力
入力
入力
制御対象
回路③
CN4
(出力)
制御対象
回路③
CN4
(出力)
制御対象
回路③
CN4
(出力)
制御対象
回路③
CN4
(出力)
制御対象
回路③
CN4
(出力)
制御対象
回路③
CN4
(出力)
クリスタル
出力
クリスタル
入力
RY_R8C38 ボ
ード上の LED
出力
時計用
クリスタル
※未接続
出力
時計用
クリスタル
※未接続
出力
Vcc
入力
制御対象
回路③
CN4
(出力)
制御対象
回路③
CN4
(出力)
3
4
5
6
7
8
設計製作
回路①
タクト
スイッチ
(入力)
9
※表の斜線の bit は、端子がない bit です。
※リセット後は、全て入力ポートです。
- 21 -
設計製作 設計製作
回路①
回路①
トグル
フォト
スイッチ インタラプタ
(入力)
(入力)
ものづくりコンテスト電子回路組立 出力回路練習基板・入力回路練習基板 プログラム解説マニュアル
6. 「common.c」ファイル
(2) プログラム
ポートの入出力設定を行う前に、出力にする端子の出力値を設定しておきます。今回ポート 0 は、LED 消灯、
DC モータ停止、7 セグメント LED 消灯にするため、0xe0 を設定していきます(102 行)。
ポートの入出力設定は、pd レジスタで行います。pd0~pd9 まであります。R8C/38A マイコンは「pd0」を設定す
る直前に必ず、「prc2 = 1」を入れなければいけないという決まりがあるので 105 行を入れます(pd0 以外は、決ま
りはありません)。
リセット直後、全端子は入力端子になっています。ポート 0 とポート 2 の端子を出力に設定します。その他は、
今回特に使わないので、リセット直後のまま(入力のまま)にしておきます。
※メーカーは、未接続端子を入力のまま未接続にするとノイズが入り端子が壊れることがあるため、必ず出力端
子に設定してください、と謳っています。今回は時間が限られているので、ポート 0 とポート 2 以外は操作しま
せん。今回の構成では、大きなノイズが入ってきづらい使い方なので大丈夫だと思われますが、本来は、全端
子、入出力設定を行ってください。
101
102
103
104
105
106
107
:
:
:
:
:
:
:
// ポートの初期出力
p0 = 0xe0;
// LED 消灯、DC モータ停止 7 セグ消灯
// ポートの入出力設定
prc2 = 1;
pd0 = 0xff;
pd2 = 0xff;
// PD0 のプロテクト解除
// 出力に設定
// 出力に設定
6.1.3 タイマ RB の設定
タイマ RB を使って、1ms ごとに割り込みが発生するよう設定します。
109
110
111
112
113
114
115
116
117
:
:
:
:
:
:
:
:
:
// タイマ RB の設定
// 割り込み周期 = 1 / 20[MHz]
*
//
= 1 / (20*10^-6) *
//
= 0.001[s] = 1[ms]
trbmr = 0x00;
trbpre = 200-1;
trbpr = 100-1;
trbic = 0x07;
trbcr = 0x01;
(TRBPRE+1) * (TRBPR+1)
200
* 100
//
//
//
//
//
動作モード、分周比設定
プリスケーラレジスタ
プライマリレジスタ
割り込み優先レベル設定
カウント開始
レジスタの設定について、詳しくは「マイコン実習マニュアル(R8C/38A 版)」を参照してください。
6.1.4 割り込みの許可
タイマ RB を使って、1ms ごとに割り込みを発生させるよう設定しました。R8C マイコンは、個別の割り込み設定
の他に、全体の割り込みを許可する設定が必要です。プログラムを下記に示します。
119 :
asm(" fset I ");
// 全体の割り込み許可
- 22 -
ものづくりコンテスト電子回路組立 出力回路練習基板・入力回路練習基板 プログラム解説マニュアル
6. 「common.c」ファイル
6.2 intTRB 関数
6.2.1 概要
init 関数でタイマ RB を 1ms ごとに割り込みが発生するように設定しました。intTRB 関数は、1ms ごとに実行され
る割り込みプログラムになります。
intTRB 関数内では、制御対象回路③基板の左側 7 セグメント LED、右側 7 セグメント LED、ステッピングモー
タ、DC モータの 4 種類を制御します。
LED はポートを"0"にすれば点灯、"1"にすれば消灯するので、intTRB 関数内では、特に制御しません。
今回のプログラムを、下記に示します。
#pragma interrupt intTRB( vect = 24 )
void intTRB( void )
{
①interrupt_1ms 関数の実行
②DC モータ制御プログラム
③ステッピングモータの制御プログラム
④7 セグメント LED 左と右の桁を交互に表示させるプログラム
}
「#pragma interrupt intTRB(vect=24)」は、『ベクタテーブル 24 番の割り込み関数は intTRB 関数です』、という
意味です。24 番は、タイマ RB 割り込みが発生したときに実行される番号です。
タイマ RB は、1ms ごとに割り込みを発生させる設定にしています。また、#pragma interrupt 命令で、intTRB 関
数が、タイマ RB 割り込み発生時に実行される関数に設定しているので、intTRB 関数が 1ms ごとに実行されるこ
とになります。
①interrupt_1ms 関数の実行
kadai1.c~kadai7.c のそれぞれのファイル内にある、interrupt_1ms 関数を実行します。1ms ごとに実行されま
す。
②DC モータ制御プログラム
DC モータを制御します。10ms 周期で、正転、逆転、停止を切り替えます。
例えば、2ms 正転、8ms 停止させると 20%で正転することになります。7ms 逆転、3ms 停止させると 70%で逆転す
ることになります。
モータの制御は、p0_4 端子と p0_3 端子で行います。
③ステッピングモータの制御プログラム
ステッピングモータを 1ms ごとに制御します。今回のステッピングモータ「ST-42BYG0506H」は、ステップ角度
1.8 度で、1 周させるには、「360 度÷1.8=200」回、励磁させれば良いことになります。
例えば、10ms ごとに励磁させると、10ms ごとに励磁×1 周 200 回=2000ms=2 秒で軸が一周します。
ステッピングモータの制御は、p2_3~p2_0 端子で行います。ただし、マイコンとステッピングモータの間には
74HC574 があり、p0_0 端子を"1"にした瞬間に p2_3~p2_0 端子の状態が、ステッピングモータに出力されます。
ただし、p2_3~p2_0 端子は、7 セグメント LED と兼用の端子のため、ステッピングモータを制御するときは、7 セグ
メント LED を OFF にしておきます。
④7 セグメント LED 左と右の桁を交互に表示させるプログラム
7 セグメント LED を 1ms ごとに制御します。7 セグメント LED はダイナミック点灯で 1 桁ずつしか表示することが
できません。左 1ms 表示、右 1ms 表示を交互に繰り返して、人間の目には両方とも点灯しているように表示させ
ます。
7 セグメント LED の制御は、p2_7~p2_0、p0_1、p0_2 端子で行います。ただし、ステッピングモータ制御端子と兼
- 23 -
ものづくりコンテスト電子回路組立 出力回路練習基板・入力回路練習基板 プログラム解説マニュアル
6. 「common.c」ファイル
用の端子があるので、ステッピングモータに情報を出力するときは、7 セグメント LED を左右とも、OFF にします。
①~④の詳しいプログラムについて、これから説明していきます。
6.2.2 制御手順
制御対象回路③は特に難しい回路ではありませんが、p2_7~p2_0 端子が次の回路を兼用しています。
・ステッピングモータの制御
・左側 7 セグメント LED の制御
・右側 7 セグメント LED の制御
よって、これらを混同しないよう制御するのがポイントです。
プログラムでは、1ms ごとの割り込み内でこれらの制御を行います。
回路の簡略図、動作を、下図に示します。
(1) 7 セグメント LED の消灯
まず、p0_2 と p0_1 を"0"にして、7 セグメント LED を消灯させます。
消灯
p0_2
p0_2
p0_1
p0_0
p2_7
p2_6
p2_5
p2_4
p2_3
p2_2
p2_1
p2_0
"0"
"0"
バッファ回路(74HC245)
8
IN
8
OUT
p2_7~p2_0
p0_1
4
p2_3~p2_0 ステッピングモータ
制御回路
4
Q3~Q0
4
8
- 24 -
左側 7 セグメント
LED
消灯
D フリップフロップ回路(74HC574)
CK
D3~D0
右側7 セグメント
LED
M
ものづくりコンテスト電子回路組立 出力回路練習基板・入力回路練習基板 プログラム解説マニュアル
6. 「common.c」ファイル
(2) ステッピングモータの制御
ステッピングモータを制御するために p2_3~p2_0 から、ステッピングモータへデータを出力します。まだ、ステッ
ピングモータは前の動作のまま変化しません。p0_0 が"0"から"1"になった瞬間に 74HC574 の入力端子 D3~D0
の値が Q3~Q0 から出力されます。よって、p0_0 を"0"→"1"にした瞬間にステッピングモータの動作が変化しま
す。次に p0_0 端子を"0"から"1"にするまで変化しません。
p0_2
p0_2
p0_1
p0_0
p2_7
p2_6
p2_5
p2_4
p2_3
p2_2
p2_1
p2_0
バッファ回路(74HC245)
IN
8
8
OUT
p2_7~p2_0
p0_1
右側7 セグメント
LED
左側 7 セグメント
LED
D フリップフロップ回路(74HC574)
CK
D3~D0
4
p2_3~p2_0 ステッピングモータ
制御回路
4
Q3~Q0
M
4
8
p0_0 が"0"から"1"になった
瞬間、D3~D0 に入力されて
いた信号が、Q3~Q0 に出
力される
(3) 7セグメント LED の制御
左側 7 セグメント LED、右側 7 セグメント LED を制御します。p2_7~p2_0 が兼用のため、同時に点灯させること
はできません。そのため、1ms ごとに左側 7 セグメント LED と右側 7 セグメント LED の点灯を交互に繰り返します。
左と右の 7 セグメント LED は同時に点灯しませんが、1ms ごとに点灯しているので、人間の目で見ると同時に点
灯しているように見えます。右側 7 セグメント LED を点灯させるときの信号を、下図に示します。
"1"
p0_2
p0_1
p0_0
p2_7
p2_6
p2_5
p2_4
p2_3
p2_2
p2_1
p2_0
"1"
"0"
p0_2
"0"
バッファ回路(74HC245)
8
IN
8
OUT
D フリップフロップ回路(74HC574)
4
8
CK
D3~D0
p0_1
4
左側 7 セグメント
LED
消灯
p2_3~p2_0 ステッピングモータ
制御回路
4
Q3~Q0
p2_7~p2_0 の値に従っ
て、右側 7 セグメント LED
が点灯する。
p2_7~p2_0
右側7 セグメント
LED
点灯
M
CK 端子(p0_0)は変化しな
いので、Q3~Q0 は変化
しない。
このように、「ステッピングモータ」→「左側 7 セグメント LED 表示」→「右側 7 セグメント LED 表示」の順番に制
御していきます。
- 25 -
ものづくりコンテスト電子回路組立 出力回路練習基板・入力回路練習基板 プログラム解説マニュアル
6. 「common.c」ファイル
6.2.3 DC モータの制御
(1) 回転させる方法
制御対象回路③には、DC モータを制御する専用の IC が取り付けてあり、2bit の信号でモータを制御すること
ができます。今回のスピード制御はマイコンのタイマを使わずに、割り込みプログラムで"1"と"0"にする時間を変
えて行います。
ポートと DC モータの動作の関係を、下表に示します。
p0_4
p0_3
DC モータの動作
"0"
"0"
ストップ
"0"
"1"
時計回りに回転
"1"
"0"
反時計回りに回転
"1"
"1"
ブレーキ
ストップは DC モータの端子間を解放、ブレーキは DC モータの端子間をショートさせます。今回モータを止め
るのはストップを使います。
(2) 使用する変数
DC モータ関連で使用する変数を、下記に示します。
変数
内容
DC モータの回転方向と速度を設定します。
dcm
正の数(1~10)
: 時計回りで回転(1 が 10%、10 が 100%)
負の数(-1~-10) : 反時計回りで回転(-1 が-10%、-10 が-100%)
0 : 停止
例えば、
dcm = 5;
とすると、50%で時計回りに回転します。
dcm_comp
DC モータを回転する間隔を比較する変数です。dcm_comp 変数を 1ms ごとに+1して、
dcm 変数と比較します。一致するとモータを停止させます。10 になると dcm_comp を 0 に
して、モータを回転させます。
※この変数は、main 関数では使用しません。
- 26 -
ものづくりコンテスト電子回路組立 出力回路練習基板・入力回路練習基板 プログラム解説マニュアル
6. 「common.c」ファイル
(3) フローチャート
DC モータの
制御
dcm = 0?
(停止?)
Yes
停止
No
dcm > 0 ?
(時計回り?)
No
時計回り
反時計回り
Yes
dcm_comp++
dcm_comp
10 以上か
dcm_comp++
No
Yes
dcm_comp = 0
dcm_comp < dcm
No
Yes
dcm_comp = 0
No
Yes
ブレーキ
動作
dcm_comp
10 以上か
dcm_comp < -dcm
No
Yes
時計回りに
回す
反時計回りに
回す
ブレーキ
動作
終了
- 27 -
周期 10ms
とする。
dcm_comp が
10 以上なら 0
にする。
ブレーキ
動作
比較値未満な
らモータを回
す、以上なら
モータをブレ
ーキで停止さ
せる。
ものづくりコンテスト電子回路組立 出力回路練習基板・入力回路練習基板 プログラム解説マニュアル
6. 「common.c」ファイル
(4) プログラム
// グローバル変数の宣言
65
66
67
68
:
:
:
:
////////////////////////////////////////////////////////////////
// DC モータ
int dcm;
// -10~10 0:停止 10:100%
int dcm_comp;
// 回転させるか比較用
// プログラム
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
// DC モータ制御
if( dcm == 0 ) {
// ブレーキ
p0_4 = 0;
p0_3 = 0;
} else if( dcm > 0 ) {
// 正転
dcm_comp++;
if( dcm_comp >= 10 ) dcm_comp = 0;
if( dcm_comp < dcm ) {
p0_4 = 0;
p0_3 = 1;
} else {
p0_4 = 0;
p0_3 = 0;
}
} else {
// 逆転
dcm_comp++;
if( dcm_comp >= 10 ) dcm_comp = 0;
if( dcm_comp < (-dcm) ) {
p0_4 = 1;
p0_3 = 0;
} else {
p0_4 = 0;
p0_3 = 0;
}
}
- 28 -
ものづくりコンテスト電子回路組立 出力回路練習基板・入力回路練習基板 プログラム解説マニュアル
6. 「common.c」ファイル
6.2.4 ステッピングモータの制御
(1) 励磁する手順
※励磁(れいじ)とは、ステッピングモータのコイルに電流を流すことです。
__
__
ステッピングモータには、A、 A 、B、 B の 4 つのコイルがあります。1 相励磁で反時計回りに回転させるには「A
__
__
→ B → A → B 」の順番に励磁します。時計回りはその逆です。コイルとポートの関係を、下表に示します。
__
A のコイル
__
p2_0
p2_1
p2_2
p2_3
A のコイル
B のコイル
B のコイル
"1"
"0"
"0"
"0"
ON
OFF
OFF
OFF
"0"
"1"
"0"
"0"
OFF
ON
OFF
OFF
"0"
"0"
"1"
"0"
OFF
OFF
ON
OFF
"0"
"0"
"0"
"1"
OFF
OFF
OFF
ON
よって、ステッピングモータを反時計回りに回転させるには、ポート 2(p2_3~p2_0)を次のように設定します。
0x01→0x02→0x04→0x08→繰り返し
ステッピングモータを時計回りに回転させるには、逆に繰り返します。
(2) 出力データに配列を使う
プログラムでは stm_data という配列を作り、下記のようにプログラムしています。
70
71
72
73
74
75
76
77
78
:
:
:
:
:
:
:
:
:
////////////////////////////////////////////////////////////////
// ステッピングモータの励磁出力信号 1 相励磁
// bit3=D(/B) bit2=C(/A) bit1=B bit0=A
const signed char stm_data[] = {
0b00000001,
// 0 A 励磁
0b00000010,
// 1 B 励磁
0b00000100,
// 2 /A 励磁
0b00001000,
// 3 /B 励磁
};
添字([ ] の中に入れる数字のこと)に 0~3 の値をセットすると、0b00000001、0b00000010 ・・・ の値が返って
きます。例えば、添字に 1 をセットしたところを、下記に示します。
p2 = stm_data[ 1 ];
// ポート 2(p2)には、0b00000010 が設定される
したがって、添字を 0,1,2,3 と増やしていくとステッピングモータが反時計回りに回転して、逆に 3,2,1,0 と減らし
ていくとステッピングモータが時計回りに回転します。
- 29 -
ものづくりコンテスト電子回路組立 出力回路練習基板・入力回路練習基板 プログラム解説マニュアル
6. 「common.c」ファイル
(3) 回転数
ステッピングモータを回転させるスピードを変えるには、励磁コイルを切り替える間隔を変えます。切り替える間
隔が短ければステッピングモータは速く回転し、間隔が長ければステッピングモータはゆっくりと回転します。
※ただし、切り替える時間が短すぎるとステッピングモータの動作が追従できなくなります。脱調(だっちょう)と言
います。
今回のステッピングモータは励磁コイルを 1 つ切り替えるたびに、1.8 度回転します。1 回転(360 度)するために
切り替える回数は次のようになります。
360÷1 回当たりの角度 1.8=200
よって、200 回切り替えると、ステッピングモータは 1 回転します。
今回のプログラムは stm_step_cnt という変数を用意して、時計回りに 1 ステップ進んだならこの変数を+1、反時
計回りに 1 ステップ進んだならこの変数を-1して、ステッピングモータの移動ステップ数を検出します。
例えば、stm_step_cnt 変数が 300 なら、時計回りに 1.5 周したということが分かります。
(4) 使用する変数
ステッピングモータ関連で使用する変数を、下記に示します。
変数
内容
ステッピングモータの回転方向と励磁する間隔を設定します。
正の数 : 時計回りで値[ms]ごとに励磁
負の数 : 反時計回りで値[ms]ごとに励磁
0 : 停止
stm
例えば、
stm = 5;
とすると、5ms ごとに時計回りに励磁します。200 回で 1 周なので、1 周する時間は、
5ms×200 回=1000ms=1 秒
となります。
stm_step_cnt
ステッピングモータの励磁コイルを切り替えた回数(ステップ数)です。
時計回りに励磁コイルを切り替えた場合は+1、反時計回りに励磁コイルを切り替えた
場合は-1します。
1 周 200 回なので、+200 なら正転で 1 周、-200 なら逆転で 1 周したと分かります。
stm_comp
励磁コイルを切り替える間隔を比較する変数です。stm_comp 変数を、1ms ごとに+1し
て、stm 変数と比較します。一致すると励磁します。
※この変数は、main 関数では使用しません。
stm_dim
stm_data 配列の添字です。反時計回りの時は励磁コイルを切り替えるごとに+1、時計
回りの時は励磁コイルを切り替えるごとに-1します。stm_data 配列の添字は、0~3 の
範囲なので、4 以上になったら 0 に、-1 以下になったら 3 にします。
※この変数は、main 関数では使用しません。
- 30 -
ものづくりコンテスト電子回路組立 出力回路練習基板・入力回路練習基板 プログラム解説マニュアル
6. 「common.c」ファイル
(5) フローチャート
ステッピングモータの
制御
stm は 0 か
(停止か)
停止
Yes
stm_comp = 0
No
p2 にステッピングモータを
停止させる励磁データセット
p0_0信号を立ち上げ、立ち下げ
stm > 0
(時計回りか)
時計回り
No
Yes
反時計回り
stm_comp +1 する
No
stm < 0 なら
(反時計回り))
stm_comp +1 する
stm_comp >= stm
励磁コイルを切り替える
タイミングか?
stm_comp >= -stm
励磁コイルを切り替える
タイミングか?
Yes
Yes
stm_comp=0
stm_comp=0
stm_dim++
stm_dim--
stm_dim
> 3?
No
stm が stm_comp 以上
(切
り替えるタイミングにな
ったか)なら、励磁します。
No
stm_dim
< 0?
No
励磁データを次の値にし
ます。
Yes
stm_dim=0
Yes
stm_dim=3
p2 に励磁データセット
p2 に励磁データセット
ポート 2 に更新した励磁
データをセットします。
stm_step_cnt++
stm_step_cnt--
ステッピングモータのス
テップ数を計算します。
p0_0信号を立ち上げ、立ち下げ
p0_0信号を立ち上げ、立ち下げ
終了
- 31 -
ステッピングモータに出
力します。
ものづくりコンテスト電子回路組立 出力回路練習基板・入力回路練習基板 プログラム解説マニュアル
6. 「common.c」ファイル
(6) プログラム
// グローバル変数の宣言
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
////////////////////////////////////////////////////////////////
// ステッピングモータの励磁出力信号 1 相励磁
// bit3=D(/B) bit2=C(/A) bit1=B bit0=A
const signed char stm_data[] = {
0b00000001,
// 0 A 励磁
0b00000010,
// 1 B 励磁
0b00000100,
// 2 /A 励磁
0b00001000,
// 3 /B 励磁
};
int stm;
int stm_step_cnt;
int stm_comp;
int stm_dim;
//
//
//
//
//
0:停止 正:時計回りで値[ms]ごとに励磁
負:反時計回りで値[ms]ごとに励磁 ※1 は脱調する
動作したステップ数 200 で 1 回転
励磁コイル切り替える間隔
励磁出力信号の添字
// プログラム
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
// ステッピングモータの制御
if( stm == 0 ) {
// 停止、何もせず
stm_comp = 0;
p2 = 0x00;
// ステッピングモータへ出力
p0_0 = 1;
p0_0 = 0;
} else if( stm > 0 ) {
// 時計回り
stm_comp++;
if( stm_comp >= stm ) {
stm_comp = 0;
stm_dim++;
if( stm_dim > 3 ) stm_dim =
p2 = stm_data[ stm_dim ];
stm_step_cnt++;
// ステッピングモータへ出力
p0_0 = 1;
p0_0 = 0;
}
} else {
// 反時計回り
stm_comp++;
if( stm_comp >= (-stm) ) {
stm_comp = 0;
stm_dim--;
if( stm_dim < 0 ) stm_dim =
p2 = stm_data[ stm_dim ];
stm_step_cnt--;
// ステッピングモータへ出力
p0_0 = 1;
p0_0 = 0;
}
}
// CK HIGH
// CK LOW
//励磁コイルを替える間隔の確認
// 励磁コイルの切り替え
0;
// 励磁データセット
// ステップ数を増やす
// CK HIGH
// CK LOW
//励磁コイルを替える間隔の確認
// 励磁コイルの切り替え
3;
// 励磁データセット
// ステップ数を減らす
// CK HIGH
// CK LOW
- 32 -
ものづくりコンテスト電子回路組立 出力回路練習基板・入力回路練習基板 プログラム解説マニュアル
6. 「common.c」ファイル
6.2.5 7 セグメント LED の制御
(1) 表示する方法
7 セグメント LED には、名前のとおり 7 個の LED があります。点灯する LED を組み合わせることにより数値や一
部のアルファベットを表示させることができます。各 LED には名前が付いており、いちばん上を"a"、時計回りに
"b"→"c"…"f"、真ん中を"g"とします。小数点を表示する点"dp"もありますが、今回は表示しません(回路的に
繋がっていません)。表示する値と、7 セグメント LED に送るデータを下図に示します。
この表示パターンは課題のプリントで指定されています。指定パターン以外で表示すると、減点の対象となりま
すので気をつけてください(例えば、7 は"f"を付ける場合と付けない場合があります)。
表示
イメージ
dp
g
f
e
d
c
b
a
p2_7
p2_6
p2_5
p2_4
p2_3
p2_2
p2_1
p2_0
0
0
0
1
1
1
1
1
1
1
0
0
0
0
0
1
1
0
2
0
1
0
1
1
0
1
1
3
0
1
0
0
1
1
1
1
4
0
1
1
0
0
1
1
0
5
0
1
1
0
1
1
0
1
6
0
1
1
1
1
1
0
1
7
0
0
1
0
0
1
1
1
8
0
1
1
1
1
1
1
1
9
0
1
1
0
1
1
1
1
A
0
1
1
1
0
1
1
1
B
0
1
1
1
1
1
0
0
C
0
0
1
1
1
0
0
1
D
0
1
0
1
1
1
1
0
E
0
1
1
1
1
0
0
1
a
内容
f
b
g
e
c
d
dp
- 33 -
ものづくりコンテスト電子回路組立 出力回路練習基板・入力回路練習基板 プログラム解説マニュアル
6. 「common.c」ファイル
F
0
1
1
1
0
0
0
1
OFF
0
1
0
1
0
1
0
0
ON
0
0
0
0
1
0
0
0
-
0
1
0
0
0
0
0
0
dp
1
0
0
0
0
0
0
0
上表のデータをポート 2 から出力し、p0_1 を"1"にすると左側 7 セグメント LED が点灯、p0_2 を"1"にすると右側
7 セグメント LED が点灯します。
ポート 2 は、左側 7 セグメント LED、右側 7 セグメント LED を共用しているので、交互に点灯させます。具体的
には 1ms 間は左側 7 セグメント LED を点灯、次の 1ms 間は右側 7 セグメント LED を点灯、これを交互に繰り返
します。1ms ごとなので、人間の目には早すぎて同時に点灯しているように見えます。もし 1 秒ごとに交互に点灯
させたなら、遅すぎて交互に点灯しているのが分かってしまいます。どれくらいのスピードまで同時に点灯して見
えるのか実験するのも良いでしょう。
(2) 表示データに配列を使う
プログラムでは seg_data という配列を作り、下記のようにプログラムしています。
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
const unsigned char seg_data[] = {
0b00111111,
0b00000110,
0b01011011,
0b01001111,
0b01100110,
0b01101101,
0b01111101,
0b00100111,
0b01111111,
0b01101111,
0b01110111,
0b01111100,
0b00111001,
0b01011110,
0b01111001,
0b01110001,
0b00000000,
0b01000000,
0b01010100,
0b00001000,
};
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
7 セグメント LED の表示データ
0 = 0
1 = 1
2 = 2
3 = 3
4 = 4
5 = 5
6 = 6
7 = 7
8 = 8
9 = 9
10 = A
11 = b
12 = C
13 = d
14 = E
15 = F
16 = 消灯
17 = -(マイナス)
18 = OFF(冖)
19 = ON (_)
添字([ ] の中に入れる数字のこと)に 0~19 の値をセットすると、7 セグメント LED に出力する値が返ってきま
す。値は、0~9 が数字、10~15 が"A"~"F"のアルファベット、16 が消灯、17 が"-"、18 が"冖"(OFF)、
19 が"_"(ON)となります。例えば、添字に 10 をセットしたところを、下記に示します。
p2 = seg_data[ 10 ];
// ポート 2(p2)には、0b01110111 が設定されます。
このように、添字にそのまま 0~19 の値をセットすればポート 2 に出力する値が取り出せるので、いちいち 0 だ
から 0b00111111 をセットして・・・ 1 だから 0b00000110 をセットして・・・ というようにプログラムする必要が無くな
ります。
- 34 -
ものづくりコンテスト電子回路組立 出力回路練習基板・入力回路練習基板 プログラム解説マニュアル
6. 「common.c」ファイル
(3) 使用する変数
7 セグメント LED 関連で使用する変数を、下記に示します。
変数
内容
左側 7 セグメント LED に表示する値を設定します。
0~9 が数字、10~15 が"A"~"F"のアルファベット、16 が消灯、17~19 がその他です。
17 以降は、define 文で下記のように定義しています。
seg_left
22
23
24
25
26
27
:
:
:
:
:
:
// seg_left と seg_right 変数に入れる値
#define SEG_NULL
16
#define SEG_MAI
17
#define SEG_OFF
18
#define SEG_ON
19
#define SEG_DP
0x80
//
//
//
//
//
7 セグ
7 セグ
7 セグ
7 セグ
7 セグ
消灯
マイナス表示
OFF 表示
ON 表示
DP 表示
使用例を下記に示します。
seg_left
seg_left
seg_left
seg_left
=
=
=
=
0;
0xb;
SEG_OFF
SEG_NULL;
//
//
//
//
'0'を表示
'b'を表示
OFF を表示
消灯
seg_right
右側 7 セグメント LED に表示する値を設定します。表示方法は、seg_left 変数と同様で
す。
seg_digit
左側、右側のどちらの 7 セグメント LED を表示するか設定します。main 関数内では使い
ません。
0:左表示 1:右表示
- 35 -
ものづくりコンテスト電子回路組立 出力回路練習基板・入力回路練習基板 プログラム解説マニュアル
6. 「common.c」ファイル
(4) フローチャート
1ms ごとの割り込み
7 セグメント LED 消灯
今まで
左表示?
Yes
※161、162 行で 7 セグメント LED を消灯させています。
No
右桁表示
p2_7~p2_0 に右桁の
表示データセット
dp を
表示するか?
Yes
p2_7 = 1 にして、
dp も表示
右の桁表示(p0_2="1")
左桁表示
p2 にデータをセットしま
す。このとき、コモンのカ
ソードは未接続状態なの
で、まだ表示されません。
p2_7~p2_0 に左桁の
表示データセット
No
dp を
表示するか?
Yes
p2_7 = 1 にして、
dp も表示
左の桁表示(p0_1="1")
終了
- 36 -
No
dp(ドットポイント)を表
示するかチェックします。
表示する場合は、p2_7 を
"1"にします。その他のビ
ットは変えません。
コモンのカソードを
GND にして、表示させま
す。
ものづくりコンテスト電子回路組立 出力回路練習基板・入力回路練習基板 プログラム解説マニュアル
6. 「common.c」ファイル
(5) プログラム
// シンボル定義
22 : // seg_left と seg_right 変数に入れる値
23 : #define SEG_NULL
16
24 : #define SEG_MAI
17
25 : #define SEG_OFF
18
26 : #define SEG_ON
19
27 : #define SEG_DP
0x80
//
//
//
//
//
7 セグ
7 セグ
7 セグ
7 セグ
7 セグ
消灯
マイナス表示
OFF 表示
ON 表示
DP 表示
// グローバル変数の宣言
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
////////////////////////////////////////////////////////////////
// 7 セグメント LED
const unsigned char seg_data[] = {
0b00111111,
0b00000110,
0b01011011,
0b01001111,
0b01100110,
0b01101101,
0b01111101,
0b00100111,
0b01111111,
0b01101111,
0b01110111,
0b01111100,
0b00111001,
0b01011110,
0b01111001,
0b01110001,
0b00000000,
0b01000000,
0b01010100,
0b00001000,
};
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
7 セグメント LED の表示データ
0 = 0
1 = 1
2 = 2
3 = 3
4 = 4
5 = 5
6 = 6
7 = 7
8 = 8
9 = 9
10 = A
11 = b
12 = C
13 = d
14 = E
15 = F
16 = 消灯
17 = -(マイナス)
18 = OFF(冖)
19 = ON (_)
int seg_left = SEG_NULL;
int seg_right = SEG_NULL;
int seg_digit;
// 左の桁 表示値
// 右の桁 表示値
// 0:左表示 1:右表示
// プログラム
160 :
161 :
162 :
// ステッピングモータを制御するために、共通線の 7 セグは消灯させる
p0_2 = 0;
// 7 セグ右消灯
p0_1 = 0;
// 7 セグ左消灯
200
201
202
203
204
205
206
207
208
209
210
211
212
213
// 7 セグメント LED の表示 左と右の桁を交互に表示
if( seg_digit == 0 ) {
// 左表示中なら
// 右を表示
seg_digit = 1;
p2 = seg_data[ seg_right & 0x7f ];
// 値のセット
if( seg_right & SEG_DP ) p2 |= SEG_DP;
// DP の表示
p0_2 = 1;
// 右 ON
} else {
// 左を表示
seg_digit = 0;
p2 = seg_data[ seg_left & 0x7f ];
// 値のセット
if( seg_left & SEG_DP ) p2 |= SEG_DP;
// DP の表示
p0_1 = 1;
// 左 ON
}
:
:
:
:
:
:
:
:
:
:
:
:
:
:
- 37 -
ものづくりコンテスト電子回路組立 出力回路練習基板・入力回路練習基板 プログラム解説マニュアル
6. 「common.c」ファイル
6.3 「common.c」ファイル-まとめ
今まで説明した R8C/38A マイコンの内蔵周辺機能の初期化、DC モータ、ステッピングモータ、7 セグメント
LED の制御プログラムなどを「common.c」としてまとめます。「kadai1.c」~「kadai7.c」プログラムの共通ファイルと
しました。下記に、プログラムを示します。
コンテスト時は限られた時間しかありませんが、できるだけコメントをつけてください。見直すときに自分でも見や
すいですし、間違いも少なくなります(審査もしやすくなります)。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
////////////////////////////////////////////////////////////////////////////
// ものづくりコンテスト電子回路組立 入力・出力回路練習基板 共通ファイル
// 座席番号:●
// 氏
名:○○ ○○
//
// Copyright (C) 2016 株式会社日立ドキュメントソリューションズ
////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
// インクルード
////////////////////////////////////////////////////////////////
#include "sfr_r838a.h"
// R8C/38A SFR の定義ファイル
////////////////////////////////////////////////////////////////
// シンボル定義
////////////////////////////////////////////////////////////////
// 入力機器のポート
#define
tcsw
(p9_2)
// タクトスイッチの端子
#define
tgsw
(p9_1)
// トグルスイッチの端子
#define
phin
(p9_0)
// フォトインタラプタの端子
// seg_left と seg_right 変数に入れる値
#define SEG_NULL
16
#define SEG_MAI
17
#define SEG_OFF
18
#define SEG_ON
19
#define SEG_DP
0x80
//
//
//
//
//
7 セグ
7 セグ
7 セグ
7 セグ
7 セグ
消灯
マイナス表示
OFF 表示
ON 表示
DP 表示
////////////////////////////////////////////////////////////////
// プロトタイプ宣言
////////////////////////////////////////////////////////////////
void init( void );
void interrupt_1ms( void );
////////////////////////////////////////////////////////////////
// 7 セグメント LED
const unsigned char seg_data[] = {
0b00111111,
0b00000110,
0b01011011,
0b01001111,
0b01100110,
0b01101101,
0b01111101,
0b00100111,
0b01111111,
0b01101111,
0b01110111,
0b01111100,
0b00111001,
0b01011110,
0b01111001,
0b01110001,
0b00000000,
0b01000000,
0b01010100,
0b00001000,
};
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
7 セグメント LED の表示データ
0 = 0
1 = 1
2 = 2
3 = 3
4 = 4
5 = 5
6 = 6
7 = 7
8 = 8
9 = 9
10 = A
11 = b
12 = C
13 = d
14 = E
15 = F
16 = 消灯
17 = -(マイナス)
18 = OFF(冖)
19 = ON (_)
- 38 -
ものづくりコンテスト電子回路組立 出力回路練習基板・入力回路練習基板 プログラム解説マニュアル
6. 「common.c」ファイル
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
int seg_left = SEG_NULL;
int seg_right = SEG_NULL;
int seg_digit;
// 左の桁 表示値
// 右の桁 表示値
// 0:左表示 1:右表示
////////////////////////////////////////////////////////////////
// DC モータ
int dcm;
// -10~10 0:停止 10:100%
int dcm_comp;
// 回転させるか比較用
////////////////////////////////////////////////////////////////
// ステッピングモータの励磁出力信号 1 相励磁
// bit3=D(/B) bit2=C(/A) bit1=B bit0=A
const signed char stm_data[] = {
0b00000001,
// 0 A 励磁
0b00000010,
// 1 B 励磁
0b00000100,
// 2 /A 励磁
0b00001000,
// 3 /B 励磁
};
int stm;
int stm_step_cnt;
int stm_comp;
int stm_dim;
//
//
//
//
//
0:停止 正:時計回りで値[ms]ごとに励磁
負:反時計回りで値[ms]ごとに励磁 ※1 は脱調する
動作したステップ数 200 で 1 回転
励磁コイル切り替える間隔
励磁出力信号の添字
////////////////////////////////////////////////////////////////////////////
// R8C/38A スペシャルファンクションレジスタ(SFR)の初期化
////////////////////////////////////////////////////////////////////////////
void init( void )
{
int i;
// クロックを XIN クロック(20MHz)に変更
prc0 = 1;
//
cm13 = 1;
//
cm05 = 0;
//
for(i=0; i<50; i++ );
//
ocd2 = 0;
//
prc0 = 0;
//
プロテクト解除
P4_6,P4_7 を XIN-XOUT 端子にする
XIN クロック発振
安定するまで少し待つ(約 10ms)
システムクロックを XIN にする
プロテクト ON
// ポートの初期出力
p0 = 0xe0;
// LED 消灯、DC モータ停止 7 セグ消灯
// ポートの入出力設定
prc2 = 1;
pd0 = 0xff;
pd2 = 0xff;
// PD0 のプロテクト解除
// 出力に設定
// 出力に設定
// タイマ RB の設定
// 割り込み周期 = 1 / 20[MHz]
*
//
= 1 / (20*10^-6) *
//
= 0.001[s] = 1[ms]
trbmr = 0x00;
trbpre = 200-1;
trbpr = 100-1;
trbic = 0x07;
trbcr = 0x01;
asm(" fset I ");
(TRBPRE+1) * (TRBPR+1)
200
* 100
//
//
//
//
//
動作モード、分周比設定
プリスケーラレジスタ
プライマリレジスタ
割り込み優先レベル設定
カウント開始
// 全体の割り込み許可
}
- 39 -
ものづくりコンテスト電子回路組立 出力回路練習基板・入力回路練習基板 プログラム解説マニュアル
6. 「common.c」ファイル
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
//**********************************************************************
// タイマ RB 割り込み処理(1ms ごとに実行)
//**********************************************************************
#pragma interrupt intTRB(vect=24)
void intTRB( void )
{
// 1ms ごとに実行する関数
interrupt_1ms();
// DC モータ制御
if( dcm == 0 ) {
// ブレーキ
p0_4 = 0;
p0_3 = 0;
} else if( dcm > 0 ) {
// 正転
dcm_comp++;
if( dcm_comp >= 10 ) dcm_comp = 0;
if( dcm_comp < dcm ) {
p0_4 = 0;
p0_3 = 1;
} else {
p0_4 = 0;
p0_3 = 0;
}
} else {
// 逆転
dcm_comp++;
if( dcm_comp >= 10 ) dcm_comp = 0;
if( dcm_comp < (-dcm) ) {
p0_4 = 1;
p0_3 = 0;
} else {
p0_4 = 0;
p0_3 = 0;
}
}
// ステッピングモータを制御するために、共通線の 7 セグは消灯させる
p0_2 = 0;
// 7 セグ右消灯
p0_1 = 0;
// 7 セグ左消灯
// ステッピングモータの制御
if( stm == 0 ) {
// 停止、何もせず
stm_comp = 0;
p2 = 0x00;
// ステッピングモータへ出力
p0_0 = 1;
p0_0 = 0;
} else if( stm > 0 ) {
// 時計回り
stm_comp++;
if( stm_comp >= stm ) {
stm_comp = 0;
stm_dim++;
if( stm_dim > 3 ) stm_dim =
p2 = stm_data[ stm_dim ];
stm_step_cnt++;
// ステッピングモータへ出力
p0_0 = 1;
p0_0 = 0;
}
// CK HIGH
// CK LOW
//励磁コイルを替える間隔の確認
// 励磁コイルの切り替え
0;
// 励磁データセット
// ステップ数を増やす
// CK HIGH
// CK LOW
- 40 -
ものづくりコンテスト電子回路組立 出力回路練習基板・入力回路練習基板 プログラム解説マニュアル
6. 「common.c」ファイル
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
} else {
// 反時計回り
stm_comp++;
if( stm_comp >= (-stm) ) {
stm_comp = 0;
stm_dim--;
if( stm_dim < 0 ) stm_dim =
p2 = stm_data[ stm_dim ];
stm_step_cnt--;
// ステッピングモータへ出力
p0_0 = 1;
p0_0 = 0;
}
}
//励磁コイルを替える間隔の確認
// 励磁コイルの切り替え
3;
// 励磁データセット
// ステップ数を減らす
// CK HIGH
// CK LOW
// 7 セグメント LED の表示 左と右の桁を交互に表示
if( seg_digit == 0 ) {
// 左表示中なら
// 右を表示
seg_digit = 1;
p2 = seg_data[ seg_right & 0x7f ];
// 値のセット
if( seg_right & SEG_DP ) p2 |= SEG_DP;
// DP の表示
p0_2 = 1;
// 右 ON
} else {
// 左を表示
seg_digit = 0;
p2 = seg_data[ seg_left & 0x7f ];
// 値のセット
if( seg_left & SEG_DP ) p2 |= SEG_DP;
// DP の表示
p0_1 = 1;
// 左 ON
}
}
////////////////////////////////////////////////////////////////////////////
// End of File
////////////////////////////////////////////////////////////////////////////
- 41 -
ものづくりコンテスト電子回路組立 出力回路練習基板・入力回路練習基板 プログラム解説マニュアル
7. 課題1
7. 課題1
7.1 課題
下記のプログラムを作成してください。
(1) TCSW ON、OFF で、下記のように 7 セグメント LED を表示する。
TCSW OFF の表示
TCSW ON の表示
(2) 表示する 7 セグメント LED の位置は、PHIN の状態で次のように決まる。
(A) PHIN が透過で、右側の 7 セグメント LED に表示する。
(B) PHIN が遮断で、左側の 7 セグメント LED に表示する。
7.2 フローチャート
スタート
内蔵周辺機能の初期化
No
タクトスイッチ
OFF?
タクトスイッチ OFF
なら"OFF"を表示
Yes
フォトインタラプタ
透過?
Yes
No
タクトスイッチ ON
なら"ON"を表示
フォトインタラプタ
透過?
Yes
phin=透過
phin=透過
左側 7 セグ:消灯
右側 7 セグ:OFF 表示
左側 7 セグ:消灯
右側 7 セグ:ON 表示
左側 7 セグ:OFF 表示
右側 7 セグ:消灯
左側 7 セグ:ON 表示
右側 7 セグ:消灯
phin=遮断
No
phsin 遮断
- 42 -
ものづくりコンテスト電子回路組立 出力回路練習基板・入力回路練習基板 プログラム解説マニュアル
7. 課題1
7.3 プログラム例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
////////////////////////////////////////////////////////////////////////////
// ものづくりコンテスト電子回路組立 入力・出力回路練習基板 課題1
// 座席番号:●
// 氏
名:○○ ○○
//
// Copyright (C) 2016 株式会社日立ドキュメントソリューションズ
////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
// インクルード
////////////////////////////////////////////////////////////////////////////
#include "common.c"
// 共通ファイルの取り込み
////////////////////////////////////////////////////////////////////////////
// メイン関数
////////////////////////////////////////////////////////////////////////////
void main( void )
{
init();
// 内蔵周辺機能の初期化
while( 1 );
// メインは無限ループ、これ以降は
// interrupt_1ms 関数で 1ms ごとに実行する
}
////////////////////////////////////////////////////////////////////////////
// 1ms ごとに実行する関数
////////////////////////////////////////////////////////////////////////////
void interrupt_1ms( void )
{
if( tcsw == 0 ) {
// タクトスイッチ OFF なら
if( phin == 0 ) {
// フォトインタラプタが透過なら
seg_left = SEG_NULL;
seg_right = SEG_OFF;
} else {
// フォトインタラプタが遮断なら
seg_left = SEG_OFF;
seg_right = SEG_NULL;
}
} else {
// タクトスイッチ ON なら
if( phin == 0 ) {
// フォトインタラプタが透過なら
seg_left = SEG_NULL;
seg_right = SEG_ON;
} else {
// フォトインタラプタが遮断なら
seg_left = SEG_ON;
seg_right = SEG_NULL;
}
}
}
////////////////////////////////////////////////////////////////////////////
// end of file
////////////////////////////////////////////////////////////////////////////
- 43 -
ものづくりコンテスト電子回路組立 出力回路練習基板・入力回路練習基板 プログラム解説マニュアル
7. 課題1
7.4 プログラムの解説
行
詳細
12
通常は、common.c と kadai1.c をそれぞれルネサス統合開発環境に登録し、kadai1.c からはヘッダフ
ァイル(common.h ファイル)をインクルードします。この場合、common.c と common.h を作りプログラム
する必要がありますが、その分プログラム作成に時間がかかってしまいます。
今回は、kadai1.c ファイルから common.c ファイルをインクルードして(取り込んで)、kadai1.c のプログ
ラムの一部とします。コンテストでは限られた時間しかありませんので、手続きを簡略化して、時間短
縮します。kadai1.c~kadai7.c で、common.c ファイルを取り込みます。
30
タクトスイッチが OFF かどうかチェックします。OFF なら 31~38 行、ON なら 40~47 行を実行します。
31~38
タクトスイッチが OFF のときの処理です。
フォトインタラプタが透過なら、左側 7 セグメント LED を消灯、右側 7 セグメント LED に OFF を表示し
ます。
フォトインタラプタが遮断なら、左側 7 セグメント LED に OFF を表示、右側 7 セグメント LED を消灯し
ます。
40~47
タクトスイッチが ON のときの処理です。
フォトインタラプタが透過なら、左側 7 セグメント LED を消灯、右側 7 セグメント LED に ON を表示し
ます。
フォトインタラプタが遮断なら、左側 7 セグメント LED に ON を表示、右側 7 セグメント LED を消灯し
ます。
■プログラム作成についてポイント
プログラムは課題どおりに正しく動作することが重要ですが、そのほかにも構造はいいか?書式はあっている
か?読みやすいか?ということも評価されます。特に最後の読みやすさについては重要です。作ったばかりの自
分はコメントがなくてもわかりますが、将来の自分のため、プログラムを読む他の人のために読みやすいコメント
を書くことは大切なことです。面倒な気もしますが、少し大きなプログラムになってプロジェクトなど多くの人がか
かわる場合にはわかりやすいコメントは必須です。
- 44 -
ものづくりコンテスト電子回路組立 出力回路練習基板・入力回路練習基板 プログラム解説マニュアル
8. 課題 2
8. 課題 2
8.1 課題
下記のプログラムを作成してください。
(1) プログラムを開始した後、ステッピングモータの指示針を手で動かし、0 の位置に合わせる。
(2) タクトスイッチを ON すると、ステッピングモータが回転し、1回転して停止する。
(3) 回転方向は、タクトスイッチを ON にしたときの、トグルスイッチの状態により決まる。
(A) トグルスイッチが OFF のとき、時計回りに回転する。
(B) トグルスイッチが ON のとき、反時計回りに回転する。
(4) ステッピングモータが1回転し停止した後、(2)以降の動作が再度行えることとする。
8.2 状態遷移図
文章だけでは、なかなか分かりづらいので、複雑な処理の場合は簡単な状態遷移図を書いて、プログラムの構
造を確認しましょう。
0
○
初期状態
tcsw == on
&&
tgsw == off
tcsw == on
&&
tgsw == on
①
②
ステッピングモータ
励磁間隔 5ms で時計回り
ステッピングモータ
励磁間隔 5ms で反時計回り
時計回りで
1 回転したら
③
ステッピングモータ
停止
反時計回りで
1 回転したら
停止したら
プログラムは、□ごと分けます。プログラムは switch-case 文を使い、case の数字と○数字の番号に合わせるこ
とにします。
- 45 -
ものづくりコンテスト電子回路組立 出力回路練習基板・入力回路練習基板 プログラム解説マニュアル
8. 課題 2
8.3 プログラム例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
////////////////////////////////////////////////////////////////////////////
// ものづくりコンテスト電子回路組立 入力・出力回路練習基板 課題2
// 座席番号:●
// 氏
名:○○ ○○
//
// Copyright (C) 2016 株式会社日立ドキュメントソリューションズ
////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
// インクルード
////////////////////////////////////////////////////////////////////////////
#include "common.c"
// 共通ファイルの取り込み
////////////////////////////////////////////////////////////////////////////
// メイン関数
////////////////////////////////////////////////////////////////////////////
void main( void )
{
init();
// 内蔵周辺機能の初期化
while( 1 );
// メインは無限ループ、これ以降は
// interrupt_1ms 関数で 1ms ごとに実行する
}
////////////////////////////////////////////////////////////////////////////
// 1ms ごとに実行する関数
////////////////////////////////////////////////////////////////////////////
void interrupt_1ms( void )
{
static int mode = 0;
// 状態(必ず static にすること!)
switch( mode ) {
case 0:
// タクトスイッチとトグルスイッチの確認
if( tcsw == 1 && tgsw == 0 ) {
mode = 1;
break;
} else if( tcsw == 1 && tgsw == 1 ) {
mode = 2;
break;
}
break;
case 1:
// 時計回りで 1 回転するまで待つ(1 回転 200 ステップ)
stm = 5;
// ステッピングモータ正転で 5ms ごとに励磁
if( stm_step_cnt >= 200 ) { // 1 周したか?
mode = 3;
break;
}
break;
case 2:
// 反時計周りで 1 回転するまで待つ(1 回転 200 ステップ)
stm = -5;
// ステッピングモータ逆転で 5ms ごとに励磁
if( stm_step_cnt <= -200 ) {// 反時計回りで 1 周したか?
mode = 3;
break;
}
break;
case 3:
// ステッピングモータ停止
stm = 0;
stm_step_cnt = 0;
// ステップ数をクリア
mode = 0;
break;
}
- 46 -
ものづくりコンテスト電子回路組立 出力回路練習基板・入力回路練習基板 プログラム解説マニュアル
8. 課題 2
69
70
71
72
73
:
:
:
:
:
}
////////////////////////////////////////////////////////////////////////////
// end of file
////////////////////////////////////////////////////////////////////////////
8.4 プログラムの解説
行
詳細
33~42
0 部分です。
状態遷移図の ○
タクトスイッチ ON でトグルスイッチが OFF の場合は①へ、タクトスイッチ ON でトグルスイッチが ON
の場合は②へ、移動します。
44~51
状態変移図の①部分です。
ステッピングモータを時計回りで回します。1 回転(=200 ステップ)すると、③へ移動します。
53~60
状態変移図の②部分です。
ステッピングモータを反時計回りで回します。1 回転(=200 ステップ)すると、③へ移動します。
ポイントは、反時計回りなので、stm_step_cnt 変数は 0 から減っていくということです。反時計回りでの
1 回転は-200 となります。-200 以下になったら③へ移動します。
62~67
状態変移図の③部分です。
ステッピングモータを時計回りで回します。1 回転(=200 ステップ)すると、③へ移動します。
- 47 -
ものづくりコンテスト電子回路組立 出力回路練習基板・入力回路練習基板 プログラム解説マニュアル
9. 課題 3
9. 課題 3
9.1 課題
下記のプログラムを作成してください。
(1) DC モータは、タクトスイッチが ON で反時計回りに回転し、OFF で停止する。
(2) 回転速度は、フォトインタラプタの状態により決まる。
(A) フォトインタラプタが透過で、低速に回転する。
(B) フォトインタラプタが遮断で、高速に回転する。
(C) 上記(A)と(B)は、回転中にいつでも変更ができる。
9.2 状態遷移図
0
○
初期状態
tcsw == on
&&
phin == 透過
①
DC モータ
反時計回りで低速(50%)
tcsw == off
tcsw == on
&&
phin == 遮断
phin == 遮断
②
phin == 透過
DC モータ
反時計回りで高速(100%)
tcsw == off
③
DC モータ
停止
停止したら
9.3 プログラム例
1
2
3
4
5
6
7
8
9
10
11
12
13
:
:
:
:
:
:
:
:
:
:
:
:
:
////////////////////////////////////////////////////////////////////////////
// ものづくりコンテスト電子回路組立 入力・出力回路練習基板 課題3
// 座席番号:●
// 氏
名:○○ ○○
//
// Copyright (C) 2016 株式会社日立ドキュメントソリューションズ
////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
// インクルード
////////////////////////////////////////////////////////////////////////////
#include "common.c"
// 共通ファイルの取り込み
- 48 -
ものづくりコンテスト電子回路組立 出力回路練習基板・入力回路練習基板 プログラム解説マニュアル
9. 課題 3
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
////////////////////////////////////////////////////////////////////////////
// メイン関数
////////////////////////////////////////////////////////////////////////////
void main( void )
{
init();
// 内蔵周辺機能の初期化
while( 1 );
// メインは無限ループ、これ以降は
// interrupt_1ms 関数で 1ms ごとに実行する
}
////////////////////////////////////////////////////////////////////////////
// 1ms ごとに実行する関数
////////////////////////////////////////////////////////////////////////////
void interrupt_1ms( void )
{
static int mode = 0;
// 状態(必ず static にすること!)
switch( mode ) {
case 0:
// タクトスイッチとフォトインタラプタの状態をチェック
if( tcsw == 1 && phin == 0 ) {
mode = 1;
} else if( tcsw == 1 && phin == 1 ) {
mode = 2;
}
break;
case 1:
// DC モータ 50%で反時計回り
dcm = -5;
// DC モータ 50%で反時計回り
if( phin == 1 ) {
// フォトインタラプタが遮断したら 2 へ
mode = 2;
break;
}
if( tcsw == 0 ) {
// タクトスイッチが離されたら 3 へ
mode = 3;
break;
}
break;
case 2:
// DC モータ 100%で反時計回り
dcm = -10;
// DC モータ 100%で反時計回り
if( phin == 0 ) {
// フォトインタラプタが透過したら 1 へ
mode = 1;
break;
}
if( tcsw == 0 ) {
// タクトスイッチが離されたら 3 へ
mode = 3;
break;
}
break;
case 3:
// DC モータ 停止
dcm = 0;
mode = 0;
break;
// DC モータ 停止
}
}
////////////////////////////////////////////////////////////////////////////
// end of file
////////////////////////////////////////////////////////////////////////////
- 49 -
ものづくりコンテスト電子回路組立 出力回路練習基板・入力回路練習基板 プログラム解説マニュアル
10. 課題 4
10. 課題 4
10.1 課題
下記のプログラムを作成してください。
(1) プログラム開始直後、左右の 7 セグメント LED に"--"を表示する。
(2) トグルスイッチが ON になると、"10"を表示し、約 1 秒ごとにカウントダウンし、"00"で停止する。表示中は 2
桁表示すること。
(3) カウントダウン中にトグルスイッチが OFF になると、カウントダウンを停止する。再び ON にするとカウントダウ
ンを再開する。停止中の 7 セグメント LED の表示は、停止したときの表示を維持すること。
10.2 状態遷移図
※7 セグメント LED を「7 セグ」と略します。
0
○
初期状態
7 セグに'--'を表示
tgsw == on
①
'10'~'00'まで 1 秒ごとに
カウントダウン表示
cnt=0 になったら
tgsw == off
③
②
'00'を表示
(終了)
カウント停止
(7 セグ表示を保持)
10.3 プログラム例
1
2
3
4
5
6
7
8
9
10
11
12
13
:
:
:
:
:
:
:
:
:
:
:
:
:
////////////////////////////////////////////////////////////////////////////
// ものづくりコンテスト電子回路組立 入力・出力回路練習基板 課題4
// 座席番号:●
// 氏
名:○○ ○○
//
// Copyright (C) 2016 株式会社日立ドキュメントソリューションズ
////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
// インクルード
////////////////////////////////////////////////////////////////////////////
#include "common.c"
// 共通ファイルの取り込み
- 50 -
tgsw == on
ものづくりコンテスト電子回路組立 出力回路練習基板・入力回路練習基板 プログラム解説マニュアル
10. 課題 4
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
////////////////////////////////////////////////////////////////////////////
// メイン関数
////////////////////////////////////////////////////////////////////////////
void main( void )
{
init();
// 内蔵周辺機能の初期化
while( 1 );
// メインは無限ループ、これ以降は
// interrupt_1ms 関数で 1ms ごとに実行する
}
////////////////////////////////////////////////////////////////////////////
// 1ms ごとに実行する関数
////////////////////////////////////////////////////////////////////////////
void interrupt_1ms( void )
{
static int cnt = 0;
// 時間カウント(1ms ごとに+1)用(必ず static にすること!)
static int mode = 0;
// 状態(必ず static にすること!)
switch( mode ) {
case 0:
// プログラム開始直後
seg_left = SEG_MAI;
seg_right = SEG_MAI;
cnt = 10000;
if( tgsw == 1 ) {
mode = 1;
}
break;
// 開始直後の7セグ表示
// トグルスイッチ ON なら
case 1:
// カウントダウン
cnt--;
// 1ms ごとに-1 する
seg_left = (cnt / 1000 + 1) / 10; // 10 の桁
seg_right = (cnt / 1000 + 1) % 10; // 1 の桁
if( tgsw == 0 ) {
// トグルスイッチ OFF なら
mode = 2;
}
if( cnt == 0 ) {
// 0 秒になったなら
mode = 3;
}
break;
case 2:
// トグルスイッチ ON になるまで待機
if( tgsw == 1 ) {
// トグルスイッチが ON なら
mode = 1;
}
break;
case 3:
// 0 秒になったなら"00"表示で終了
seg_left = 0;
seg_right = 0;
break;
}
}
////////////////////////////////////////////////////////////////////////////
// end of file
////////////////////////////////////////////////////////////////////////////
- 51 -
ものづくりコンテスト電子回路組立 出力回路練習基板・入力回路練習基板 プログラム解説マニュアル
10. 課題 4
10.4 プログラムの解説
行
詳細
47 行、48 行は、カウントダウン中の cnt の値を 7 セグメント LED へ表示している部分です。
※「%」は、余りを求める式です。例えば「 3 % 2 」は、1 が求まります。
47 :
48 :
seg_left = (cnt / 1000 + 1) / 10; // 10 の桁
seg_right = (cnt / 1000 + 1) % 10; // 1 の桁
cnt 変数は 1ms ごとに-1 するので、1000 で割って、1 秒単位にします。このとき、下記のように「+1」部
分が無いとどうなるでしょう。
47 :
48 :
seg_left = (cnt / 1000 + 1) / 10; // 10 の桁
seg_right = (cnt / 1000 + 1) % 10; // 1 の桁
cnt は最初 10000 ですが、1ms 後に 9999 になります。計算結果は整数になるので、
47、48
seg_left = (9999/1000) / 10 = 9 / 10 = 0
seg_rigth = (9999/1000) % 10 = 9 % 10 = 9
となります。課題は「'10'→'09'→・・・・→'01'→'00'」を各 1 秒ごとに表示するよう指示されています
が、'10'は表示されません。よって、+1して、'10'を 1 秒表示するようにしています。
このとき、気をつけなければいけないのは、終わり(cnt=0)の時です。次のようになります。
seg_left = (
seg_rigth = (
0/1000 + 1) / 10 = (0 + 1) / 10 = 0
0/1000 + 1) % 10 = (0 + 1) % 10 = 1
cnt=0 のとき'01'表示になりますが、cnt=0 になった瞬間に③に移り、③で'00'表示をするので、今
回のプログラムでは課題通りになります。
必ず初期値(cnt=10000 のとき)と終了値(cnt=0 のとき)に、どのような表示になるか想定しながらプロ
グラムを作っていきましょう。また、できれば、cnt=9999、cnt=1 のときも、想定しておきましょう。
- 52 -
ものづくりコンテスト電子回路組立 出力回路練習基板・入力回路練習基板 プログラム解説マニュアル
11. 課題 5
11. 課題 5
11.1 課題
下記のプログラムを作成してください。
(1) プログラム開始直後、右側の 7 セグメント LED に"0"を表示する。その後、ステッピングモータの指示針を手
で動かし、0 の位置に合わせる。
(2) タクトスイッチの「ON→OFF」を 12 回行う。
(A) 1 回のタクトスイッチの「ON→OFF」で、ステッピングモータは時計回りに 90 度回転する。
(B) 右側の 7 セグメント LED に、タクトスイッチの操作回数を 16 進数で表示する。
(C) 上記(A)と(B)は、タクトスイッチの「ON→OFF」の、「OFF」になった瞬間に動作する。
11.2 状態遷移図
0
○
初期状態
7 セグにスイッチの ON 回数を表示
ステッピングモータ停止
①
tcsw == on
何もしない
②
tcsw == off
ON 回数+1
ステッピングモータを時計回りに回す
③
すぐに移動
何もしない
ステッピングモータが 90 度回転したら
- 53 -
ものづくりコンテスト電子回路組立 出力回路練習基板・入力回路練習基板 プログラム解説マニュアル
11. 課題 5
11.3 プログラム例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
////////////////////////////////////////////////////////////////////////////
// ものづくりコンテスト電子回路組立 入力・出力回路練習基板 課題5
// 座席番号:●
// 氏
名:○○ ○○
//
// Copyright (C) 2016 株式会社日立ドキュメントソリューションズ
////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
// インクルード
////////////////////////////////////////////////////////////////////////////
#include "common.c"
// 共通ファイルの取り込み
////////////////////////////////////////////////////////////////////////////
// メイン関数
////////////////////////////////////////////////////////////////////////////
void main( void )
{
init();
// 内蔵周辺機能の初期化
while( 1 );
// メインは無限ループ、これ以降は
// interrupt_1ms 関数で 1ms ごとに実行する
}
////////////////////////////////////////////////////////////////////////////
// 1ms ごとに実行する関数
////////////////////////////////////////////////////////////////////////////
void interrupt_1ms( void )
{
static int mode = 0;
// 状態(必ず static にすること!)
static int on_cnt = 0;
// ON の回数(実際は ON→OFF にした瞬間に+1)
switch( mode ) {
case 0:
// タクトスイッチ ON になったかチェック
stm = 0;
// ステッピングモータ停止
seg_right = on_cnt;
// 右側 7 セグに ON→OFF した回数を表示
if( tcsw == 1 ) {
mode = 1;
}
break;
case 1:
// タクトスイッチ OFF になったかチェック
if( tcsw == 0 ) {
mode = 2;
}
break;
case 2:
// カウントを+1して、ステッピングモータを回す
on_cnt++;
// ON 回数を+1 する
seg_right = on_cnt;
// 右側 7 セグに ON→OFF した回数を表示
stm = 5;
// ステッピングモータ正転で 5ms ごとに励磁
mode = 3;
break;
case 3:
// ステッピングモータが 90 度進んだら停止(90 度/1.8=50 パルス)
if( stm_step_cnt >= on_cnt * 50 ) {
mode = 0;
}
break;
}
}
- 54 -
ものづくりコンテスト電子回路組立 出力回路練習基板・入力回路練習基板 プログラム解説マニュアル
11. 課題 5
67 :
68 :
69 :
////////////////////////////////////////////////////////////////////////////
// end of file
////////////////////////////////////////////////////////////////////////////
11.4 プログラムの解説
行
詳細
31
on_cnt という変数を作り、タクトスイッチが OFF になった瞬間、+1 するようにします。
50~56
②のプログラム部分です。スイッチを離した瞬間、この部分を実行します。
on_cnt 変数を+1して、seg_right に代入し、7 セグの右に押した回数を表示します。
stm 変数に 5 をセットして、時計回りで回るようにします。
58~63
③のプログラム部分です。
90 度はステップ数で、90÷1 ステップ 1.8 度=50 です。
0 へ移動するようにします。
よって、stm_step_cnt 変数が ON 回数×50 以上になったら、○
0 部分のプログラムでステッピングモータは停止します。
- 55 -
ものづくりコンテスト電子回路組立 出力回路練習基板・入力回路練習基板 プログラム解説マニュアル
12. 課題 6
12. 課題 6
12.1 課題
下記のプログラムを作成してください。
(1) タクトスイッチが ON になった瞬間、回転しているモータがあれば停止させ、ON にしてから OFF になるまで
の時間により、次の動作をする。
(A) ON にしてから OFF にするまでの時間が約 1 秒未満なら、ステッピングモータ、DC モータ、どちらも回転
しない。
(B) ON にしてから OFF にするまでの時間が約 1 秒以上、約 3 秒未満なら、ステッピングモータのみ反時計
回りに回転する。ステッピングモータは、OFF になった瞬間から動作する。
(C) ON にしてから OFF にするまでの時間が約 3 秒以上なら、DC モータのみ時計回りに回転する。DC モ
ータは OFF になった瞬間から動作する。
12.2 状態遷移図
0
○
初期状態
cnt変数をクリア(スイッチON時間計測用)
tcsw==off
①
&&
tcsw ON 時間 1 秒未満
tcsw == on
cnt 変数+1
ステッピングモータ停止
DC モータ停止
tcsw==off
&&
tcsw ON 時間1 秒以上2 秒未満
tcsw==off
&&
tcsw ON 時間3 秒以上
②
③
DC モータ
時計回りで回転
ステッピングモータ
反時計回りで回転
- 56 -
ものづくりコンテスト電子回路組立 出力回路練習基板・入力回路練習基板 プログラム解説マニュアル
12. 課題 6
12.3 プログラム例
1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
// ものづくりコンテスト電子回路組立 入力・出力回路練習基板 課題6
// 座席番号:●
// 氏
名:○○ ○○
//
// Copyright (C) 2016 株式会社日立ドキュメントソリューションズ
////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
// インクルード
////////////////////////////////////////////////////////////////////////////
#include "common.c"
// 共通ファイルの取り込み
////////////////////////////////////////////////////////////////////////////
// メイン関数
////////////////////////////////////////////////////////////////////////////
void main( void )
{
init();
// 内蔵周辺機能の初期化
while( 1 );
// メインは無限ループ、これ以降は
// interrupt_1ms 関数で 1ms ごとに実行する
}
////////////////////////////////////////////////////////////////////////////
// 1ms ごとに実行する関数
////////////////////////////////////////////////////////////////////////////
void interrupt_1ms( void )
{
static int mode = 0;
// 状態(必ず static にすること!)
static int cnt = 0;
// 時間カウント(1ms ごとに+1)用(必ず static にすること!)
switch( mode ) {
case 0:
// タクトスイッチ ON を検出
cnt = 0;
if( tcsw == 1 ) {
mode = 1;
}
break;
// タクトスイッチ ON 時間計測変数クリア
case 1:
// タクトスイッチ OFF を検出
stm = 0;
// ステッピングモータ:停止
dcm = 0;
// DC モータ:停止
cnt++;
// タクトスイッチが ON の間、カウンタを 1ms ごとに+1
if( tcsw == 0 && cnt < 1000 ) {
// タクトスイッチ OFF で、1 秒未満なら
mode = 0;
break;
} else if( tcsw == 0 && cnt < 3000 ) {
// タクトスイッチ OFF で、3 秒未満なら
mode = 2;
break;
} else if( tcsw == 0 ) {
// タクトスイッチ OFF で 3 秒以上なら
mode = 3;
break;
}
break;
- 57 -
ものづくりコンテスト電子回路組立 出力回路練習基板・入力回路練習基板 プログラム解説マニュアル
12. 課題 6
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
case 2:
// ステッピングモータ
stm = -5;
mode = 0;
break;
case 3:
// DC モータ
dcm = 5;
mode = 0;
break;
反時計回り
// ステッピングモータ:反時計回り
時計回り
// DC モータ:反時計回り
}
}
////////////////////////////////////////////////////////////////////////////
// end of file
////////////////////////////////////////////////////////////////////////////
12.4 プログラムの解説
行
31
42~60
詳細
cnt 変数を用意します。スイッチが ON の間、+1するようにします。
これで ON している時間を計ることができます。
①部分です。
cnt 変数の値をチェックすることにより、スイッチを ON していた時間を計ることができます。
47 行で、スイッチ OFF かつ、cnt 変数が 1000 未満なら、何もしません(ステッピングモータ、DC モー
タ、ともに停止)。
51 行で、スイッチ OFF かつ、cnt 変数が 3000 未満なら、ステッピングモータを反時計回りに回します。
47 行で cnt 変数が 1000 未満の場合をチェックしているので、51 行は必ず cnt 変数が 1000 以上のと
きになります。
55 行で、スイッチ OFF なら、DC モータを時計回りに回します。47 行と 51 行で cnt 変数が 3000 未満
の場合をチェックしているので、55 行は必ず cnt 変数が 3000 以上のときになります。
- 58 -
ものづくりコンテスト電子回路組立 出力回路練習基板・入力回路練習基板 プログラム解説マニュアル
13. 課題 7
13. 課題 7
13.1 課題
下記のプログラムを作成してください。
(1) プログラム開始直後、右側の 7 セグメント LED に"0"を表示する。その後、ステッピングモータの指示針を手
で動かし、0 の位置に合わせる。
(2) ステッピングモータは、タクトスイッチが ON で時計回りに回転し、OFF で停止する。
(3) 右側の 7 セグメント LED にステッピングモータの周回数を次のように表示する。
(A) ステッピングモータの回転開始と同時に、周回数を加算する。
(B) ステッピングモータが目盛盤の 0 を通過するたびに周回数を加算する。
(C) 右側の 7 セグメント LED の表示は、"5"の次は"1"に戻り繰り返す。
(4) ステッピングモータが停止しているとき、フォトインタラプタの光を「遮断→透過」にすると、遮断した瞬間にス
テッピングモータが次の条件で回転し、指示針が目盛盤の 0 の位置で停止する。
(A) ステッピングモータの指示針が目盛盤の 0 以上 4 未満の場合、反時計回りに回転する。
(B) ステッピングモータの指示針が目盛盤の 4 以上 8 未満(0 の位置)の場合、時計回りに回転する。
(5) 上記(4)の動作後、ステッピングモータの指示針が目盛盤の 0 の位置に戻ると、右側の 7 セグメント LED の
表示は"0"になり、(2)以降の動作が行える。
13.2 状態遷移図
0
○
初期状態
7セグ右にステッピングモータの回転数を表示
ステッピングモータの動作は停止
tcsw == on
ステッピングモータの回転数が0なら
stm_step_cnt を200 にする
①
ステッピングモータを時計回りで回転
7セグ右にステッピングモータの回転数を表示
tcsw==off
回転数=6?
stm_step_cnt を200 にする
(回転数を1 にする)
phin==遮断
&&
ステッピングモータの指示針は
0以上4未満を挿している
②
ステッピングモータ
反時計回りで回転
ステッピングモータの
指示針は0 を指した?
stm_step_cnt を0 にする
- 59 -
phin==遮断
&&
ステッピングモータの指示針は
4以上8未満を挿している
③
ステッピングモータ
時計回りで回転
ステッピングモータの
指示針は0 を指した?
stm_step_cnt を0 にする
ものづくりコンテスト電子回路組立 出力回路練習基板・入力回路練習基板 プログラム解説マニュアル
13. 課題 7
13.3 プログラム例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
////////////////////////////////////////////////////////////////////////////
// ものづくりコンテスト電子回路組立 入力・出力回路練習基板 課題7
// 座席番号:●
// 氏
名:○○ ○○
//
// Copyright (C) 2016 株式会社日立ドキュメントソリューションズ
////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
// インクルード
////////////////////////////////////////////////////////////////////////////
#include "common.c"
// 共通ファイルの取り込み
////////////////////////////////////////////////////////////////////////////
// メイン関数
////////////////////////////////////////////////////////////////////////////
void main( void )
{
init();
// 内蔵周辺機能の初期化
while( 1 );
// メインは無限ループ、これ以降は
// interrupt_1ms 関数で 1ms ごとに実行する
}
////////////////////////////////////////////////////////////////////////////
// 1ms ごとに実行する関数
////////////////////////////////////////////////////////////////////////////
void interrupt_1ms( void )
{
static int mode = 0;
// 状態(必ず static にすること!)
switch( mode ) {
case 0:
// タクトスイッチ、フォトインタラプタ反応待ち
seg_right = stm_step_cnt / 200;
stm = 0;
if( tcsw == 1 ) {
// ステッピングモータは回転開始と同時に周回数を加算するので
// 0 の場合は 1 回転したことにする
if( stm_step_cnt == 0 ) stm_step_cnt = 200;
mode = 1;
break;
}
if( (phin == 1) && (stm_step_cnt % 200 < 100) ) {
// フォトインタラプタ遮断かつ、指示針が 4 未満
mode = 2;
break;
} else if( phin == 1 ) {
// フォトインタラプタ遮断かつ、指示針が 4 以上
mode = 3;
break;
}
break;
case 1:
// タクトスイッチを押している間は、ステッピングモータは時計回りに回転
stm = 5;
// ステッピングモータ:時計回り
seg_right = stm_step_cnt / 200;
// 右側 7 セグに回転数を表示
if( stm_step_cnt / 200 >= 6 ) {
stm_step_cnt = 200;
}
if( tcsw == 0 ) {
// タクトスイッチ OFF なら戻る
mode = 0;
break;
}
break;
- 60 -
// 1 回転分とする
ものづくりコンテスト電子回路組立 出力回路練習基板・入力回路練習基板 プログラム解説マニュアル
13. 課題 7
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
case 2:
// 指示針が 0~4 未満なら、ステッピングモータは反時計回りで 0 に戻る
stm = -5;
if( stm_step_cnt % 200 == 0 ) {
stm_step_cnt = 0;
// 回転数を 0 にする
mode = 0;
break;
}
break;
case 3:
// 指示針が 5~8 未満なら、ステッピングモータは時計回りで 0 に戻る
stm = 5;
if( stm_step_cnt % 200 == 0 ) {
stm_step_cnt = 0;
// 回転数を 0 にする
mode = 0;
break;
}
break;
}
}
////////////////////////////////////////////////////////////////////////////
// end of file
////////////////////////////////////////////////////////////////////////////
13.4 プログラムの解説
行
詳細
35
stm_step_cnt 変数は、ステッピングモータ 1 回転 200 パルスの変数です。
よって、200 で割ることによって回転数になります。
40
課題は、「(3)(A) ステッピングモータの回転開始と同時に、周回数を加算する。」とあるので、0 の場
合のみ、1 周からスタートさせます。1 周=200 パルスなので、stm_step_cnt 変数に 200 を代入します。
44
stm_step_cnt 変数は 1 回転 200 パルスです。「stm_step_cnt % 200」を計算する事によって 200 で割っ
た余りを求めることができます。よって、何周しても 0~199 の値が求められ、0 が 0 度、199 が 360 度
の1つ手前の角度となります。
今回、指示針が 4 未満か、という課題です。指示針 4 は 180 度(0.5 周)なので、
1 周のステップ数 200×0.5=100 未満なら、4 未満ということになります。
48
44 行で指示針が 4 未満か確認していますので、48 行は「フォトインタラプタが遮断、かつ指示針が 4
以上なら」という判定になります。
- 61 -
ものづくりコンテスト電子回路組立 出力回路練習基板・入力回路練習基板 プログラム解説マニュアル
14. 参考文献
14. 参考文献
・第 11 回高校生ものづくりコンテスト全国大会・電子回路組立部門の資料、課題
・ルネサス エレクトロニクス(株)
R8C/38C グループ ユーザーズマニュアル ハードウェア編 Rev.1.10
・ルネサス エレクトロニクス(株)
M16C シリーズ,R8C ファミリ用 C/C++コンパイラパッケージ V.6.00
C/C++コンパイラユーザーズマニュアル Rev.1.00
・ルネサス エレクトロニクス(株)
High-performance Embedded Workshop V.4.09 ユーザーズマニュアル Rev.1.00
・ルネサス半導体トレーニングセンター C言語入門コーステキスト 第 1 版
・電波新聞社 マイコン入門講座 大須賀威彦著 第 1 版
・ソフトバンク(株) 新C言語入門シニア編 林晴比古著 初版
・共立出版(株) プログラマのための ANSI C 全書 L.Ammeraal 著
吉田敬一・竹内淑子・吉田恵美子訳 初版
マイコンカーラリー、販売部品についての詳しい情報は、マイコンカーラリー販売サイトをご覧ください。
https://www2.himdx.net/mcr/
R8C マイコンについての詳しい情報は、ルネサス エレクトロニクスのホームページをご覧ください。
http://japan.renesas.com/
の「製品情報」欄→「マイコン」→「R8C」でご覧頂けます
- 62 -
Fly UP