今まで、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)が、一般的のようです。
Translate
2009年11月29日日曜日
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
前回の配列(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日日曜日
2009年11月20日金曜日
配列(5) ポインタ(1)
[実験 MikroC Pro PIC16F84A_LED_0033]
配列とポインタ使ってPORTBのLEDを点滅するプログラムを考えなさい。
○○○○●●●●
●●●●○○○○
[ ポインタ宣言の書式 ]
char *pWink;
データ型 *ポインタ変数名
char* pWink;
データ型* ポインタ変数名
*ポインタをデータ型の後ろに付けてもポインタ変数名の前に付けてもどちらを使っても同じです。
[ ポインタの初期化 ]
[ ポインタで配列のアドレスの内容を呼び出す ]
*pWink ポインタの指すアドレスの内容 Wink[0]=0x0F
*(pWink+1) ポインタの指すアドレスの内容 Wink[1] =0xF0
mikroC PRO for PIC
配列とポインタ使って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年11月18日水曜日
配列(4) グローバル変数、スコープ
[実験 MikroC Pro PIC16F84A_LED_0032]
配列の要素数100以上使ってPORTBのLEDを点滅するプログラムを考えなさい。
配列は最初に宣言した単一のデータ型(例えばunsigned char)の要素の集まりです。
プログラムメモリが少ないPICなどのマイコンには配列は適しています。
変数には、有効範囲があります。この有効範囲は、スコープ(scope)と呼ばれています。
関数の範囲内で有効な変数をローカル変数、すべてのプログラムで有効な変数をグローバル変数と呼ばれています。
このローカル変数とグローバル変数の違いは、変数の宣言する場所によります。
main関数の前に宣言するか後に宣言するかで決まります。
main関数の前にある場合が、すべてのプログラムで有効なグローバル変数です。
main関数の後にある場合が、main関数のみで有効なローカル変数です。
また、自作した関数もその関数のみで有効なローカル変数です。
mikroC PRO for PIC
配列の要素数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
配列を使って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日日曜日
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
配列を使って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日金曜日
2009年11月12日木曜日
2009年11月11日水曜日
2009年11月8日日曜日
関数(8) ビット単位の論理演算
[実験 MikroC Pro PIC16F84A_LED_0026]
a = 0b11000101
b = 0b10010011
aとbのビット単位の論理演算するプログラムを考えなさい。
今回を解り難いので基盤をひっくり返しました。
手前が、PORTAで向こう側がPORTBです。
左から、RB7,RB6,RB5,RB4,RB3,RB2,RB1,RB0
mikroC PRO for PIC
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
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
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
登録:
投稿 (Atom)