| 装置 | メーカー | 型番/仕様 | 数量 |
| パソコン | 1 | ||
| H8マイコンボード | 秋月電子通商 | AKI-H8/3664N | 1 |
| ブレッドボード | 1 | ||
| 直流電源 | 5V出力 | 1 | |
| 9V出力 | 1 | ||
| 赤色LED | 6 | ||
| トランジスター | 東芝 | 2SC1815 | 2 |
| 抵抗 | 3.3 [k |
8 | |
| セラミックコンデンサー | 0.1 [ |
2 | |
| スピーカー | 1 | ||
| モーター | 1 | ||
| 液晶表示モジュール | 1 | ||
| 温度センサー | 1 | ||
| OPアンプ | 1 | ||
| タクトスイッチ | 2 | ||
| ジャンパーピン | 2 | ||
| D-SUBコネクター | 1 | ||
| ブレッドボード配線材 |
ブレッドボードを見て分かるように,たくさんの小さな穴が開いている.穴の間隔は1/10 インチとなっており,それはIC(Integrated Circuit)の足の間隔に等しい.この穴にICを 差し込んで,回路を作成する.ICに限らず,抵抗やスイッチ,トランジスター等の半導体 部品も差し込むことができる.差し込んだ部品は配線材により接続して,回路とする.
ブレッドボードを使うためには,内部の配線を理解しなくてはならない.ここで使うブレッ ドボードは,主に4つのブロックからできあがっている.そのひとつの内部配線を図 6 にしめす.数個の穴が内部で,電気的に接続されてい る.この接続を理解して,ブレッドボードを上手に使おう.
この実験で必要な原始的な部分のプログラムは全て,ダウンロードして使う.このプログ ラムの中身を全て理解できれば,一人前である.興味のある者はこれを理解するよう努力 せよ.コンピューターの仕組みがよくわかるようになる.
諸君がこの実験で記述するプグラムには原始的な部分はあまり見えないようにしているが, それでもビット操作等が必要になる.その時は,じっくり考えて動作の内容を理解しなく てはならない.
レジスターPDR5の値をC言語で設定するには,次のようにする.
PDR5 = 0x01;
PDR5 = (0x01 & 0x3f) | (PDR5 & 0xc0);
このようにすると,最初の0x01の部分を変えることで,第0--5ビットを任意に設定 できる.ここでは.右辺の0x01により,PDR5レジスターの第0ビットに1を設 定している.もし,ここを0xffとしても,第0--5ビットは1が設定されるが,第6と 7ビットは変化しない.このようなことができる理由を以下に示す.
1 #include "3664.h"
2
3 int main()
4 {
5
6 init_led();
7
8 PDR5 = (0x01 & 0x3f) | (PDR5 & 0xc0); /* PDR5は,port5のデータレジスタ */
9
10 while(1){
11 SLEEP();
12 }
13 }
14
1 #include "3664.h"
2
3 int main()
4 {
5
6 init_led();
7
8 PDR5 = (0x2a & 0x3f) | (PDR5 & 0xc0); /* PDR5は,port5のデータレジスタ */
9
10 while(1){
11 SLEEP();
12 }
13 }
14
1 #include "3664.h"
2
3 #pragma interrupt
4 void int_timera(void)
5 {
6 CLI();
7 IRR1 &= 0xbf;
8 PDR5 = (PDR5++)&0x3f | (PDR5 & 0xc0); /* カウントアップ */
9 STI();
10 }
11
12 int main()
13 {
14
15 init_led(); /* port5を使うときの初期化 */
16 init_timer(); /* timer割り込みを使うときの初期化 */
17
18 PDR5 = (0x00 & 0x3f) | (PDR5 & 0xc0); /* PDR5は,port5のデータレジスタ */
19
20 TMA = 0x99;
21
22 while(1){
23 SLEEP();
24 }
25 }
26
の「複数の
LED点灯実験」と同じである.
1 #include "3664.h"
2
3 #pragma interrupt
4 void int_irq0(void){
5 CLI();
6 IRR1 &= 0xfe;
7 PDR5 = (PDR5++)&0x3f | (PDR5 & 0xc0); /* カウントアップ */
8 STI();
9 }
10
11
12 int main()
13 {
14
15 init_led(); /* port5を使うときの初期化 */
16 init_irq0(); /* irq0割り込みを使うときの初期化 */
17
18 PDR5 = (0x00 & 0x3f) | (PDR5 & 0xc0); /* PDR5は,port5のデータレジスタ */
19
20 while(1){
21 SLEEP();
22 }
23 }
24
ここでの実験は,主に文献 [2]を参考にした.
H8マイコンで作られたPWM波形は,CN2の13番ピン(FTIOD)から出力される.その出力 をトランジスターで増幅し,スピーカーをならしている.
の「複数の
LED点灯実験」と同じである.
1 #include "3664.h"
2
3 #pragma interrupt
4 void int_irq0(void){
5 CLI();
6 IRR1 &= 0xfe;
7
8 PDR5 = (PDR5++)&0x3f | (PDR5 & 0xc0); /* カウントアップ */
9
10 GRA=GRA/4*3; /* 音の周期を3/4に */
11 GRD=GRA/2;
12
13 STI();
14 }
15
16
17 int main()
18 {
19
20 init_led(); /* port5を使うときの初期化 */
21 init_irq0(); /* irq0割り込みを使うときの初期化 */
22 init_pwm();
23
24 PDR5 = (0x00 & 0x3f) | (PDR5 & 0xc0); /* PDR5は,port5のデータレジスタ */
25
26 GRA=0xffff; /* 音の初期値 */
27 GRD=GRA/2;
28
29 start_pwm(); /* pwm 信号スタート */
30
31 while(1){
32 SLEEP();
33 }
34 }
35
H8マイコンで作られたPWM波形は,CN2の13番ピン(FTIOD)から出力される.その出力 をダーリントン接続したトランジスターで増幅し,モーターを回している.
の「複数の
LED点灯実験」と同じである.
1 #include "3664.h"
2
3 #pragma interrupt
4 void int_irq0(void){
5 CLI();
6 IRR1 &= 0xfe;
7
8 PDR5 = (PDR5++)&0x3f | (PDR5 & 0xc0); /* カウントアップ */
9
10 GRD+=0x1000; /* PWMのHの幅を1/16ずつひろげる */
11
12 STI();
13 }
14
15
16 int main()
17 {
18
19 init_led(); /* port5を使うときの初期化 */
20 init_irq0(); /* irq0割り込みを使うときの初期化 */
21 init_pwm();
22
23 PDR5 = (0x00 & 0x3f) | (PDR5 & 0xc0); /* PDR5は,port5のデータレジスタ */
24
25 GRA=0xffff; /* モーターの初期速度 */
26 GRD=0x0000;
27
28 start_pwm(); /* pwm 信号スタート */
29
30 while(1){
31 SLEEP();
32 }
33 }
34
図15にこの実験で使うLCDの外観とピン番号を示す.ここで使うLCDは データを4ビットと8ビットのいずれかで転送することができる.今回の実験では,接続す る線の数を減らすために,4ビットモードで使用する.
図16に示すように,それには3本の電極がある.2本は抵抗の両端に 接続されており,残りの1本は抵抗の途中に接続されている.そのため図16のように 接続することにより,0〜5[V]の電圧を取り出すことができる.
ここでは,10
のポテンションメーターを使って,LCDのコ
ントラストの調整に用いている.LCDのコントラストは,3番ピンの電圧で決まる.その電
圧をポテンションメーターで供給する.
の「複数の
LED点灯実験」と同じである.
LCDを制御するために,以下のような関数を用意した.必要に応じて使うこと.これらの関数のソー スプログラムは,ファイル h8c.c にあるので興味のある者は見るとよいだろう.
関数 void LCD_init(void) 役割 LCDを使うための初期化を行う.LCDを使うときに,最初に必ず呼び 出さなくてはならない.
関数 void LCD_clear(void) 役割 LCDの画面の文字を全て消去する.
関数 void LCD_locate(int row, int col) 引数 第一引数:行数 第二引数:列数 役割 引数で指定した位置にカーソルを移動させる.
関数 void LCD_putstr(char *string) 引数 文字列を示すポインター 役割 文字列をLCDに表示させる.
関数 void LCD_putchar(char c) 引数 表示させたい文字(1文字) 役割 文字をLCDに表示させる.
関数 void LCD_putint(char i) 引数 表示させたい整数. 役割 整数をLCDに表示させる.
関数 void LCD_putfloat(double x, int d) 引数 第一引数:表示させたい倍精度実数 第二引数:小数点以下の桁数 役割 倍精度実数を浮動小数点数として,指定の桁数で表示する.
関数 void LCD_putbit8(unsigned char d) 引数 表示させたい整数(1バイト) 役割 1バイトのビットパターンを表示させる.
関数 void wait_ms(int s) 引数 ミリ秒 役割 指定の時間,CPUの動作を止める.
1 #include <stdlib.h>
2 #include "3664.h"
3 #include "h8c.h"
4
5
6 int main()
7 {
8
9 LCD_init(); // LCDの初期化
10 LCD_clear(); // LCDの画面クリアー
11 LCD_locate(1,1); // カーソル位置変更
12 LCD_putstr("Hello World !."); // 文字列出力
13 LCD_locate(2,1);
14 LCD_putstr("From Akita.");
15
16 while(1){
17 SLEEP();
18 }
19 }
20
H8マイコンは,CN1の23番ピンに印加されている電圧(大体5[
])を10ビットでデジタ
ルに変換する.10ビットで表現できる最大値は 1111111111=1023 である.したがって,
5/1023=4.88[
]が分解能である.
H8マイコンには8個のアナログ入力端子があるが,ここではCN1の10番ピンのAN0のみ使う. この端子に印加する電圧は,AD変換を行う際の比較電圧(CN1の23番ピン)よりも小さくし なくてはならない.また,逆電圧も印加してはならない.回路が破損するからである.そ のため,ここでの実験ではダイオードを用いた保護回路つける.
の「複数の
LED点灯実験」と同じである.
AD変換器を制御するために,以下のような関数を用意した.必要に応じて使うこと.これらの関数のソー スプログラムは,ファイル h8c.c にあるので興味のある者は見るとよいだろう.
関数 void ADC_init(void) 役割 AD変換器を使うための初期化を行う.AD変換器を使うときに,最初に必ず呼び 出さなくてはならない.
関数 int ADC(void) 役割 AN0(CN1の10番ピン)に接続さたアナログ電圧よ読み取り,戻り値と して返す.戻り値は 0〜1023の整数値である.0が0[ ]で,1023がCN1の23番ピン の電圧となる.
1 #include <stdlib.h>
2 #include "3664.h"
3 #include "h8c.h"
4
5
6 int main()
7 {
8 int vdata;
9 double v;
10
11 LCD_init();
12 LCD_clear();
13 LCD_locate(1,1);
14 LCD_putstr("Start ADC");
15 wait_ms(1000);
16 LCD_clear();
17
18 ADC_init();
19
20 while(1){
21 vdata= ADC();
22
23 v = (double)vdata/1023*5.1;
24
25 LCD_clear();
26 LCD_locate(1,1);
27 LCD_putstr("ADC result");
28 LCD_locate(2,1);
29 LCD_putfloat(v,3);
30 LCD_locate(2,10);
31 LCD_putstr("[V]");
32
33 wait_ms(100);
34 }
35 }
36
電圧の増幅にはOPアンプ(operational amplifier)をつかう.OPアンプ使った信号の増幅
は簡単で,広範囲に使われている.ここでは,非反転増幅という回路をつかう.その回路
は,図20のようにする.このようにすると入力電圧(
)と出力電圧
(
)は,
![]() |
(1) |
この実験で使うOPアンプはナショナルセミコンダクター社のLMC662で,図 21に示すように,ひとつのパッケージに2つのOPアンプが内蔵されている.
の「複数の
LED点灯実験」と同じである.
1 #include <stdlib.h>
2 #include "3664.h"
3 #include "h8c.h"
4
5
6 int main()
7 {
8 int i, sum_ad, N=10000;
9 double t;
10
11 LCD_init();
12 LCD_clear();
13 LCD_locate(1,1);
14 LCD_putstr("Start ADC");
15 wait_ms(1000);
16 LCD_clear();
17
18 ADC_init();
19
20 while(1){
21 sum_ad=0;
22
23 for(i=0;i<N;i++){
24 sum_ad += ADC();
25 }
26
27 t = (double)sum_ad/N*5.1/1023/11.0/0.01;
28
29 LCD_clear();
30 LCD_locate(1,1);
31 LCD_putstr("Temperature");
32 LCD_locate(2,1);
33 LCD_putfloat(t,4);
34 LCD_locate(2,11);
35 LCD_putstr("[deg]");
36 }
37 }
38