Translate

2009年12月8日火曜日

スイッチ(4) RA1_bit

[ 実験MikroC Pro PIC16F84A_SW_LED_0014]

[(2)active low のスイッチに、active lowのLED]


RA1のスイッチ(SW1)を押した時、RB4LED2を点灯させなさい。









今回はactive low のスイッチに、active lowのLEDの実験です。

RB4のLED2は、active lowの時、点灯し、active highの時、消灯します。
PORTB = 0x10; // RB4=1(High)にしてLED2を消灯
をプログラムします。
この時、
PORTB = 0xFF;
にすると、RB3のLED1が点灯してしまいます。



MikroC PROでは、RA(0-7)_bit の書式もあります。
PORTA.F1
と同様にポートAの1ビットにアクセス出来ます。





















mikroC PRO for PIC

2009年12月6日日曜日

スイッチ(3) Button関数

[ 実験 MikroC Pro PIC16F84A_SW_LED_0011]

[(1)active low のスイッチに、active highのLED(3)]


前回の続きです。

mikroCには、入力スイッチ専用のButton関数があります。











unsigned short Button(unsigned short *port, unsigned short pin, unsigned short time, unsigned short active_state);

Button(&PORTA,1,1,0)
Button(&PORT(A or B),(ピン番号),(デバウンスの時間),(active highactive low (1 or 0)))
active low の例です。




active high の例です。






もう1つ実験してみます。



mikroCのHelpには

