Translate

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
 

2009年11月20日金曜日

配列(5) ポインタ(1)

[実験 MikroC Pro PIC16F84A_LED_0033]

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

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









[ ポインタ宣言の書式 ]


char  *pWink;
データ型  *ポインタ変数名
char*  pWink;
データ型*  ポインタ変数名
*ポインタをデータ型の後ろに付けてもポインタ変数名の前に付けてもどちらを使っても同じです。

配列用のポインタなので配列のアドレスが一致しなければ誤動作してしまいます。
つまり、ポインタの宣言する時、配列のデータ型と同じにしなければいけません。


[ ポインタの初期化 ]

(1)pWink = &Wink[0];
(2)pWink = Wink;
どちらを使っても同じ結果になります。

[ ポインタで配列のアドレスの内容を呼び出す ]

*pWink  ポインタの指すアドレスの内容 Wink[0]­=0x0F
*(pWink+1)  ポインタの指すアドレスの内容 Wink[1] =0xF0
*( )の丸括弧を忘れないように!!






mikroC PRO for PIC
 

2009国際ロボット展

来週、東京ビッグサイトで2009国際ロボット展が開催されます。
ご興味のある方は是非どうぞ。

事前登録すると入場無料です。

2009年11月18日水曜日

配列(4) グローバル変数、スコープ

[実験 MikroC Pro PIC16F84A_LED_0032]

配列の要素数100以上使ってPORTBのLEDを点滅するプログラムを考えなさい。








配列は最初に宣言した単一のデータ型(例えばunsigned char)の要素の集まりです。

プログラムメモリが少ないPICなどのマイコンには配列は適しています。


変数には、有効範囲があります。この有効範囲は、スコープ(scope)と呼ばれています。

関数の範囲内で有効な変数をローカル変数、すべてのプログラムで有効な変数をグローバル変数と呼ばれています。
このローカル変数とグローバル変数の違いは、変数の宣言する場所によります。

main関数の前に宣言するか後に宣言するかで決まります。

main関数の前にある場合が、すべてのプログラムで有効なグローバル変数です。
main関数の後にある場合が、main関数のみで有効なローカル変数です。
また、自作した関数もその関数のみで有効なローカル変数です。









mikroC PRO for PIC
 

2009年11月17日火曜日

配列(3)初期化

[実験 MikroC Pro PIC16F84A_LED_0031]


配列を使ってPORTBのLEDを下記のパターンで点滅するプログラムを考えなさい。

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







上記は配列(2)のプログラミングの書き方ですが、
下記のようにプログラムするのが普通です。






今回の配列は、配列を宣言すると同時に初期化して記述する方法です。

データ型 配列名 [ 添字要素数n] = { 要素0, 要素1, 要素2,…,要素n-1 }
char Ptn2[10] = {0x81,0x42,0x24,0x18,0x00, 0x18,0x24,0x42,0x81,0x00};


データ型 配列名 [ ] = { 要素0, 要素1, 要素2,…,要素n-1 }
配列を宣言と同時に初期化する場合は、{  }の中の要素の数が解るので
添字(要素数)を省略することが出来ます。

char Ptn2[ ] = {0x81,0x42,0x24,0x18,0x00, 0x18,0x24,0x42,0x81,0x00};

でも良いのです。


また、要素のデータを変える必要がないのでconstを最初に付けて

const char Ptn2[10] = {0x81,0x42,0x24,0x18,0x00,0x18,0x24,0x42,0x81,0x00};



const char Ptn2[ ] = {0x81,0x42,0x24,0x18,0x00,0x18,0x24,0x42,0x81,0x00};

と記述する方法もあります。









mikroC PRO for PIC

2009年11月15日日曜日

配列(2)

[実験 MikroC Pro PIC16F84A_LED_0030]

配列を使ってPORTBのLEDを下記のパターンで点滅するプログラムを考えなさい。



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







配列(1)と同じようにプログラムを作ると上記ようになります。



変数nを作りPtn1[n]としif文でnが8以上になった時はn=0にしなさい
と条件を与えてプログラムを書き換えると下記のようになります。







for文で書き換えると











mikroC PRO for PIC
 

2009年11月14日土曜日

配列(1)宣言

[実験 MikroC Pro PIC16F84A_LED_0029]

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

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






配列(array)は1つの配列名を使って複数の要素数を管理することが出来ます。


[ 配列の宣言 ]
char Hazard[2];
データ型 配列名[要素数];


