//========================================================== // My function // for AKI-H8(AE-3052F) CPU Board // // Copyright (c) 2004 Kazuo Mzuno //========================================================== //************************************************* //シリアル通信と文字列操作は(株)ベストテクノロジーのサンプルコードを流用しています // http://www.besttechnology.co.jp/index.htm // // SCIO シリアル通信(RS232C) // データビット  8bit // パリティビット なし // ストップビット 1bit // フローコントロール なし //************************************************* typedef enum { brt4800 = 162, brt9600 = 80, brt19200 = 40, brt38400 = 19, brt57600 = 13 } SBaudRate; // 初期化 ---------------------------- void SCI0_init (SBaudRate b) { int i; SCI0.SCR.BYTE = SCI0.SMR.BYTE = 0; //データ-8bit パリティービット-なし ストップビット-1bit SCI0.BRR = b; // ボーレート for (i = 0; i < 3000; i++) ; // 待つ SCI0.SCR.BYTE = 0x30; // 送受信許可 SCI0.SSR.BYTE; // ダミーリード SCI0.SSR.BYTE = 0x80; // エラーフラグクリア } //1文字送信 ------------------------ void SCI0_out_Char (char c) { while (SCI0.SSR.BIT.TDRE == 0) ; SCI0.TDR = c; SCI0.SSR.BIT.TDRE = 0; } // 文字列送信 ---------------------- void SCI0_out_String (char *st) { while (*st) SCI0_out_Char(*st++); } // 受信バッファチェック----------------- int SCI0_in_Check (void) { return ((SCI0.SSR.BYTE & 0x78) != 0) ; } // 1文字受信------------------------------ char SCI0_in_Char (void) { char c; while (!SCI0_in_Check ()) ; // 受信バッファ|エラーフラグ待 if (SCI0.SSR.BIT.RDRF == 1) { c = SCI0.RDR; // データ取り出し SCI0.SSR.BIT.RDRF = 0; // 受信フラグクリア } else { SCI0.SSR.BYTE &= 0x80; // エラーフラグクリア c = 0; } return c; } //************************************************* // SCI1 シリアル通信(RS232C) //************************************************* // 初期化 ---------------------------- void SCI1_init (SBaudRate b) { int i; SCI1.SCR.BYTE = SCI1.SMR.BYTE = 0; SCI1.BRR = b; // ボーレート for (i = 0; i < 3000; i++) ; // 待つ SCI1.SCR.BYTE = 0x30; // 送受信許可、受信割り込み許可 SCI1.SSR.BYTE; // ダミーリード SCI1.SSR.BYTE = 0x80; // エラーフラグクリア } //1文字送信 ------------------------ void SCI1_out_Char (char c) { while (SCI1.SSR.BIT.TDRE == 0) ; SCI1.TDR = c; SCI1.SSR.BIT.TDRE = 0; } // 文字列送信 ---------------------- void SCI1_out_String (char *st) { while (*st) SCI1_out_Char(*st++); } // 受信バッファチェック----------------- int SCI1_in_Check (void) { return ((SCI1.SSR.BYTE & 0x78) != 0) ; } // 1文字受信------------------------------ char SCI1_in_Char (void) { char c; while (!SCI1_in_Check ()) ; // 受信バッファ|エラーフラグ待 if (SCI1.SSR.BIT.RDRF == 1) { c = SCI1.RDR; // データ取り出し SCI1.SSR.BIT.RDRF = 0; // 受信フラグクリア } else { SCI1.SSR.BYTE &= 0x80; // エラーフラグクリア c = 0; } return c; } //-----------プログラミング例--------------------------------------------- // SCI1_init (brt19200); 通信ポートを初期化 ボーレートは19200[bps] // SCI1_out_Char ("b"); 1文字送信 // SCI1_out_String ("Well come to R2D2 world!\n\r"); 文字列送信 //------------------------------------------------------------------------ //*********************************************** // 文字列操作 //*********************************************** // WORD->16進数文字列変換--------------------------- char *IntToHex (long v, _BYTE len, char *s) { char hex[] = "0123456789ABCDEF"; // 16進数文字列リスト s[len--] = 0; do { s[len] = hex[v & 0xf]; v >>= 4; } while (len--); return s; } // int->10進数文字列変換----------------------------- //char *IntToDec (long v, _BYTE len, char *s) { char *IntToDec (int v, _BYTE len, char *s) { int i; int f; f = v < 0; // v = abs(v); for (i = 0; i < len; i++) s[i] = ' '; s[len--] = 0; do { if (v < 10) break; s[len] = (v % 10) + '0'; v /= 10; } while (len--); s[len--] = v + '0'; if (f) s[len] = '-'; return s; } // WORD->2進数文字列変換-------------------------------- char *IntToBin (long v, _BYTE len, char *s) { char bin[] = "01"; // 2進数文字列リスト s[len--] = 0; do { s[len] = bin[v % 2]; v = v / 2; } while (len--); return s; } //************************************************** // その他 //************************************************** // ウェイト ---------------------------- void wait(unsigned long s) { while(s--) {} } // ウエイト 1ミリ秒 ( ITU3 ) ---------------------------- void wait_ms(int ms) { if (ITU3.GRA!=3125) { ITU3.TCR.BYTE=0xa3; /* コンペアマッチ クロックφ/8 */ ITU3.GRA=3125; /* 割り込み時間 1ms */ ITU3.TIER.BIT.IMIEA=0; /* コンペアマッチ割り込み無し */ } ITU.TSTR.BIT.STR3 = 1; /* カウント開始 */ while(ms--){ while(ITU3.TSR.BIT.IMFA == 0) { } /*TCNT=GRAになったとき IMFA==1*/ ITU3.TSR.BIT.IMFA = 0; } ITU.TSTR.BIT.STR3 = 0; /* カウント終了 */ }