3

リアルタイムクロックを使用して15分ごとにアラームを設定する必要があります(00:15、00:30、00:45、01:00、...)いくつかのプロセスを実行してから、新しいアラーム値を設定します。さて、私はコードを書きました。クロックを実行するのはうまくいきます。しかし、周期アラームは発生しません。

コードに関するフィードバックをお寄せいただければ幸いです。

void rtc_init(void)
{
  RTCCTL01 = RTCMODE + RTCTEVIE + RTCTEV_0;
  RTCCTL01 |= RTCHOLD;
  RTCSEC =  0x00;                       
  RTCMIN =  0x28;                       
  RTCHOUR = 0x12;                       
  RTCDOW =  0x05;                       
  RTCDAY =  0x1A;                       
  RTCMON =  0x08;                      
  RTCYEAR = 0x07DB;                    
  RTCAMIN = timer;
  RTCCTL01 &= ~RTCHOLD;
  __enable_interrupt();
}

#pragma vector=RTC_VECTOR

__interrupt void handle_rtc_interrupt(void)
{
    switch(__even_in_range(RTCIV,8))
    {                
    case 6:
           get_fix();
           timer += timer;
           if (timer == 60) timer = 1;
           RTCAMIN = timer;
           RTCCTL1 &= ~RTCHOLD;
           break;
    }//switch
}//ISR
4

1 に答える 1

2

少なくとも、分が一致したときにアラームが鳴るようにするには、RTCAMIN レジスタの AE ビットを設定する必要があります。

RTCAMIN = AE | (timer & 0x7F);

また、1 分ごとにイベント割り込みが発生するように選択されているようです (「RTCCTL01 = RTCMODE + RTCTEVIE + RTCTEV_0;」)。これは、使用したいと思われるユーザー プログラム可能なアラームとは異なります。アラーム割り込みビットを設定する必要があります。

RTCCTL01 = RTCMODE + RTCTAIE;

タイマー値をインクリメントする方法は、15 分ではなく、毎回 2 倍になるため、正しくありません。ISR でこれを使用する必要があります。

timer += 15;

この期間を変更する必要がある場合は、2 つの変数が必要になります。1 つは新しいタイマー値を保存するためのもので、もう 1 つはアラームの期間を保存するためのものです。レジスタを使用してタイマー値を保存することができるため、次のようになります (「タイマー」がユーザーが必要とするアラームの期間であると仮定します)。

next_timer = RTCAMIN & 0x7F;
next_timer += timer;
if (next_timer) >= 60
{
    next_timer -= 60;
}
RTCAMIN = AE | (next_timer & 0x7F);

タイマーが 60 に達したら、タイマーを 1 ではなく 0 に再設定する必要があります。そうしないと、xx:00:xx xx:15:xx xx:30:xx xx:45:xx xx:01:xx xx でアラームが鳴ります。 :16:xxなど

タイマー変数で 60 分間を正確に比較するべきではありません。それほど問題ではありませんが、上記の他の 2 つのバグがあれば、2 回目の反復で正確に 60 になることはありません。また、60 がアラーム期間で正確に割り切れない場合は、60 を超えて、正確なタイミングを維持するために特定の値に設定するのではなく、減らす必要があります。安全のためにこれを行う必要があります。

if (timer >= 60) timer -= 60;

最後に、データシートには、アラーム値の変更中はアラーム割り込みフラグを無効にする必要があると記載されています。ISR でそれを行うことを忘れないでください。

その他の確認事項は次のとおりです。

  • RTCの更新を停止する低電力モードに入っていないことを確認してください
  • 結合されたレジスタ RTCCTL01 に正しい定義を使用し、個々のレジスタ (RTCCTL0) 用の定義と混合していない

部品番号をまだ教えていただいていないため、割り込みが正しいかどうかはわかりません (そうあるべきであるように見えます)。

于 2011-08-30T09:45:16.430 に答える