Translate

2009年10月8日木曜日

無限ループでLEDを点滅(3) ~ビット否定(NOT)


[実験 MikroC Pro PIC16F84A_LED_0005]


0.1秒間隔でPORTAとPORTBのLEDを交互に点滅させなさい。
○○●●●●○○
●●●●●●●●







(1)while文の無限ループ





(2)do〜while文の無限ループ





(3)for文の無限ループ







上記のプログラムでも良いのですが、
今回は別の方法を紹介しましょう。




ビット演算子と呼ばれています。

~ ビット否定(NOT)
a=~b;

bの各ビットを反転しその結果をaに代入する
0の時は1に、1の時は0に反転します。
PORTA = ~PORTA;
PORTB = ~PORTB;


(1)while文の無限ループ





(2)do〜while文の無限ループ





(3)for文の無限ループ














mikroC PRO for PIC
 

2009年10月7日水曜日

無限ループでLEDを点滅(2)

[実験 MikroC Pro PIC16F84A_LED_0004]
0.2秒間隔でLEDを交互に点滅させなさい。
●○●○●○●○
○●○●○●○●



(1)while文の無限ループ




(2)do〜while文の無限ループ





(3)for文の無限ループ












mikroC PRO for PIC

2009年10月6日火曜日

無限ループでLEDを点滅(1)

[実験 MikroC Pro PIC16F84A_LED_0003]
0.2秒間隔に全部のLEDを点滅させなさい。


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




C言語で無限ループは、(1)while文 (2)do~while文 (3)for文
の3つの記述方法があります。

(1)while文の無限ループは
while (1) {
...
}


で記述します。





(2)do~while文の無限ループは

do {
...
} while (1);



で記述します。

while (1)の後に;セミコロンがあるので注意。




(3)for文の無限ループは

for (;;) {
...
}


で記述します。





では何故、 while(1) が無限ループになるのでしょうか?

C言語では、( )の中に「制御式」を入れます。
制御式の値が、「0」か「非0」を判断します。

「0」(=0)の場合は「偽」(False)、「非0」(≠0)の場合は「真」(True) である
「1」は非0(≠0)、つまり「真」(True)
while(1) は「常に真」(True)、つまり「無限ループ」ということになります。







mikroC PRO for PIC

2009年10月5日月曜日

PIC16F84AでLEDを点灯(2) Delay_ms( ミリ秒 ) 関数

[実験 MikroC Pro PIC16F84A_LED_0002]

電源を入れてから2秒後にLED点灯させよ。

●●●●●●●●







Delay_ms(  )を使っています。
MikroC proのHELPを調べると





void Delay_ms(const unsigned long time_in_ms)



unsigned longとは、MikroC proのHELPを調べると




0 .. 4294967295までの整数を扱えることが解ります。

4294967295ミリ秒≒4294967秒≒71582分≒1193時間≒50日
ということになります。50日も普通は使わないと思います。


試しに今回のプログラムで

Delay_ms(4294967295 );

でコンパイルしてみます。どうなるでしょうか?





PIC16F84Aでは、ROM spaceが充分ではありません。


では今度は、
Delay_ms(150000000);

でコンパイルしてみます。どうなるでしょうか?





150000000ミリ秒≒150000秒≒2500分≒41時間≒2日弱


の遅延が出来るようです。


mikroC PRO for PIC

2009年10月4日日曜日

IC-Prog 1.06Bを使う。

IC-ProgとJDM-programmerでPICにプログラムを焼いてみます。

IC-Prog Software 1.06B Multi-Lingual

JDM programmer

PICライターの自作といえば、JDMプログラマが有名ですね。

PICライターのSoftといえば、IC-Progです。

使い方を一度覚えておくと良いと思います。





PIC16F84Aを選びます。




Open





開く





Program All





Yes






2009年10月3日土曜日

PIC16F84AでLEDを点灯(1)

LED実験ボードが出来たのでプログラムの練習です。

[実験 MikroC Pro PIC16F84A_LED_0001]
PIC16F84AでLEDを全部点灯せよ。
●●●●●●●●


MikroC Pro for picを起動します。













P 16F84A





20MHz





84A_LED_0001




void main() {
}

main 関数が自動で出来ているので、


TRISA = 0x00; // PortAをOutput
TRISB = 0x00; // PortBをOutput
PORTA = 0xFF; // PortAをHigh
PORTB = 0xFF; // PortBをHigh

4行入力します。





Edit Project





[ Configurationの設定 ]






OscillatorをHS

セラミック発振子は、HS






