タイマーの設定
今回はTimer2を用いて割り込みをかけるので、Timer2の設定を行います。表261.1にある組み合わせであればどれでも良いのですが、ここでは62.5 usecの割込みを入れ、割込みルーチン内で4回の*REFCKを発行するものとします。
まず、図263.1のようにモジュール設定でIntterrupt moduleを選択し(①)、右の画面でTMR2をイネーブル(②)とします。
図263.1 Interrupt module
最後にタイマーの設定を行います。モジュール設定でTMR2を選択(①)します。周期に62.5 usと記入(②)します。プリスケーラ、ポストスケーラとも1:1(③)とします。割込み何回に一回コールバックするかを設定(④)します。
図263.2 TMR2 module
コード生成
これで設定が完了したので、Generateでコード生成を行います。様々なCソースやヘッダファイルが生成されます。例えば、device.cが生成され、その内容は、
となっています。次にinterrupt_manager.cの内容は、
のように、TMR2_ISR()を呼び出しています。mcc.cは各種初期化関数の集合であり、
となっています。pin_manager.cは、
のように、ピン(ポート)の設定です。最後にtmr2.cはtimer2の各種関数の集合であり、左下のNavigatorウインドウに生成された関数一覧が確認できます。ここでは、
- TMR2_CallBack()
- TMR2_DefaultInterruptHandler()
- TMR2_ISR()
- TMR2_Initialize()
- TMR2_InterruptHandler
- TMR2_LoadPeriodRegister(uinit8_t periodVal)
- TMR2_ReadTimer()
- TMR2_SetInterruptHandler(void(*InterruptHandler)()
- TMR2_StartTimer()
- TMR2_StopTimer()
- TMR2_WriteTimer(uint8_t timerVal)
が生成されました。interrupt_managerからTMR2_ISR()がコールされ、そこからTMR2_CallBack()がコールされ、そこではTMR_InterruptHandler()がコールされます。
ISR
以下のコメント部が示すように、TMR2_DefaultInterruptHandlerに割込み処理を書くようです。以下に内容を示します。
前稿での割込み処理内容は
もしZ80W=Lなら
- Rfreq=H、Xrefck=Hを出力 //リフレッシュ要求
- Rfgnt=Hを待つ
- Rfreq=H、Xrefck=Lを出力
- Rfreq=H、Xrefck=Hを出力 (3, 4を4回繰り返す)
- Rfreq=L、Xrefck=Hを出力
- リターン
であったので、そのままプログラムします。以下のピン名から始まる各種の関数はマクロとして、生成されたpin_manager.hで定義されています。
TMR2_Initialize()の内容は、
のようになっています。また、main()は、
のように、初期設定がされているため、以下のようにタイマーの開始を追加します。while ループ内の処理はありません。
前のブログ
次のブログ