CTCコントロール関係サンプル

(Mini-c 関数の作成)

ここでは、CTCを割り込みプログラムを使用して簡単なタイマーを つくります。
まず [ ctc_cnt.h ] としてCTCの初期化の関数を作ります。この 中は、関数 ctc_int( ) という関数が1個だけで、この関数はCTC の初期化を行い内部クロックを使用してタイマーとしての動作を開始させます。

ctc_int(int ctc_no,int interrupt,int ps_set,int time_set)

引数の説明をします。

第一引数 ctc_no(CTC番号の指定)

記入例CTC番号
CTC_0 CTCNo0
CTC_1 (注)CTCNo1
CTC_2 (注)CTCNo2
CTC_3 CTCNo3

  注. CTCのNo1とNo2はシリアルインターフェイスでも使用しています
     同時に使用しないでください。

第二引数 interrupt(割り込み使用するかしないかの設定)

記入例割り込みの設定
INT_ON 割り込みを行う
INT_OFF 割り込みを行わない

第三引数 ps_set(プリスケーラの設定)

記入例プリスケーラの設定
PS_16 プリスケーラ(1/16)
PS_256 プリスケーラ(1/256)

第四引数 time_set(時間設定レジスタの設定)

  0から255までの10進数で設定します。



次にプリスケーラと時間設定レジスタの計算方法でが、まず時間設定レジスタの 値が1だけカウントダウンする時間をプリスケーラの設定が1/16と1/256でそれ ぞれ計算を行います、なお基本クロックを8MHzとします。

    (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の乗数にする必要があります。
また、8MHzの基本クロックでは最大約8msまでとなります。サンプルとし て5msのタイマーを割り込み処理プログラムで回数をカウントを行い100ms ごとにI/Oポートの出力を反転させるプログラムを作ります。

目次に戻る

ctc_cnt.h         (CTCコントロールファイル)
/*======================================================================*/
/*									*/
/*	"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	0100H




ctc_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;
    }
}



目次に戻る