重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【GOLF me!】初月無料お試し

32.768KHzの水晶をOSI/OSO端子につなげてタイマー1のT1CONで外部クロック入力を設定しましたがデバッグ用にRA0にLEDを付け点滅させるようにしましたが、
何故か水晶を外してコンデンサがついてるだけの状態にしても約0.5Hzで動きます。
どこがおかしいのでしょうか。
よろしくお願いします。
以下抜粋

void interrupt InterTimer( void ){

if (TMR1IF == 1) { // タイマー1の割込み発生か?
TMR1H = (T1INIT >> 8) ; // タイマー1の再初期値設定
TMR1L = (T1INIT & 0x00ff) ;
TMR1IF = 0 ; // タイマー1の割込フラグをリセット

second++;
if(LEDflg == 0){
LEDflg = 1;
}else{
LEDflg = 0;
}

if (second >= 60) {
Minits ++;
second = 0;

if (Minits >= 60) {
Hours ++;
Minits = 0;

if (Hours >= 24) {
Hours = 0;
}
}
}
}

void main(){
OSCCON = 0b01110010 ; // 内部クロックは8MHzとする
ANSELA = 0b00000000 ; // AN0-AN4は使用しない全てデジタルI/Oとする
ANSELB = 0b00000000 ; // AN8-AN13は使用しない全てデジタルI/Oとする
TRISA = 0b00000000 ; // ピン(RA)は全て出力に割当てる(0:出力 1:入力)
TRISB = 0b01110000 ; // ピン(RB)は全て出力に割当てる
TRISC = 0b00000000 ; // ピン(RC)は全て出力に割当てる
PORTA = 0b00000000 ; // RA出力ピンの初期化(全てLOWにする)
PORTB = 0b00000000 ; // RB出力ピンの初期化(全てLOWにする)
PORTC = 0b00000000 ; // RC出力ピンの初期化(全てLOWにする)

T1CON = 0b10011101; // 外部クロック(32.768KHz)でTIMER1をカウントする、プリスケーラカウント 1:2
TMR1H = (T1INIT >> 8); // タイマー1の初期化
TMR1L = (T1INIT & 0x00ff);
TMR1IF = 0; // タイマー1割込フラグを0にする
TMR1IE = 1; // タイマー1割り込みを許可する
while(1) {
if(LEDflg == 0){
RA0 = 1;
}else{
RA0 = 0;
}
}

A 回答 (1件)

ちょっと不確かなんですが・・・


16F1933は32.768KHzの水晶発振回路とは別に31KHzの内部発振回路を持っています。
32.768KHzの水晶発振回路を使っているつもりが31KHzの回路につながっていませんか?
この発振回路はマニュアルでは LFINTOSC とか 31kHz と書いてあります。これを追ってみてください。
はっきり確認していないのですが水晶発振回路が停止した時には自動的に31KHzの発振回路に切り替わるのかもしれません。
関係するレジスタがクロック発振関係だけでも OSCCON のほか、CONFIG1、同2 というレジスタが関係します。CONFIG1、2 はどちらも14ビットの特殊レジスタで、ソフトで設定するのではなくソースリストの最初あたりで宣言するようになっていると思います。確認してください。
マニュアルを見直したのですが関連が複雑なので最後までフォローしていません。
以上でご勘弁を。
    • good
    • 1

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