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