0〜15(0〜F)のデジタルスイッチを使ったプログラムをいくつか試してみました。
実験に使用したデジタルスイッチは0〜15切替のアルプスSRQV101Gです。「LCDに手動で文字を表示する」でも使ったものです。少し大型なのでスペースを取りますが、つまみを指先で回せるので便利です。デジタルスイッチは内部に4個のスイッチが組み込まれていて、つまみを回すと0〜15の番号に応じてA,B,C,Dのスイッチが下の図のように切り替わります。スイッチが開いている状態が「0」、スイッチが閉じた状態が「1」です。
ATtiny26LのPA0〜PA3にデジタルスイッチ、PA4〜PA7に出力用のLEDをつなぎます。デジタルスイッチの出力端子は10kΩの抵抗でプルダウンしました。回路図を下に示します。
ブレッドボード上の実体配線図と試作写真を下に掲げます。なお、手持ち部品の関係で、実機ではR0とR1に12kΩの抵抗を使用しています。
デジタルスイッチの数字(0〜15)を4個のLEDで2進数表示するプログラムです。デジタルスイッチの各端子の状態がそのままLEDの点灯状態になります。スイッチが開いている(「0」)ならLEDが消灯、スイッチが閉じている(「1」)ならLEDが点灯します。下の図のような感じです。
デジタルスイッチ | ポート出力 | |||||||
番号 | D | C | B | A | LED7 | LED6 | LED5 | LED4 |
0 | 0 | 0 | 0 | 0 | ||||
1 | 0 | 0 | 0 | 1 | ||||
2 | 0 | 0 | 1 | 0 | ||||
3 | 0 | 0 | 1 | 1 | ||||
4 | 0 | 1 | 0 | 0 | ||||
(中 略) | ||||||||
15 | 0 | 1 | 0 | 1 |
プログラムは下記の通りです。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」になります。
入力端子(PA0〜PA3)をIC内部でプルアップするプログラムです。外部のプルダウン抵抗は不要になりますが、スイッチの動作が逆になる、つまり接点が閉じたとき入力が「0」になります。そこで、LEDは出力端子とVCCの間につなぎ、出力が「0」のときLEDが点灯するようにしました。回路図は下記の通りです。
プログラムは下記の通りです。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 | 終わり。 |
PB0〜PB3にデジタルスイッチをつないでみました。LEDはPA0〜PA3とVCC間に接続しました。PB0〜PB2にはAVRライターもつながっていますが、特に問題はありませんでした。ただし、プログラム書き込み時にはデジタルスイッチを「0」(すべての接点が開いた状態)にしておく必要があります。ライターにつながっている端子がGNDにアースされていると、プログラムの書き込みができません。
回路図を下に示します。
プログラムは下記の通りです。入力と出力のポート番号が同じなので、「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 | 終わり。 |
デジタルスイッチは前と同じくPB0〜PB3につないでいますが、出力用のLEDをPA4〜PA7に移しました。下のような回路になります。
プログラムは下記の通りです。入力を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 | 終わり。 |