プログラムを作成する時、タイミング等を合わせる為に wait time を挿入する事は良くある事です。
又、アッセンブラーでプログラムを作成するとなると、タイミング時間を入れる為にステップ数を計算してプログラムしなければなりません。
しかし、手計算でする為、間違いが良くあります。
ところで、C 言語でプログラムする時は、delay time の関数が用意されているので、それを利用することができます。設定は、簡単です。
次の一文を書いて、delay time の関数を使えるように宣言します。
#define _XTAL_FREQ 4000000 // オシレータ周波数 4Mhzの場合又、アッセンブラーでプログラムを作成するとなると、タイミング時間を入れる為にステップ数を計算してプログラムしなければなりません。
しかし、手計算でする為、間違いが良くあります。
ところで、C 言語でプログラムする時は、delay time の関数が用意されているので、それを利用することができます。設定は、簡単です。
次の一文を書いて、delay time の関数を使えるように宣言します。
関数は、
__delay(1000); // 1000命令サイクル遅延する
__delay_us(400); // 400 μs( マイクロ秒 )遅延する
__delay_ms(10); // 10 ms ( ミリ秒 )遅延する
上記の3個があります。但し、制限が有ります。(上記の括弧内の数値は例です。)
それは、オシレータの周波数によって、ディレータイムに上限がある事です。
次の表を見て下さい。
動作周波数 | 最大時間 | __delay_ms(x) | __delay_us(x) |
20Mhz | 39,424μs | __delay_ms(39) | __delay_us(39424) |
16Mhz | 49,280μs | __delay_ms(49) | __delay_us(49280) |
10Mhz | 78,848μs | __delay_ms(78) | __delay_us(78848) |
8Mhz | 98,560μs | __delay_ms(98) | __delay_us(98560) |
4Mhz | 197,120μs | __delay_ms(197) | __delay_us(197120) |
それ以上のディレータイムが必要になる時は、 for 文、while文 などによるループ・プログラムを
作って実現するか、自分でループ・プログラムを作成してディレイ・タイマーを起動する等します。
又、 関数の括弧内に変数を使う事ができません。数値のみです。
次に、サンプル・プログラムを表示します。
又、 関数の括弧内に変数を使う事ができません。数値のみです。
次に、サンプル・プログラムを表示します。
このプログラムは、一定時間ごとにLEDランプなどを表示させる単純なプログラムです。
赤枠の中のプログラムを見て下さい。
10ms のディレイ・タイム遅延を行っています。これを while 文によって mt 回繰り返します。
wait_time(50); // wait time = 10 * 50 =500 ms

どちらも同じように動作します。
これらのプログラムをコンパイルすると、どうなるかを比べて見みます。赤枠の中のプログラムを見て下さい。
10ms のディレイ・タイム遅延を行っています。これを while 文によって mt 回繰り返します。
wait_time(50); // wait time = 10 * 50 =500 ms

又、for 文でプログラムする時は、 赤枠部分の文と、次の文を入れ替えて下さい。
どちらも同じように動作します。
while文の場合(プログラム・メモリー 59ワード)
for 文の場合( プログラム・メモリー 66 ワード )

unsigned int ・・・・; 4バイト幅のデータ型に宣言。実際は、1バイト幅のデータで済む・・・
unsigned char ・・・・; この、1バイト幅のデータ型に宣言するのが正しい。
for 文の場合( プログラム・メモリー 66 ワード )
と、なります。
プログラム・メモリーの消費の仕方が違います。
小規模のプログラムでは、問題になりませんが、複雑なプログラムを作成する時に、このような
サブルーチンを多用するとプログラム・メモリーが不足してきます。
効率良くプログラムを作成する為に、普段から心がける事が必要です。
[ 効率良くプログラミングする為のヒント ]
プログラムで使用する変数のデータ型について、普段、気にしないで使われていると思います。
PIC マイコンがプログラム内の変数を参照するために、1 バイト・データ形式の場合、1 バイト分の領域を確保します。
又、4 バイト・データ形式の場合、4 バイト分の領域を確保します。
ところが、1バイト・データを扱っているのに、4バイト分の領域を確保するとどうなるでしょうか?・・・
それは、マイコンが4 バイトのデータを参照する事になり、時間が掛かります。
こんな事では、高速動作をさせたりする事が難しくなります。
又、プログラム・サイズも大きくなってしまいます。
unsigned int ・・・・; 4バイト幅のデータ型に宣言。実際は、1バイト幅のデータで済む・・・
unsigned char ・・・・; この、1バイト幅のデータ型に宣言するのが正しい。
そこで、扱うデータのサイズを正しく把握して、データ型を正しく宣言してプログラミングすることが必要です。
0 件のコメント:
コメントを投稿