3/2011
34/49

v1=onT/1000; v2=onT % 1000; v3=off T/1000;v4=off T % 1000; for(i=0;i<16;i++){//------------------------------// ボリュームでサーボを動かすプログラム// <×正常動作しない版×>// programed by Mikiya Niitsuma//------------------------------#include <12F675.h>#device ADC=10#fuses INTRC_IO,NOWDT,NOPROTECT,NOMCLR,BROWNOUT#use delay (clock=4000000)#byte RA=5#bit sig = RA.5 //サーボへの信号#bit Analog = RA.0//アナログポートからの信号#bit LED_r = RA.1//赤LED#bit LED_g = RA.2//緑LED#bit sw_1 = RA.3//赤スイッチ#bit sw_2 = RA.4//緑スイッチvoid main() { long int value,onT,off T,shuki=14250; byte i,v1,v2,v3,v4; set_tris_a(0x19);//01,1001 GP1,GP2,GP5が出力ポート、他は入力に設定 setup_adc_ports(NO_ANALOGS); setup_adc_ports(AN0_ANALOG);//ポート0をアナログに設定 setup_adc(ADC_CLOCK_INTERNAL);//ADCのクロックを内部クロックに設定 while(1){ set_adc_channel(0); //ADCを読み込むピンを指定 delay_us(40); value = read_adc(); //読み込み onT=948+value; off T=shuki-onT; sig=1; delay_ms(v1); delay_us(v2); sig=0; delay_ms(v3); delay_us(v4); } }} しかし、上記プログラムでは、正しい動作はしてくれません。まず、注意すべき点は、delay_ms()やdelay_us()などのカッコ内には、変数は使えてもその変数は1バイト型(PICCの場合は、intかbyte)しか使うことができないということです。直値では、delay_ms()は65535、delay_us()は、1000までは、指定できるのですが。 1バイト変数しか使えないということは、符号なしの数値でも、結果的には0から255までしか与えることができません。delay_ms()の方は255を超えない範囲なので問題ないのですが、delay_us()の方は、1〜999までの数値の入る可能性があります。プログラムでは、v1〜v4までを規定どおりbyte型でとって当てていますが、問題は残ったままです。では、v2,v4をlong型にして当てればいいのかというと、それもだめです。とにかく、( )内の変数は1バイト型と決まっているからです。このような問題に直面することはよくあることです。そんな場合の鉄則は、「別な記述で対応することはできないか?」を考えることです。自分で関数を作れば別ですが、用意されていない関数を使うことはできません。従って、用意されている関数は使うが、何らかの工夫をするということです。その工夫したプログラムが次のようなものです。//------------------------------// ボリュームでサーボを動かすプログラム// (正常動作版)// programed by Mikiya Niitsuma//------------------------------技能と技術 3/2011−32−

元のページ  ../index.html#34

このブックを見る