楽釣工房では、小魚用しゃくり機、わかさぎ用しゃくり機、Picマイコン制御による自動しゃくり機(しゃくりパターン制御)、赤外線リモコンの応用回路(電気機器のON/OFF、温度制御、リモコンに依る数値設定など)、電子回路について書いて行きます。

 ブログの投稿記事に画像データを多く使用している為、他の投稿記事を読む事に不便をかけると思われます。
従って、投稿記事の前文をブログで公開し、全体の記事は ホーム・ページ [ 楽釣119 ] で公開する事にしました。
ホーム・ページ [ 楽釣119 ] では、今までの記事の内容を整理し、内容の不具合を修正し、又、記事の追加をして、ホーム・ページで公開しています。
  
___________________________________________________________________________________________________________________

2011年9月28日水曜日

delay タイムの使い方 / MPLAB IDE


プログラムを作成する時、タイミング等を合わせる為に wait time を挿入する事は良くある事です。
又、アッセンブラーでプログラムを作成するとなると、タイミング時間を入れる為にステップ数を計算してプログラムしなければなりません。
しかし、手計算でする為、間違いが良くあります。
ところで、C 言語でプログラムする時は、delay time の関数が用意されているので、それを利用することができます。設定は、簡単です。
次の一文を書いて、delay time の関数を使えるように宣言します。

  #define _XTAL_FREQ 4000000  // オシレータ周波数 4Mhzの場合

関数は、

  __delay(1000);    // 1000命令サイクル遅延する

  __delay_us(400);   // 400 μs( マイクロ秒 )遅延する

  __delay_ms(10);  // 10 ms ( ミリ秒 )遅延する

上記の3個があります。但し、制限が有ります。(上記の括弧内の数値は例です。)
それは、オシレータの周波数によって、ディレータイムに上限がある事です。
次の表を見て下さい。

動作周波数最大時間__delay_ms(x)__delay_us(x)
20Mhz39,424μs__delay_ms(39)__delay_us(39424)
16Mhz49,280μs__delay_ms(49)__delay_us(49280)
10Mhz78,848μs__delay_ms(78)__delay_us(78848)
8Mhz98,560μs__delay_ms(98)__delay_us(98560)
4Mhz197,120μs__delay_ms(197)__delay_us(197120)

それ以上のディレータイムが必要になる時は、 for 文、while文 などによるループ・プログラムを
作って実現するか、自分でループ・プログラムを作成してディレイ・タイマーを起動する等します。

又、 関数の括弧内に変数を使う事ができません。数値のみです。

次に、サンプル・プログラムを表示します。
このプログラムは、一定時間ごとにLEDランプなどを表示させる単純なプログラムです。
    
赤枠の中のプログラムを見て下さい。
10ms のディレイ・タイム遅延を行っています。これを while によって mt 回繰り返します。
  
wait_time(50);          // wait time = 10 * 50 =500 ms
  
    
又、for 文でプログラムする時は、 赤枠部分の文と、次の文を入れ替えて下さい。
    

どちらも同じように動作します。
これらのプログラムをコンパイルすると、どうなるかを比べて見みます。

while文の場合(プログラム・メモリー 59ワード)
  
 for 文の場合( プログラム・メモリー 66 ワード )


と、なります。

プログラム・メモリーの消費の仕方が違います。

小規模のプログラムでは、問題になりませんが、複雑なプログラムを作成する時に、このような
サブルーチンを多用するとプログラム・メモリーが不足してきます。
効率良くプログラムを作成する為に、普段から心がける事が必要です。

 [ 効率良くプログラミングする為のヒント ] 

プログラムで使用する変数のデータ型について、普段、気にしないで使われていると思います。
PIC マイコンがプログラム内の変数を参照するために、1 バイト・データ形式の場合、1 バイト分の領域を確保します。
又、4 バイト・データ形式の場合、4 バイト分の領域を確保します。
ところが、1バイト・データを扱っているのに、4バイト分の領域を確保するとどうなるでしょうか?・・・
それは、マイコンが4 バイトのデータを参照する事になり、時間が掛かります。
こんな事では、高速動作をさせたりする事が難しくなります。
又、プログラム・サイズも大きくなってしまいます。
   
unsigned int ・・・・;    4バイト幅のデータ型に宣言。実際は、1バイト幅のデータで済む・・・
  
unsigned char ・・・・;  この、1バイト幅のデータ型に宣言するのが正しい。           
   
そこで、扱うデータのサイズを正しく把握して、データ型を正しく宣言してプログラミングすることが必要です。

0 件のコメント: