CTCコントロール関係サンプル
| 記入例 | CTC番号 |
|---|---|
| CTC_0 | CTCNo0 |
| CTC_1 | (注)CTCNo1 |
| CTC_2 | (注)CTCNo2 |
| CTC_3 | CTCNo3 |
| 記入例 | 割り込みの設定 |
|---|---|
| INT_ON | 割り込みを行う |
| INT_OFF | 割り込みを行わない |
| 記入例 | プリスケーラの設定 |
|---|---|
| PS_16 | プリスケーラ(1/16) |
| PS_256 | プリスケーラ(1/256) |
(PS_16) 1 / 8000000 * 16 * 1000 = 0.002 ms (PS_256) 1 / 8000000 * 256 * 1000 = 0.032 ms上記の値を使用し、目的の時間にタイマー割り込みを発生させる為の時間設定レ ジスタの設定値を計算します。ここでは5msにします。まずは(PS_16)で行 います。
5 / 0.002 = 2500
時間設定レジスタの設定値は最大で255までですから(PS_16)ではだめだと
わかります。次に(PS_256)で計算します。
5 / 0.032 = 156.25
これで、(PS_256)で時間設定レジスタを(156)に設定すれば良いことがわか
ります。しかし、(0.25)の端数が出ていますからこの分が誤差となります、こ
の誤差をなくす為には基本クロックを2の乗数にする必要があります。
/*======================================================================*/
/* */
/* "AKI80" 8MHZ CTCドライバープログラム */
/* (ポートアドレスは、Z84C015 にあわせてあります。) */
/* */
/* void ctc_int(int ctc_no,int interrupt,int ps_set,int time_set) */
/* */
/* CPUクロック8MHzで約5msのタイマーにする場合 */
/* void ctc_int( CTC_0, INT_ON, PS_256,156) */
/* */
/* */
/* */
/* ctc_cnt.h Vr1.00 99/05/23 */
/* by Tomcat works */
/* */
/*======================================================================*/
#define CTC_0 0x0010 // CTCチャンネル0 i/o アドレス
#define CTC_1 0x0011 // CTCチャンネル1 i/o アドレス
#define CTC_2 0x0012 // CTCチャンネル0 i/o アドレス
#define CTC_3 0x0013 // CTCチャンネル1 i/o アドレス
#define INT_ON 0x0080 // タイマー割り込みオン
#define INT_OFF 0x0000 // タイマー割り込みオフ
#define PS_16 0x0000 // プリスケーラx16
#define PS_256 0x0020 // プリスケーラx256
void ctc_int(int ctc_no,int interrupt,int ps_set,int time_set);
void ctc_int(int ctc_no,int interrupt,int ps_set,int time_set)
{
#asm
ld hl,8
add hl,sp
ld c,(hl) ; CTC の i/o アドレスをセット
ld b,00010111B
ld hl,6
add hl,sp
ld a,(hl) ; CTC の割り込み設定をセット
or b
ld b,a
ld hl,4
add hl,sp
ld a,(hl) ; CTC のプリスケーラ設定をセット
or b
out (c),a ; CTC 制御レジスタをロード
ld hl,2
add hl,sp
ld a,(hl) ; CTC の時間設定をセット
out (c),a ; CTC 時間レジスタをロード
#endasm
}
startup.h (スタートアップファイル)
RAM_TOP EQU 08000h ORG 0000h DI LD SP,0000H ;スタックポインタ初期化 IM 2 ;割り込みモード設定 LD A,HIGH CTC_VECTER ;割り込みベクター設定 LD I,A ;上位 LD A,LOW CTC_VECTER AND 11111000B OUT (IO_CTC_C0),A ;CTCベクター設定 CALL __main __st_loop__: DI nop JR __st_loop__ ORG 0050H CTC_VECTER DW __inter_time0 DW DUMMY DW DUMMY DW DUMMY ORG 0066H JP 0000H ORG 00A0H DUMMY: EI RETI ORG 0100Hctc_test.c (サンプルCTCテストプログラム)
#include "aki80.h"
#include "ctc_cnt.h"
interrupt inter_time0( );
int flag;
int count;
main()
{
count = 0;
flag = 0;
ctc_int( CTC_0, INT_ON, PS_256,156); // CTC 初期化 (5ms)
out(IO_PIO_AC,0x0f); // PIO 出力モード設定
#asm
ei ; 割り込みの許可
#endasm
while( 1 ){
}
}
interrupt inter_time0( )
{
count ++;
if(count == 20) { // 100ms毎にポートA 8本反転する
if(flag == 0){
out(IO_PIO_AD,0xff);
flag = 1;
}
else {
out(IO_PIO_AD,0x00);
flag = 0;
}
count = 0;
}
}