[ 配列の要素の内容 ]

Hazard[0] = 0xFF;
Hazard[1] = 0x00;

今回の実験では、配列の要素数2個宣言しました。
配列の各要素は、配列名の後に添字演算子と呼ばれる[ ]の中に要素数を入れます。
この要素数は、添字と呼ばれています。
C言語では、[0]番から[n-1]番までです。










mikroC PRO for PIC

2009年11月13日金曜日

PICProg4Uをご紹介します。

Windows7 でPICProg4Uを使っています。
いろいろなPICに書き込めるので便利です。
Version2.1.0は、何故かアラームが出て焼けません。
















































2009年11月12日木曜日

関数(10) 戻り値のある関数(2)

[ 実験 MikroC PRO PIC16F84A_LED_0028]

引き算の関数を作りPORTBのLEDを点灯するプログラムを考えなさい。











mikroC PRO for PIC
 

2009年11月11日水曜日

関数(9) 戻り値のある関数(1)

[実験 MikroC Pro PIC16F84A_LED_0027]

足し算の関数を作りPORTBのLEDを2進法で点灯するプログラムを考えなさい。








前回までは、戻り値のないvoid型でしたが、 今回は戻り値のあるint型です。
return (answer);
return文で式の値(answer)を返します。












mikroC PRO for PIC
 

2009年11月8日日曜日

関数(8) ビット単位の論理演算

[実験 MikroC Pro PIC16F84A_LED_0026]


a = 0b11000101
b = 0b10010011
aとbのビット単位の論理演算するプログラムを考えなさい。









x & y; // bit単位のAND演算子論理積

x │ y; // bit単位のOR演算子論理和

x ^ y; // bit単位のXOR演算子排他的論理和

~x; // bit単位のNOT演算子否定












今回を解り難いので基盤をひっくり返しました。

手前が、PORTAで向こう側がPORTBです。

左から、RB7,RB6,RB5,RB4,RB3,RB2,RB1,RB0




mikroC PRO for PIC
 

2009年11月7日土曜日

関数(7) ビット単位のシフト演算(2)

[実験 MikroC Pro PIC16F84A_LED_0025]

PORTBのLEDをビット単位のシフト演算を使って1bit、2bit、3bit、4bit
左へシフトまたは右へシフトするプログラムを考えなさい。










x = (x<<1 data-blogger-escaped-1bit="" data-blogger-escaped-br="">x = (x>>1); // 1bit右へシフト
x = (x<<2 data-blogger-escaped-2bit="" data-blogger-escaped-br="">x = (x>>2); // 2bit右へシフト
x = (x<<3 data-blogger-escaped-3bit="" data-blogger-escaped-br="">x = (x>>3); // 3bit右へシフト
x = (x<<4 data-blogger-escaped-4bit="" data-blogger-escaped-br="">x = (x>>4); // 4bit右へシフト









X = 0xFF で x<<2 data-blogger-escaped-br="">上図のように2Bitづつ左へシフトしていきます。
この時、右側の空いたBitには「0」が埋められていきます。


x<<2 data-blogger-escaped-0xff="" data-blogger-escaped-br="">すべて0になっています。
それ以降1になることはありません。LEDは点灯しません。
そこでif文でシフトエンド処理をして同じパターンで繰り返されるようにしています。


ビット単位のシフト演算は、
負の値のシフトやビット数以上のシフトを行ってはいけません。






mikroC PRO for PIC

2009年11月5日木曜日

関数(6) ビット単位のシフト演算(1)

[実験 MikroC Pro PIC16F84A_LED_0024]


PORTBのLEDをビット単位のシフト演算を使って左へシフト

または右へシフトするプログラムを考えなさい。





( 例 )











ビット単位のシフト演算子を使ったサンプルプログラムです。


<<  左シフト演算子(bitwise shift left)

>>  右シフト演算子(bitwise shift right)

~ ビット否定演算子(bitwise complement )


shift_left1( )     // 左シフト演算子(RB0からRB7まで)
shift_right1( )    // 右シフト演算子(RB7からRB0まで)


shift_left3( ) // 左シフト演算子とビット否定演算子の組み合わせ
shift_right3( ) // 右シフト演算子とビット否定演算子の組み合わせ



右へシフトあるいは左へシフトとコメントしていますが、ビデオでは逆に動いています。ポートBのLEDは、左からRA0,RA1,RA2,RA3,RA4,RA5,RA6,RA7の並びになっています。






















mikroC PRO for PIC