ブレッドボードラジオAVRマイコン入門

BASCOM-AVR デジタルスイッチ(その1)

 0〜15(0〜F)のデジタルスイッチを使ったプログラムをいくつか試してみました。

1. デジタルスイッチのしくみ

 実験に使用したデジタルスイッチは0〜15切替のアルプスSRQV101Gです。「LCDに手動で文字を表示する」でも使ったものです。少し大型なのでスペースを取りますが、つまみを指先で回せるので便利です。デジタルスイッチは内部に4個のスイッチが組み込まれていて、つまみを回すと0〜15の番号に応じてA,B,C,Dのスイッチが下の図のように切り替わります。スイッチが開いている状態が「0」、スイッチが閉じた状態が「1」です。

2. マイコンICの回路

 ATtiny26LのPA0〜PA3にデジタルスイッチ、PA4〜PA7に出力用のLEDをつなぎます。デジタルスイッチの出力端子は10kΩの抵抗でプルダウンしました。回路図を下に示します。

 第1図

 ブレッドボード上の実体配線図と試作写真を下に掲げます。なお、手持ち部品の関係で、実機ではR0とR1に12kΩの抵抗を使用しています。

第2図 写真2

3. デジタルスイッチの状態を4個のLEDで表示する

 デジタルスイッチの数字(0〜15)を4個のLEDで2進数表示するプログラムです。デジタルスイッチの各端子の状態がそのままLEDの点灯状態になります。スイッチが開いている(「0」)ならLEDが消灯、スイッチが閉じている(「1」)ならLEDが点灯します。下の図のような感じです。

デジタルスイッチポート出力
番号DCBA LED7LED6LED5LED4
00000
10001
20010
30011
40100
(中 略)
150101

 プログラムは下記の通りです。BASCOM-AVRがインストールされたパソコンで下記のリンクをクリックしてファイルをダウンロードすると、BASCOM-AVR IDEが自動的に立ち上がって画面内にプログラムが表示されます。

 プログラムファイル digisw1a.bas

1 $regfile = "at26def.dat" ATtiny26Lを使用する。
2 $crystal = 1000000 クロック周波数を1MHzに設定。
3
4 Config Porta = &B11110000 PA7〜PA4を出力に、PA3〜PA0を入力に設定する。
5
6 Do Doループの範囲ここから。
7  Porta.4 = Pina.0 PA4の状態をPA0と同じにする。
8  Porta.5 = Pina.1 PA5の状態をPA1と同じにする。
9  Porta.6 = Pina.2 PA6の状態をPA2と同じにする。
10  Porta.7 = Pina.3 PA7の状態をPA3と同じにする。
11 Loop Doループの範囲ここまで。6行目へ戻る。
12
13 End 終わり。

 これまでのプログラムではひとつのポート全体を入力または出力に設定しましたが、同じポートの中で個別の端子ごとに入力あるいは出力に設定することもできます。「Porta.0 = Input : Porta.4 = Output ・・・」というふうにひとつずつ指定していってもいいのですが、もっと簡単なやり方があります。4行目「Config Porta = &B11110000」がそれです。ポートの状態を8桁の2進数で表わし、「0」が入力、「1」が出力になります。

 7行目から10行目は入力と出力を同じ状態にするプログラムです。PA0が「0」ならばPA4も「0」、PA0が「1」ならばPA4も「1」になります。

4. 入力端子をIC内部でプルアップする

 入力端子(PA0〜PA3)をIC内部でプルアップするプログラムです。外部のプルダウン抵抗は不要になりますが、スイッチの動作が逆になる、つまり接点が閉じたとき入力が「0」になります。そこで、LEDは出力端子とVCCの間につなぎ、出力が「0」のときLEDが点灯するようにしました。回路図は下記の通りです。

 第3図

 プログラムは下記の通りです。5行目「Porta = &B00001111」でPA3〜PA0をプルアップしています。

 プログラムファイル digisw1b.bas

1 $regfile = "at26def.dat" ATtiny26Lを使用する。
2 $crystal = 1000000 クロック周波数を1MHzに設定。
3
4 Config Porta = &B11110000 PA7〜PA4を出力に、PA3〜PA0を入力に設定する。
5 Porta = &B00001111 PA3〜PA0をプルアップする。
6
7 Do Doループの範囲ここから。
8  Porta.4 = Pina.0 PA4の状態をPA0と同じにする。
9  Porta.5 = Pina.1 PA5の状態をPA1と同じにする。
10  Porta.6 = Pina.2 PA6の状態をPA2と同じにする。
11  Porta.7 = Pina.3 PA7の状態をPA3と同じにする。
12 Loop Doループの範囲ここまで。7行目へ戻る。
13
14 End 終わり。

5. ポートBにデジタルスイッチをつなぐ

 PB0〜PB3にデジタルスイッチをつないでみました。LEDはPA0〜PA3とVCC間に接続しました。PB0〜PB2にはAVRライターもつながっていますが、特に問題はありませんでした。ただし、プログラム書き込み時にはデジタルスイッチを「0」(すべての接点が開いた状態)にしておく必要があります。ライターにつながっている端子がGNDにアースされていると、プログラムの書き込みができません。

 回路図を下に示します。

 第4図

 プログラムは下記の通りです。入力と出力のポート番号が同じなので、「Porta = Pinb」と書くだけでOKです。

 プログラムファイル digisw1c.bas

1 $regfile = "at26def.dat" ATtiny26Lを使用する。
2 $crystal = 1000000 クロック周波数を1MHzに設定。
3
4 Config Porta = Output ポートAを出力に設定する。
5 Config Portb = Input ポートBを入力に設定する。
6 Portb = &B00001111 PB3〜PB0をプルアップする。
7
8 Do Doループの範囲ここから。
9  Porta = Pinb ポートAの状態をポートBと同じにする。
10 Loop Doループの範囲ここまで。8行目へ戻る。
11
12 End 終わり。

6. PB0〜PB3の状態をPA4〜PA7に出力する

 デジタルスイッチは前と同じくPB0〜PB3につないでいますが、出力用のLEDをPA4〜PA7に移しました。下のような回路になります。

 第5図

 プログラムは下記の通りです。入力を4ビット左に「Shift」して出力します。

 プログラムファイル digisw1d.bas

1 $regfile = "at26def.dat" ATtiny26Lを使用する。
2 $crystal = 1000000 クロック周波数を1MHzに設定。
3
4 Config Porta = Output ポートAを出力に設定する。
5 Config Portb = Input ポートBを入力に設定する。
6 Portb = &B00001111 PB3〜PB0をプルアップする。
7 Dim N As Byte バイト型変数「N」を使用する。
8
9 Do Doループの範囲ここから。
10  N = Pinb ポートBの状態を変数「N」に代入する。
11  Shift N , Left , 4 「N」の値を4ビット左にシフトする。
12  Porta = N 「N」の値をポートAに出力する。
13 Loop Doループの範囲ここまで。9行目へ戻る。
14
15 End 終わり。