プロが教えるわが家の防犯対策術!

マイコン Pic16F1939を使用して回路を組み、タイマ1を外部に取り付けた水晶で
動作させています(pic自体は内部オシレータで8MHzで動作させ、Timer1は正確な
1秒を取得するために使用しています)

使用している水晶は32768Hzの時計用のものです。

タイマ1が0.5秒ごとにオーバーフローするように設定し、割込みの関数で液晶の
点滅処理をおこなっています。

水晶の両端はそれぞれコンデンサが添付画像のような接続でつながっています。

また、関連部分のプログラムの抜き出しは以下のようになっています。

// 割込み処理
static void interrupt isr(void)
{
if (PIR1bits.TMR1IF) {// 32Khz水晶 割込み
Int_Timer1();
}

~ 省略 ~
}

// タイマー1割り込み(32khz水晶) : 0.5秒ごと
void Int_Timer1(void)
{

PIR1bits.TMR1IF = 0; // 次の割り込み許可のためクリア

// 0.5秒で次の割り込みが発生するように設定
TMR1H = 0b11000000;
TMR1L = 0b00000000;

    ~ 点滅処理 ~

    ~省略~

return;
}

そして以下の初期設定用関数
InitTimer1()と InitInterrupt()を main()の始めに呼んでいます。

// Timer1 setting 32kHz , external crystal
void InitTimer1(void)
{
T1CONbits.TMR1CS1 = 1;
T1CONbits.TMR1CS0 = 0;
T1CONbits.T1CKPS1 = 0;
T1CONbits.T1CKPS0 = 0;
T1CONbits.nT1SYNC = 1;
T1CONbits.T1OSCEN = 1;
T1CONbits.TMR1ON = 1;
}

// 割込み初期化
void InitInterrupt(void)
{
PIE1bits.TMR1IE=1; // enable timer 1 interrupt
INTCONbits.PEIE=1;
INTCONbits.GIE=1;
}


質問なのですが、実際に液晶が点滅するまでに2秒ほどかかっています。
どこかのホームページでタイマ1の水晶の発振が安定するまでに
数msecかかるというような情報が書いてあったので、ずいぶん
遅いなと感じ2つのコンデンサの容量を10pF~200pFくらいのあいだで色々
変更して試しているのですが、2秒より早く点滅開始となることはありませんでした。

これは、上記プログラムの問題なのでしょうか?

それとも2秒ほどかかって発振するのは仕方ない(Picの仕様)なのでしょうか?

どなたかご存知の方いらっしゃいましたらご回答をお待ちしております。

「picのタイマ1発振開始時間に関して」の質問画像

A 回答 (1件)

液晶表示器の初期設定が完了しないと、液晶がコマンドを受け付けてくれません、そのタイムラグでは?


液晶表示のように時間のかかる処理は割り込み処理内でなく、割り込み内でフラグを立て、メインループ内で液晶表示を行ったほうが良いと思います。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

起動時に
TMR1H = 0b11000000;
TMR1L = 0b00000000;

を代入せず、all 0からカウントアップしていたため、オーバーフローするまでちょうど
2秒かかっていたことが判明しました。

自己解決しました。

お礼日時:2012/08/07 22:13

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!