• 締切済み

H8マイコンのシリアル通信について。

H8マイコンでのシリアル通信についてお聞きしたいことがあります。 現在PCとマイコン(H8/3052F)をRS32Cでシリアル通信ができています。 今回は有線ではなく無線(Bluetooth)を利用してシリアル通信が行いたく、RBT-001というものを購入しました。 そのマニュアルには一番簡単に通信する方法としてPICマイコンとの例が挙げられており、要するに初期設定さえすれば無線を意識せずに使えるとの事だったのですが、どうも出来ていないみたいです。 --------------------私のプログラム---------------------- #include<3052.h> void initSCI1 (void){ int i; SCI1.SCR.BYTE = SCI1.SMR.BYTE = 0;//初期値は0、本文参照 SCI1.BRR = 80; //ビットレート for (i = 0; i <4000; i++) ; //待つ SCI1.SCR.BYTE = 0x30; //受信割り込み許可、送受信許可 SCI1.SSR.BYTE; //ダミーリード SCI1.SSR.BYTE = 0x80; //エラーフラグクリア } //1文字受信 char SCI1_IN_d(void){ //受信文字を返す。 unsigned char c; //受信データの格納変数 while (!(SCI1.SSR.BYTE & 0x78)); //受信またはエラーフラグが立つまで待つ if (SCI1.SSR.BIT.RDRF == 1) { //受信完了なら c = SCI1.RDR; //データを取り出す。 SCI1.SSR.BIT.RDRF = 0; //受信フラグクリア } else { SCI1.SSR.BYTE &= 0x80; //エラーならエラーフラグクリア c = 0; } return c; } //1文字送信 void SCI1_OUT_d(char c) //文字コードを受け取る。 { while (SCI1.SSR.BIT.TDRE == 0); //0でデータあり、1になるまで待つ。 SCI1.TDR = c; //受け取った文字を送信 SCI1.SSR.BIT.TDRE = 0; //TDREビットをクリア } //BLUETOOTH初期設定 void BT_Init(void){ SCI1_OUT_d(0x02); SCI1_OUT_d(0x52); SCI1_OUT_d(0x4E); SCI1_OUT_d(0x01); SCI1_OUT_d(0x00); SCI1_OUT_d(0xA1); SCI1_OUT_d(0x03); SCI1_OUT_d(0x03); return; } int main (void){ unsigned char rd; BT_Init(); initSCI1(); while(1){ rd=SCI1_IN_d(); SCI1_OUT_d(rd); } } ------------------------------------------------------------ 問題はmain文中「initSCI1();」でSCI1を初期化するとズット変な文字化けみたいなのを延々と吐き出して、逆に初期化しないとPCでなんらかのキーを押すとRBT-001は点滅はするけど、文字を返してこないという状況です。 なので「initSCI1();」がおかしいのかと思うのですが、有線では現にこれで出来ているのでなにが原因かわかりません。 良かったらどこがダメでどうするべきか教えてください。 本当に困っています。よろしくお願いします。 通信速度9600bps データ長8ビット長 ストップピット1 パリティ無 CPU最高動作周波数25MHz -------------------RBT-001マニュアルに記載されているサンプルプログラム------------------------- char text; void BT_Init(); void MPU_Init(); int TRISB,ANSEL,ANSELH; int _LCD_FIRST_ROW,_LCD_CURSUR_OFF,_LCD_CLEAR; void main(){ MPU_Init(); BT_Init(); while(1){ if(Uart1_Data_Ready()){ text = Uart1_Read(); Uart1_Write(text); Lcd_Chr_Cp(text); } } } void MPU_Init(){ TRISB = 0; ANSEL = 0; ANSELH = 0; Uart1_init(9600); Lcd_Init(); Lcd_Cmd(_LCD_FIRST_ROW); Lcd_Cmd(_LCD_CURSUR_OFF); Lcd_Cmd(_LCD_CLEAR); return; } void BT_Init(){ Uart1_Write(0x02); Uart1_Write(0x52); Uart1_Write(0x4E); Uart1_Write(0x01); Uart1_Write(0x00); Uart1_Write(0xA1); Uart1_Write(0x03); Uart1_Write(0x03); return; } -------------------------------------------------------------------

みんなの回答

回答No.3

No.2 です。 おそらく RBT-001 の初期化ができていないです。 まず、初期化の際、RBT-001 に渡している(暗号のような)データの意味を確認してください。 その中で、シリアル側の通信条件を決めているはずです。 また、(初期化の際に、通信条件を決める以前の)RBT-001の、デフォルトの通信条件があるはずです。 ・RBT-001 の正しい(デフォルトの)通信条件で H8の通信条件を設定して ・正しく、(アプリケーションで使いたい)通信条件を設定して、初期化し ・その後で、H8の通信条件をアプリケーションで使う条件に再設定する という手順で良いのではないかなと主ます。

回答No.2

単純に BT_Init(); initSCI1(); の順序が逆な気がしますが。 あるいは、 RBT-001 の初期化というのは、ソースを見ると、RBT-001にたいする、シリアル通信で初期化コマンド(か?)の送信で行っているわけですよね。 そのためには、事前に、H8側の通信設定が、RBT-001の通信条件と合致する必要があるわけですので、 ・RBT-001の初期化時点の通信条件は、RBT-001の条件と合っているか? ・それが合っているとしたら、RBT-001を初期化した後で(通信ができた後に)H8側の通信条件を変更していることになりますから、動作時には、RBT-001とH8の通信条件が合っていないことになります。

FET100w
質問者

補足

ありがとうございます。さっそく逆にしてみたところ、変な文字化けみたいなのは吐き出さなくなりました。 しかし、同じようにキーを押すと点滅はするけど返ってこないという状況です。 やはり初期設定が違うのでしょうか・・・・

回答No.1

H8とRBT-001では電圧が違いますが変換していますか?

FET100w
質問者

補足

はい。マイコンの5Vから80FG990というやつを介して3Vにしています。

関連するQ&A

専門家に質問してみよう