適当な水晶から任意の信号が作れる!
Timer1とCCPを使って適当な周波数を作れます。Timer1は16bitの指定(0-65535)が出来るので細かく設定が出来ます。
水晶を発振させ、その周波数はPICでは初め1/4に分周され内部クロックとして使われます。Timer1のプリスケラーは1:1から1:8まで指定出来るので、これを利用し合わせて1/65535を使うとかなり細かく周波数を指定出来ます。
例えば、TV用の3.579545MHzを使うと1/4・1/8・1/55930の組み合わせで0.5Secの信号が取り出せ、これでLEDを点滅させると丁度1Sec(秒)の点滅となります。
最後の1/55930は逆算で求めました。設 定
1回だけの場合はTimer1の設定で可能ですが、割り込みの再設定が出来ない場合(処理が間に合わない)このCCPの組み合わせを使うと、連続的に割り込み動作をさせることが出来ます。
動作はクロック信号をTimer1でカウントし、CCPで設定されている周波数に達するとマッチ信号が出て、Timer1がリセットされまた、割り込みが発生し設定の処理をさせる事が出来ます。
割り込みは通常に発生しますから、周波数カウンター・距離計・タイマーの基準周波数用に使えます。水晶ですから5-6桁は信用出来ます。温度コントロールをしてやれば更にもう1桁は期待出来そうです。
* 適当な水晶で目的の時間を得る。 ここではカラーTVの水晶を使って1Sec(2Hz)を取り出した。 3.579545MHz /4/8/55930=0.5S PIC16F88 2009/2/25 */ void interrupt() { PIR1 &=~(1 <<CCP1IF); PORTB.F3=~PORTB.F3; } void main() { CMCON=0b00000111; //コンパレータ OFF ANSEL=0; TRISA=0xFF; //input TRISB=0; PIE1 |=(1<<CCP1IE); PIR1 &=~(1<<CCP1IF); CCP1CON=0b00001011; CCPR1L=0x73; // 55930 CCPR1H=0xDA; T1CON.TMR1CS=0; T1CON |=(1<<T1CKPS0); T1CON |=(1<<T1CKPS1); T1CON |=(1<<TMR1ON); INTCON |=(1<<PEIE); INTCON |=(1<<GIE); //Interrupt on // while(1){ //Loop } }
[利 用]
当初の目的は周波数カウンターです。手元でゴロゴロしている水晶は用途が決まっていて他に流用出来ません。
いつもあれこれ使えると良いなーと思っていました。
この方式で水晶が使えるので得した感じです、TIMER1・Timer2が付いているPICなら動作するので用途が広まりました。これからはジャンクの水晶が色々なセットに再利用出来そうです。
誤差に付いては周波数を決めてから分周を補正するか、水晶発振周波数を調整して合わせる事も出来ます。
[写真のLEDの位置をミスして基板下の配線を長くしています。]
[実 験]
とりあえず発振が正常に動作するかLEDの点滅をさせて見ました、結果は1秒間隔で点滅をしています。正確に調べたわけではありませんが「腕時計で1分間ずれないで点滅していた」のでOKとしました。
実は初め、水晶発振が正常でなく36KHzぐらいで発振しえらく遅くなりました。初め発振しない!と思っていましたが1分ぐらい過ぎてから、動きに気が付きました。
Cが多かったのか、結局22P+22Pから10PF+10PFに変更して正常になった。
もしかして、35795.45Hzで発振していたのかも!という事はこの発振も積極的に使える・・・(3/28)。2009/MAR/3