#pragma ADDRESS TA0IC 055h #pragma ADDRESS TABSR 380h #pragma ADDRESS TA0 386h #pragma ADDRESS TA0MR 396h static volatile unsigned char TA0IC, TABSR, TA0MR; static volatile unsigned short TA0; #pragma ADDRESS DACON 3DCh #pragma ADDRESS DA0 3D8h static volatile unsigned char DACON, DA0; /* 正弦波テーブル */ unsigned char wavetable[64] = { 128,140,152,165,176,188,199,209, 218,226,234,240,246,250,253,255, 255,255,253,250,246,240,234,226, 218,209,199,188,176,165,152,140, 128,115,103, 90, 79, 67, 56, 46, 37, 29, 21, 15, 9, 5, 2, 0, 0, 0, 2, 5, 9, 15, 21, 29, 37, 46, 56, 67, 79, 90,103,115 }; int offset; /* テーブルのオフセット */ /* TA0 割り込みルーチン */ #pragma INTERRUPT ta0intr void far ta0intr() { DA0 = wavetable[offset]; offset = (offset + 1) & 63; } /* メインルーチン */ void main(void) { /* 変数の初期化 */ offset = 0; /* DAC の設定 */ DA0 = 0; /* DA0 初期値 */ DACON = 1; /* DA0 を有効 */ /* タイマーの設定 */ TA0MR = 0x00; /* タイマーモード, fc1 */ TA0 = 250; /* 250 = 16000000 / 64000 */ TABSR |= 1; /* TA0 動作開始 */ TA0IC = 1; /* TA0 割り込みレベル = 1 */ /* 無限ループ */ for(;;); }