Power Up Timer をON


パワーアップタイマイネーブルビットの
パワーアップタイマを動作させる。

(OFFでも良い)




OK





Build





Finish successfullyが最後の行に出れば、Build成功。





84A_LED_0001.hexをPIC16F84Aに焼きます。





上部が、PortAのLED 左から
RA5,RA4,RA3, RA2,RA1,RA0,OSC1,OSC2

下部が、PortBのLED 左から 

RB0,RB1,RB2,RB3,RB4,RA5,RA6,RA7


RA4の出力は、オープンドレインタイプ。
RA5は、通常動作中の MCLR リセットスイッチ。アクティブLowでReset。

左の黄色いタクトスイッチを押してみて下さい。
押している間は、LEDが消灯し、
指を放すと、LEDが再び点灯します。








[ C言語の説明 ]

void main(){
  処理1;
  処理2;
  …… ;
  処理n;


main関数(main function)は、

C言語のプログラムの中で最初に実行される重要な関数です。
原則として「処理1」「処理2」………「処理n 」と下へ処理が実行されます。

プログラムを見やすくするために、Tabキーを押して字下げをします。
これをインデントといいます。

C言語では、文の終わりには「 ; (セミコロン)」の記号を書くことになっています。
これを単文と呼びます。
{ }で囲われた部分を複文と呼びます。

MicroC Pro では、C言語の「/* から */」と
C++言語の「//」の
2種類のコメント(comment)が使用可能です。
 
/* 1行コメント */  または  /* 複数行コメント */
// 1行コメント



[ プログラムの説明 ]

mikroC Proでは、「(レジスタ名)=(値)」で=演算子を用いて
レジスタに直接値を代入できます。



また、ポートの各ビットを指定する場合には、
「(ポート名).F(ビット名)」という書式もあります。

(値)を書くには、16進数、2進数、10進数の3つの表記が使われています。

16進数を表記する場合、数値の前に0xを付けます。
2進数の場合には、0bを付けます。
10進数の場合には、何も付けないという規則があります。



PIC16F84A は、8Bitマイコンなので下記のように表記します。





TRISA = 0x00; // PortAをOutput
TRISB = 0x00; // PortBをOutput
PORTA = 0xFF; // PortAをHigh
PORTB = 0xFF; // PortBをHigh



または

TRISA = 0b00000000; // PortAをOutput
TRISB = 0b00000000; // PortBをOutput
PORTA = 0b11111111; // PortAをHigh
PORTB = 0b11111111; // PortBをHigh


でもかまいません。

16Bitマイコンの場合は、下記のように見にくいですね。


TRISA = 0b0000000000000000; // PortAをOutput
TRISB = 0b0000000000000000; // PortBをOutput
PORTA = 0b1111111111111111; // PortAをHigh
PORTB = 0b1111111111111111; // PortBをHigh



TRISレジスタは、ピンの入出力(Input,Output)の方向を決めるレジスタです。

0ならば出力(Output)、1ならば入力(Input)となります。

出力(Output)とは、LED、モータ、油圧、空圧など。
入力(Input)とは、スイッチ、センサーなど。

ですから、まず
TRISレジスタでピンの役割 (InputかOutput)をPICに指示します。


TRISA = 0x00;
TRISB = 0x00;

次に、PORTレジスタで1ならばHigh(5v)、
0ならばLow(0v) をPICの各PINに指示します。

PORTA = 0xFF;
PORTB = 0xFF;

つまり、出力(Output)に指定した、LED、モータ、油圧、空圧などの
ONまたはOFFを決めてやります。



逆にプログラミングしても正常に動きます。

mikroC PRO for PIC

2009年10月2日金曜日

18PIN用のLED実験ボード

まず、18PIN用のLED実験ボードを作ってみます。

PIC16F84A、PIC16F628A、PIC16F88など
おそらく、18PINすべてのPICで実験できます。







[実験ボードの説明]


ユニバーサル基盤(72x48)
DIPソケット(18ピンICソケット)
VDD=5v、Vss=GND
PortA、PortBの16本の足に300Ωの電流制限抵抗とLED
電源確認用の300Ωの電流制限抵抗とLED
リセット用タクトスイッチと10kΩのPull_UP抵抗
Oscillator に20MHzのセラミック発振子
高周波ノイズ防止用0.1μFのパスコン
ジャンパーピンによる切り替え

5v電源回路は、省略しています。











上記のように取り付ければ、8PIN用の実験も出来ますね。

半田付けが面倒な方は、ブレッドボードで実験して下さい。