parameter time is a debounce period in milliseconds
と記載されています。
デバウンスの時間(ミリ秒)
チャタリングですね。
試しに、1000を入れて実験してみます。
if(Button(&PORTA,1,1000,0)){ // Active lowの時




スイッチを押してから1秒くらい後にLEDが点灯しています。


mikroC PRO for PIC
 



2009年12月5日土曜日

スイッチ(2)

[ 実験 MikroC Pro PIC16F84A_SW_LED_0005]

[(1)active low のスイッチに、active highのLED(2)]


前回の続きです。
スイッチには、いろいろな記述があります。
これが全てではありません。

ぜひPIC16F84Aに書き込みをして確認して下さい。
また、何故こうなるのか理由も考えて下さい。

























if(条件式)
if((~PORTA.F1 & 0x1F) != 2){ // SW1オンの時(Active low)
PORTB.F3 = 1; // RB3のLED1を点灯
} else {
PORTB.F3 = 0; // RB3のLED1を消灯
}
他にも、いろいろあると思います。
スイッチに関するコメントお願い致します。
mikroC PRO for PIC
 

2009年12月2日水曜日

スイッチ(1) if文でスイッチ入力

[ 実験 MikroC Pro PIC16F84A_SW_LED_0001]
[(1)active low のスイッチに、active highのLED(1)]


RA1のスイッチ(SW1)を押した時、RB3のLED1を点灯させなさい。















すべてのピンは入出力設定ビット (TRIS レジスタ) を備えています。
TRISA ビットがセット(=1) されると、そのビットに対応する PORTA ピンが入力となり、出力ドライバがハイインピーダンスモードになります。
TRISA ビットをクリア(=0) されると、そのビットに対応する PORTA ピンが出力となり、出力ラッチの内容がピンに出力されます。
--- Data Sheet より ---



つまり、プログラミングする時、TRISレジスタを”1”または”0”にすることでI/Oポートを入力(Input)にするか出力(Output)にするかが決まります。

スイッチは、入力(Input)なのでTRISレジスタを”1”にします。
LEDは、出力(Output)なのでTRISレジスタを”0”にします。




TRISA = 0x06; // RA1,RA2=input 他=output
TRISB = 0x00; // RB0-7=output








if(PORTA.F1 == 0)もし、RA1が0(Low:0V)の時、
Active Lowなのでスイッチを押している時

PORTB.F3 = 1;RB3が1(High:5V)の時、LED1はGND(0V)に繋がっていますので
電流が流れてLED1は点灯します。

elseそれ以外の時は

PORTB.F3 = 0;RB3が0(Low:0V)の時、LED1はGND(0V)に繋がっていますので
電流は流れませんからLED1は点灯しません。







if(PORTA.F1 == 1)もし、RA1が1(High:5V)の時、
Active Lowなのでスイッチを押していない時







if(PORTA.F1 != 1)
もし、RA1が1(High:5V)でない時
RA1が0(Low:0V)の時








if(PORTA.F1 != 0)
もし、RA1が0(Low:0V)でない時
RA1が1(High:5V)の時


スイッチは、基本的に
if(条件式)~else~
を使います。


他にもありますが、次回にします。



LEDのアノード(+)側に抵抗を半田付けしています。





スイッチを押しています。


オレンジ色のコードが5V
緑色のコードが、GNDで0V
4番ピン(MCLR)を5Vに繋がないと誤動作します。
(PIC16F88,PIC16F628Aに慣れるとよく忘れてしまいます。)



mikroC PRO for PIC

2009年11月29日日曜日

スイッチの付け方active lowとactive high

今まで、LEDを点滅させながら、基本的なC言語のプログラミングを練習してきました。

PIC16F84AのData Sheetです。










PIC16F84Aの説明をしませんでした。


(1)
まず、電源です。

14番ピンのVddに5Vを繋ぎます。
Wide operating voltage range:
- Commercial: 2.0V to 5.5V
- Industrial: 2.0V to 5.5V

幅広い動作電圧範囲:
- 商業用: 2.0V to 5.5V
- 工業用: 2.0V to 5.5V

5番ピンのVssをGNDとします。


(2)
次に15番16番ピンにOscillatorを付けます。
16F88、16F628Aなどのように発振器は内蔵されていませんので
セラロック、水晶発振器などが必要です。

Operating speed:
DC - 20 MHz clock input
DC - 200 ns instruction cycle
動作速度:
DC - 20 MHz クロック入力
DC - 200 ns 命令サイクル

(3)
4番ピンのMCLR(Master Clear)を5Vに繋ぎます。
Master Clear (Reset) input/programming voltage input.

RESETボタンを付ける場合は、スイッチを押した時にactive low(GND)になるようにします。
This pin is an active low RESET to the device.

通常何もしない時は5V(High:1)でRESETボタンを押すと、0V(Low:0)になり
PICは、リセットされます。

(4)
これらの5本のピンを全体の18本から引いてRA0-3,RB0-7の13本が双方向I/Oピンです。

I は、Inputでスイッチ、センサーなどの入力。
O は、OutputでLED,モータなどの出力。 






PIC16F84AにスイッチとLEDをそれぞれ2個付けた基本的な回路です。


RA1のピンは、通常何もしない時は5Vでスイッチを押すと0V(Low:0)になるactive low(負論理)です。
この10kΩの抵抗はプルアップ抵抗と呼ばれています。

RA2のピンは、通常何もしない時は0Vでスイッチを押すと5V(High:1)になるactive high(正論理)です。
この10kΩの抵抗はプルダウン抵抗と呼ばれています。

RB3に付けたLEDは、RB3がHigh(1)のとき点灯し、Low(0)のとき消灯するactive high です。ソース電流
RB4に付けたLEDは、RB4がLow(0)のとき点灯し、High(1)のとき消灯するactive low です。シンク電流


この4つの組み合わせで
(1) active low のスイッチに、active highで点灯するLED。
(2) active low のスイッチに、active lowで点灯するLED。
(3) active high のスイッチに、active highで点灯するLED。
(4) active highのスイッチに、active lowで点灯するLED。
の4つの回路があり、それぞれプログラミングに気を付けなければいけません。

PICでは、プルアップ抵抗がある(1)(2)が、一般的のようです。

2009年11月23日月曜日

配列(7) ポインタ(3)

[実験 MikroC Pro PIC16F84A_LED_0035]

前回の配列(6)ポインタ(2)の実験で配列の順番を変えずにPORTBのLEDを
点滅するパターンを逆にするプログラムを考えなさい。
unsigned char Ptn3[11] = {0x81,0x42,0x24,0x18,0x00,0x81,0xC3,0x66,0x3C,0x18,0x00,};



○○○○○○○○
○○○●●○○○
○○●●●●○○
○●●○○●●○
●●○○○○●●
●○○○○○○●
○○○○○○○○
○○○●●○○○
○○●○○●○○
○●○○○○●○
●○○○○○○●







pPtn3 = &Ptn3[10]; // ポインタ初期化
で配列の最後のアドレスを指すように初期化しています。


Ptn3[10] =0x00 //○○○○○○○○
Ptn3[9] =0x18  //○○○●●○○○
Ptn3[8] =0x3C  //○○●●●●○○



Ptn3[1] =0x42 //○●○○○○●○
Ptn3[0] =0x81 //●○○○○○○●

最後の要素のアドレスを指定したので引き算で配列のアドレスを逆に指定しながらLEDの点滅パターンを逆にしています。






pPtn3 = Ptn3; // ポインタ初期化
で配列の最初のアドレスを指すように初期化しています。


+10で最後のアドレスにしてから
引き算で配列のアドレスを戻しています。






mikroC PRO for PIC

2009年11月22日日曜日

配列(6) ポインタ(2)


[実験 MikroC Pro PIC16F84A_LED_0034]

配列とポインタ使ってPORTBのLEDを点滅するプログラムを考えなさい。


●○○○○○○●
○●○○○○●○
○○●○○●○○
○○○●●○○○
○○○○○○○○
●○○○○○○●
●●○○○○●●
○●●○○●●○
○○●●●●○○
○○○●●○○○
○○○○○○○○
















mikroC PRO for PIC