/************************************************************* AKI-H8/3664の共通関数ライブラリ (インクルードして使用する) LED2個が吸い込み3mA程度としてP86,P87に接続されているとする 1Nov2002 Copyright(c) Kosaka CS TNCT 4Dec2003 SCI_printf 更新 ************************************************************** 【1】ポートの入出力管理 void initPCR(void) write only register PCR設定用変数の初期化 【2】SCI 関係 void initSCI() SCIの初期化 38400baud, Async, 8bit , NoParity, stop1 short int getCharSCI() SCIから1byte文字コード(0より大)を取得して返す。エラーがあると-2を返す。 short int chkgetCharSCI() SCIを検査し,受信データがあれば1byte文字コードを返す。 なければ-1が,失敗すると-2を返す。 short int getIntSCI(char prompt[]) SCIからプロンプト付で,short intの値を受け取る。 正負の10進数または16進数を受け付ける。16進数は0xで始まる void putCharSCI(char c) SCIに1バイト出力する。 void putStringSCI(char *str) SCIに文字列を出力する。 void SCI_printf(char *format,...) 関数printfのSCI版 軽量化のためエラー処理はないので桁数指定の場合は注意 対応書式 %d : [int] integer with sign. '%d','%4d','%-4d', and '%04d' are available %ld : explicit [long int] '%ld','%9ld','%-9ld', and '%09ld' are available %u : [unsigbed int] unsigned integer. '%u','%4u','%-4u', and '%04u' are available %lu : explicit [unsigned long int] '%lu','%9lu','%-9lu', and '%09lu' are available %x : [unsigned int] in Hex '%x','%4x','%-4x', and '%04x' are available %lx : explicit [unsigned long int] in Hex '%lx','%8lx','%-8lx', and '%08lx' are available %o : [unsigned int] in Oct '%o','%4o','%-4o', and '%04o' are available %lo : explicit [unsigned long int] in Oct '%lo','%8lo','%-8lo', and '%08lo' are available %b : [unsigned int] in Bin '%b','%8b','%-8b', and '%08b' are available %lb : explicit [unsigned long int] in Bin '%lb','%8lb','%-8lb', and '%08lb' are available %c : char %s : string %20s %-20s are available 【3】TimerAを利用したタイマー割り込み 割り込み関数の名前は void interrupt_cfunc(void)で,これは startup3664.mar中で決まっている。 void initTimerAInt(short int n) TimerAを利用したタイマー割り込み初期化  引数nの値とタイマー割り込み周波数   7 7812.5[Hz]   6 1953.125[Hz]   5 488.28125[Hz]   4 244.140625[Hz]   3 122.0703125[Hz]   2 30.51757813[Hz]   1 15.25878906[Hz]   0 7.629394531[Hz] void startTimerAInt(void) TimerAを利用したタイマー割り込みスタート void stopTimerAInt(void) TimerAを利用したタイマー割り込みストップ 【4】TimerWを利用したPWM出力を2系統出力  GRAを周期レジスタ,GRBとGRCを比較対象レジスタとして用いる  出力は端子FTIOBとFTIOCにでてくる  周期カウンタは2MHzでカウント(φ/8) void initTimerWPWM(unsigned short int period)  TimerWPWMの初期化 「period×0.5μsec」がPWM信号周期となる void setPWMValueB(unsigned short int value)  B系統PWM値のセット 0<=value<=period  デューティ比のセット。何回でも変更できる void setPWMValueC(unsigned short int value)  C系統PWM値のセット 0<=value<=period  デューティ比のセット。何回でも変更できる 【5】ADCシングルモード(ch=0,1,2,3,4,5,6, or 7) 初期化はない  unsigned int getADCValue(int ch)  指定したチャンネルのAD変換結果(サンプルデータ)を返す。  値の範囲は0〜1023 【6】ADCスキャンモード(ch=0から0,1,2,3まで) void initScanADC(int ch)  ADCスキャンモード チャネル0からchまで連続変換設定 unsigned int getADCValue0(void)  チャネル0のサンプルデータの取得 unsigned int getADCValue1(void)  チャネル1のサンプルデータの取得 unsigned int getADCValue2(void)  チャネル2のサンプルデータの取得 unsigned int getADCValue3(void)  チャネル3のサンプルデータの取得  ADCは16ビットレジスタの上位10ビットが有効なため,  この関数の返す値の範囲は0〜0xFFC0である  この関数の返した値を右に6シフトすると,範囲は0〜1023である  この関数の返した値を右に8シフトすると,範囲は0〜255である 【7】LED void initLed(void)  LEDの初期化  ポート8の第6,第7ビット void turnOnLed(short int number)  LED点灯 番号は0 or 1 void turnOffLed(short int number) LED消灯 番号は0 or 1 *************************************************************/ #include #include "3664f.h" /*IOの向きを決めるレジスタ*/ unsigned char PCR1=0,PCR2=0,PCR5=0,PCR7=0,PCR8=0; /* void initPCR(void) { PCR1=PCR2=PCR5=PCR7=PCR8=0; } 以前のバージョンとの互換性のため */ #define initPCR() /*シリアル通信の初期化 38400baud */ void initSCI(void) { short int i; IO.PMR1.BIT.TXD=1; SCI3.SCR3.BYTE=0; /*すべてのflag clear*/ SCI3.SCR3.BIT.CKE=0; /*内部クロック使用*/ SCI3.SMR.BYTE=0; /*Async, 8bit , NoParity, stop1, 1/1*/ SCI3.SMR.BIT.CKS=0; /*16MHz: 2400-38400baud*/ SCI3.BRR=12; /*2400=>207 4800=>103 9600=>51 1920=>25 38400=>12*/ for(i=0;i<1000;i++); /* wait more than 1bit time */ SCI3.SCR3.BYTE = 0x30; /* scr = 0011 0000 (TE=1,RE=1) */ } /*SCIより1byte取り込み*/ short int getCharSCI() /* return value 0x00-0xFF:received data */ /* -2(0xFFFE):error */ { short int flags,recdata; do { flags = SCI3.SSR.BYTE; if (flags&0x38) {/* error */ SCI3.SSR.BIT.RDRF = 0; SCI3.SSR.BIT.OER = 0; SCI3.SSR.BIT.FER = 0; SCI3.SSR.BIT.PER = 0; return -2; } if (flags&0x40) {/* normally received one data */ recdata=SCI3.RDR; return recdata; } } while (1); } /*SCIをチェックしてデータがあったら1byte取り込み*/ short int chkgetCharSCI() /* return value -1(0xFFFF):no received data */ /* 0x00-0xFF:received data */ /* -2(0xFFFE):error */ { short int flags,recdata; flags = SCI3.SSR.BYTE; if (flags&0x38) {/* error */ SCI3.SSR.BIT.RDRF = 0; SCI3.SSR.BIT.OER = 0; SCI3.SSR.BIT.FER = 0; SCI3.SSR.BIT.PER = 0; return -2; } if (flags&0x40) {/* normally received one data */ recdata=SCI3.RDR; return recdata; } else { return -1; } } /*SCIへ1byte出力*/ void putCharSCI(char c) { if (c=='\n') putCharSCI('\r'); while(SCI3.SSR.BIT.TDRE==0); SCI3.TDR = c; } /*SCIへ0終端を持つ文字列出力*/ void putStringSCI(char *str) { while(*str) putCharSCI(*str++); } /*SCIより文字列入力[return]が終端だが,'\n'は取得されない*/ /*^Hでバックスペイス*/ int getStringSCI(char *buff,int max) { int i,ch; for (i=0;i