|
このページは「24環境」の情報です 第8回 ハードウェア入門2.DIOの基礎 †海老原祐太郎
2002/9/1
前回、デジタル出力ポートにHやLの電圧を出したり、デジタル入力ポートの しかしテスターで計って5Vが確認できただけでは面白くありません。 基本はLED †いきなりメカを動かすのも大変なので、最初はLEDを制御してみます。 LEDを点灯するには電圧(Vf)2.5Vをかけます。電流(Ic)で明るさが決まります。 出力ポートがHレベルで5Vだとすると、LEDに2.5Vをかけますので抵抗に 電流を10mAとすると、オームの法則から R=E/I で 2.5/0.01= 250Ωとなります。 出力ポートをHレベル。つまりソフトウェアから1を書き込むとLEDが点灯し、 と、ここまで説明しておいてアレですが、現実にはこの回路はあまり使いません。 この回路形式を「Hレベルドライブ」といったり「ソースドライブ」、日本語では「正論理」 今回の図は先ほどと少し違っています。抵抗値は同じく270Ωとしましょう。 出力ポートはLレベルを出力する時には電流を吸い込むほうに働きます。 この回路の場合はLEDの電流は電源(Vcc)から直接供給されているので もちろん出力ポートに大電流を流し込んだらICが壊れてしまいますが、 出力ポートにLレベルを出力すること。すなわち、ソフトウェアから0を書き込むことで
LEDが点灯します。1を書き込むと、出力ポートがHになり電源電圧5V近くに この回路形式を「Lレベルドライブ」といったり「シンクドライブ」、日本語では「負論理」 LED点灯実験 †CAT68701にはボード上にLEDが1個乗ってますので実験にはハンダゴテもLEDも不要です。 電流制限抵抗は図には省かれていますが実際には付いています。 では実際にコードを書いて見ます。 #include <stdio.h> #include <fcntl.h> #include "paradrv.h" int main(){ int fd; unsigned short data,old; fd=open("/dev/cat68701-para",O_RDWR); if(fd<0){ perror(""); exit(); } while(1){ printf("LED ON\n"); old=ioctl(fd,PARA_GETOUTPUTDATA,0); data = old | 0x8000; // <−−ビット15を1にする write(fd,&data,2); sleep(1); printf("LED OFF\n"); old=ioctl(fd,PARA_GETOUTPUTDATA,0); data = old & ~0x8000; // <−−ビット15を0にする write(fd,&data,2); sleep(1); } close(fd); } 出力画面 LED ON LED OFF LED ON LED OFF 見事にLEDが点滅していますね。 スイッチからの入力 †今度は入力を考えて見ます。 図のように入力ポートにスイッチと抵抗をつけます。 この回路はスイッチを押している間が「1」。スイッチを離している間が「0」になります。 今度は逆にスイッチをグランド側につけてみます。 この回路はスイッチを押している間が「0」、離している間が「1」になります。 実際の回路では後者の「スイッチをグランド側につける」回路が多用されます。
などが主な理由です。 スイッチ入力実験 †CAT68701には入力スイッチも付いていますので、半田ごて使わずに入力の実験ができます。 入力ポートのビット12〜15にスイッチがつながっています。 #include <stdio.h> #include <fcntl.h> #include "paradrv.h" int main(){ int fd; unsigned char data[2]; fd=open("/dev/cat68701-para",O_RDWR); if(fd<0){ perror(""); exit(); } while(1){ read(fd,data,2); printf("%02x\n",(data[1]>>4) & 0xf); sleep(1); } close(fd); } DIPSWの1をONにしてある状態で(自動ブートに設定してあるから)でプログラムを実行すると 0e 0e 0e 以上がデジタルIOの本当の基礎になります。 |