H8SマイコンでUARTを115.2kに設定したい

このQ&Aのポイント
  • H8S2368マイコンとwifi通信モジュールのESP-WROOM-02をUART通信で接続するために、SCI0の設定を変更したい。
  • 現在、SCI0の通信速度が38.4kbpsであり、ESP-WROOM-02の初期通信速度が115.2kbpsであるため、通信速度を一致させる必要がある。
  • SCI0のBRRレジスタの値を下げることで通信速度を上げることができるが、正確な計算方法が知りたい。
回答を見る
  • ベストアンサー

H8SマイコンでUARTを115.2kに設定したい

現在、H8S2368マイコンとwifi通信モジュールであるESP-WROOM-02をUART通信で接続するためにプログラムを作成しています。 H8S2368のSCI0のUARTでESP-WROOM-02とをつなぎました。 とりあえずSCI0から”AT”というコマンドを出したのですが、wifiモジュールから”OK”という回答が戻ってきません。 原因を調べてみると、H8S2368のSCI0は38.4kbpsで出力していて、ESP-WROOM-02は初期通信速度が115.2kで速度があっていないことが判りました。 とりあえずH8S2368のSCI0を115.2k変更したいのですが、どのようにすれば115.2kbpsに変更できるのか教えていただきますよう、よろしくお願い致します。 現在のSCI0のUARTに関する設置はこちらです。 (hwsetup.c) SCI0.SCR.BYTE = 0x00; SCI0.SMR.BYTE = 0x00; SCI0.BRR = 15; for(i=0;i<30000L;i++); /* Async, 8-data, odd-parity, 1-stop, N-multi, CLK */ SCI0.SCR.BIT.TE = 1; /* Transmit Enable */ SCI0.SCR.BIT.RE = 0; /* Receive Enable */ SCI0.SCR.BIT.RIE = 1; /* Receive Interrupt */ SCI0.SCR.BIT.TIE = 0; /* Transmit-data-empty Interrupt */ SCI0.SCR.BIT.TEIE = 0; /* Transmit End Interrupt */ SCI0.SSR.BIT.TDRE = 0; /* Clear TDR Empty flag */ H8S2368のデータシートを見ていると、 SCI0.BRR = 15; このBBRレジスタに代入する値をもう少し下げていけば115.2kHzに近づいていくのかなぁ、と感じるのですが、正確な計算方法など教えていただけると助かります。

質問者が選んだベストアンサー

  • ベストアンサー
  • MSZ006
  • ベストアンサー率38% (390/1011)
回答No.3

#1補足です。 長いですが下記のURLでH8S/2368ユーザーズマニュアルハードウェア編が入手できます。 https://www.renesas.com/ja-jp/document/hw-manual?hwLayerShowFlg=true&prdLayerId=107&layerName=H8S%252F2368&coronrService=document-prd-search&hwDocUrl=%2Fja-jp%2Fdoc%2Fproducts%2Fmpumcu%2F002%2Frjj09b0162_h8s2368.pdf&hashKey=cc3bfc5ffb6fad6048b1c624090abeee このマニュアルの、14.3.9 ビットレートレジスタ(BRR) あたりに詳しく書かれています。 これによると、動作クロック20MHzの場合、BRR=5に設定すると、通信速度は104,167bpsになります。115,200bpsとの誤差は約-9.6%となります。BRR=4だと125,000bpsで、誤差は8.5%ほどです。この誤差が通信可能の許容範囲でないと通信できないことになります。動作クロックを上げて調整してください。 または他の回答者様のご回答にあるように、逆にESP-WROOM-02の通信速度を下げるという方法も考えられますが、こちらの通信速度を設定するにはやはり最初は115,200bpsで通信しなければなりませんので、別途装置が必要になってくると思います。

techhouse
質問者

お礼

ESP-WROOM-02のボーレートを変更するには、ATコマンドでは”AT+UART_DEF=38400,8,1,0,0”というようなコマンドがあるとのことですが、 電源投入時の初期値のボーレートは115.2kHzですが、H8Sマイコンがこのボーレートを正確に設定することが現状だとできない状況ですが、 たとえば、ESP-WROOM-02の電源投入時に38.4kHzにボーレートを設定しておくような方法というのはありますでしょうか? どうぞ、ご教示頂きますよう、よろしくお願い致します。

その他の回答 (5)

  • tadys
  • ベストアンサー率40% (856/2135)
回答No.6

UARTで通信するためにはビットレートの誤差は5%程度より小さい必要が有ります。 これは相手側の誤差がゼロとした時に許容できる限界です。 相手側にも誤差があることを考えると2%以下程度、余裕を見ると1%以下が望ましいでしょう。 ビットレートは、BRRとCKS1、CKS0の設定を変えることで変更できます。 それぞれの設定値の求め方は下記資料の717ページに書いてあります。 http://akizukidenshi.com/download/ds/renesas/r01uh0166jj_h8s2633.pdf ビットレート115.2kHzを誤差ゼロで使用するためにはCPUの動作周波数を3.6864MHzの整数倍にする必要が有ります。 現在使用中の動作周波数では誤差を許容範囲に出来ないのであれば動作周波数を変更するか、SCKを外部クロックモードで使用して適切な周波数を入力する必要が有ります。

techhouse
質問者

お礼

回答頂きありがとうございます。 返事が遅くなり申し訳ありません。 その後、"AT+UART_DEF=38400,8,1,0,0"というコマンドで通信スピードを設定してあげると、フラッシュメモリに設定が書き込まれるようで、以後電源を落としても38.4kbpsに固定することができました。 助かります。

  • MSZ006
  • ベストアンサー率38% (390/1011)
回答No.5

#1です。 もう一つの方法として、H8SマイコンのSCK0端子に外部クロックを供給する方法があります。 115,200bpsの16倍、1.8432MHzのクロックを入力すればよいようです。 水晶発振器1.8432MHzのものを入手してSCK0端子に接続、SCI0.SCRレジスタの設定値を0x02とすればよいようです。詳しくは前述のマニュアルの「14.3.6 シリアルコントロールレジスタ(SCR)」あたりに載っています。

techhouse
質問者

お礼

回答頂きありがとうございます。 返事が遅くなり申し訳ありません。 その後、"AT+UART_DEF=38400,8,1,0,0"というコマンドで通信スピードを設定してあげると、フラッシュメモリに設定が書き込まれるようで、以後電源を落としても38.4kbpsに固定することができました。 今回はこれで対処してみようと思います。

  • MSZ006
  • ベストアンサー率38% (390/1011)
回答No.4

ESP-WROOM-02の起動時の通信速度を変えるにはファームウェアを書き換えるしかないと思われます。 残念ながら詳しくは私にはわかりません。ESP-WROOM-02の公式フォーラムやネット上の情報を検索してみてはどうでしょうか。

techhouse
質問者

お礼

回答頂きありがとうございます。 返事が遅くなり申し訳ありません。 その後、"AT+UART_DEF=38400,8,1,0,0"というコマンドで通信スピードを設定してあげると、フラッシュメモリに設定が書き込まれるようで、以後電源を落としても38.4kbpsに固定することができました。 助かります。

  • trytobe
  • ベストアンサー率36% (3457/9591)
回答No.2

1ビットしか送れない時間に3ビットを送ろうとしても、速い方に合わせるのは無理です。 ESP-WROOM-02 の通信速度(ボーレート)を、H8S2368 側と同じにさせるほうが簡単です。 Arduinoと数百円のWi-Fiモジュールで爆安IoTをはじめよう - ICS MEDIA https://ics.media/entry/10457/3 ESP-WROOM-02 レート設定 - Google 検索 https://www.google.co.jp/search?q=ESP-WROOM-02+%E3%83%AC%E3%83%BC%E3%83%88%E8%A8%AD%E5%AE%9A

techhouse
質問者

お礼

ESP-WROOM-02のボーレートを変更するには、ATコマンドでは”AT+UART_DEF=38400,8,1,0,0”というようなコマンドがあるとのことですが、 電源投入時の初期値のボーレートは115.2kHzですが、H8Sマイコンがこのボーレートを正確に設定することが現状だとできない状況ですが、 たとえば、ESP-WROOM-02の電源投入時に38.4kHzにボーレートを設定しておくような方法というのはありますでしょうか? どうぞ、ご教示頂きますよう、よろしくお願い致します。

  • MSZ006
  • ベストアンサー率38% (390/1011)
回答No.1

BRRレジスタの値と通信速度は反比例するようですので、通信速度を3倍にするにはBRRの値を1/3にすればよいと思います。 ということで、BRR=5にしてみてはどうでしょうか。±1程度の微調整は必要になるかもしれません。

techhouse
質問者

お礼

回答頂きありがとうございます。 H8S2368のハードウェアマニュアルより、BRRの適切な値を求める式で求めてみたところ、現在の基板が使用している動作周波数19.66MHzの場合、約4.3....という値が出てきました。 なので、BRR=4に設定して、基板とPCとをシリアルケーブルでつなげてTeraTermなどで115.2kHzで受信させてみたのですが、文字が化けてしまいました。BRR=5,BRR=3の周辺の数値でも誤差が大きいようでやはり化けてしまいました。 38.4KHzの場合は問題なく”AT”という文字を受信できているので、ESP-WROOM-02側を38.4KHzに落として通信するのが良いのかなと思っております。

関連するQ&A

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

  • H8Sマイコンでprintfを複数ポートで使いたい

    現在H8S2368マイコンを搭載した基板のプログラムのデバッグなどを行っています。 このボードではマイコンのUARTのSCI1をRS-232Cポートとして使用しており、外部ユニットに接続したりデバッグ時にはプログラム内にデバッグ用に設置したprintfのキャラクタ出力用のポートとして使用しています。 現在UARTのSCI0ポートが未使用の状態で、このポートにWiFiモジュールのESP-WROOM-02を接続したいと考えております。 WiFiモジュールのESP-WROOM-02との通信はSCI0ポートを介するのでプログラミングではprintf関数を使うと思うのですが、現在printf関数で書かれたコードはSCI1ポート専用となっているのですが、 printf関数使用時にSCI0で出力するのか、SCI1で出力するのかを選択するにはどのようにプログラムしたらよいのでしょうか? なお、printfに関するプログラムはプロジェクト内のこれらのファイルで設定しています。 console.c lowsrc.c iodefine.h console.c内で宣言した”charput”、”charget”はlowsrc.cでしようされています。 どうぞ、ご教示の程よろしくお願い致します。 ------------------------(iodefine.hの内容)------------------------------------------------- #define CONSOLE_P SCI1 #define _CONSOLE_P _SCI1 -------------------------------------------------------------------------------------------------- -------------------------(console.cの内容)-------------------------------------------------- char charget(void); void charput(char); void PutStr(char *); #ifdef CONSOLE_DEBUG char charget(void) { char InputChar; while (CONSOLE_P.SSR.BIT.RDRF == 0) { /* ignore errors */ if ((CONSOLE_P.SSR.BYTE & ORER_FER_PER) != 0x00) CONSOLE_P.SSR.BYTE &= ~ORER_FER_PER; } InputChar = CONSOLE_P.RDR; CONSOLE_P.SSR.BIT.RDRF = 0; charput(InputChar); return (InputChar); } void charput(char OutputChar) { while ((CONSOLE_P.SSR.BIT.TDRE) == 0); CONSOLE_P.TDR = OutputChar; CONSOLE_P.SSR.BIT.TDRE = 0; } void charput_sci1(char OutputChar) { while ((CONSOLE_P_SCI1.SSR.BIT.TDRE) == 0); CONSOLE_P_SCI1.TDR = OutputChar; CONSOLE_P_SCI1.SSR.BIT.TDRE = 0; } void PutStr(char *str) { while (*str != '\0') charput(*str++); } #else char charget(void) { } void charput(char OutputChar) { } void PutStr(char *str) { } #endif --------------------------------------------------------------------------------------------------

  • H8S2368マイコンのTCSR_1レジスタの4ビット目が1のはずなのに0と表示される。

    いま、H8S2368マイコンのプログラムを作っているのですが、 TCSR_1レジスタの値を printf("data:%X addr:%p\n\r", TMR1.TCSR.BYTE,(void*)&TMR1.TCSR.BYTE); このプログラムでリードしてみて、UART通信で受信したところ ”data:C0 addr:ffffb3” このレジスタのデータが0xC0というのを確認しました。 このH8S2368マイコンのデータシートの502ページ目(rjj09b0162_h8s2368.pdf)では、このレジスタの4ビット目はリザーブビットで、リードすると必ず”1”が読み込まれると書かれているのですが、なぜかそのビットが”0”で帰ってきます。 ”0xD0”ならばわかるのですが、これはなぜなのでしょうか?

  • ESP-WROOM-02のボーレートをファーム変更

    現在、wifiモジュールのESP-WROOM-02とH8S2368マイコンをUART接続して通信をwifi化したいと考えております。 H8S2368をESP-WROOM-02のATコマンドで制御したいのですが、H8Sマイコンの動作周波数が19.66MHzでESP-WROOM-02のデフォルトの通信bpsが115.2kHzなので、それに近い通信スピードに合わせたのですが、115.2kHzぴったりとはいかず、PCにつないでも文字が化けてしまう問題が発生します。 もともと38.4kHzだと問題ないので、そのbps速度を使用したいのですが、ESP-WROOM-02のファームウェア改造などでデフォルトの速度を115.2kHzではなく38.4kHzに変更させる方法などありましたら、ご教示頂きますようよろしくお願い致します。

  • Tera Termを使ったマイコンとの通信

    H8/3048Fと通信をしようと思い、「Tera Term」を使ってみたのですが、 下のプログラムを実行してもTera Termに何も表示されません(COMの番号はしっかり確認しました) while( 1 ){ ITU0.TCNT = 0; while( ITU0.TCNT < 40000 ); counter++; if( counter > 100 ){ if( P4DR == 0x00 ){ //LEDを点滅させる(確認用) P4DR = 0x10; } else{ P4DR = 0x00; } while( ( SCI0.SSR.BYTE & 0x80 ) == 0 ); SCI0.TDR = 'A'; //Aを送信する SCI0.SSR.BYTE &= ~0x80; counter = 0; } } SCI0の設定は int i; SCI0.SCR.BYTE = 0x00; SCI0.SMR.BYTE = 0x00; SCI0.BRR = 51; for( i = 0 ; i < 1000 ; i++); i = SCI0.SSR.BYTE; SCI0.SSR.BYTE = 0x80; SCI0.SCR.BYTE = 0x30; となっております。 このプログラムを実行すると確認用のLEDは点滅しますが、Tera Termには何も表示されません。 どこか間違っているところなどがあれば教えていただけないでしょうか? ちなみに、使用しているOSはWindows7です。 よろしくお願いします。

  • H8S 調歩同期通信のデータ送信ができない

    ルネサスのCPU H8S2378 を使用してプログラムを組んでいるのですが、 どうしても調歩同期式通信によるデータの送信が上手く行きません。 自分でマニュアル等を調べているのですが、原因が分からず困っています。 どなたか、アドバイス頂けないでしょうか。 以下に現状の動作とソースを記述致します。 プログラムがスタートすると、 ポート割り込みなどの初期設定を行い、 無限ループに入り、LEDの点滅とデータ'A'の送信を繰り返すことを 意図して記述しました。 しかし、実際にはLEDの点滅、データ送信は行われず、 SCI1.TDR = data; で送信するデータをセットして、 SCI1.SSR.BIT.TDRE = 0x00; で送信フラグのクリアをした後、 送信フラグ(TDRE)がセットされていないようで 2ループ目のwhile( SCI1.SSR.BIT.TDRE == 0x00 );のところで 止まっているようです。 送信動作の確認は、PCに接続してteratermで行ったのですが、 データが入ってきていないようで、オシロスコープでTXD1のポートを当たったのですが、データは全く出力されていないようです。 /*初期化部分*/ void h8_sciinit( void ){  SCI1.SCR.BYTE = 0x00;  /* 内部クロック/SCK*/  SCI1.SMR.BYTE = 0x00;  /* 調歩同期式モード*/              /* データ長:8ビット*/              /* バリティ:なし*/              /* ストップビット:1ビット*/              /* 内部クロック:Φクロック*/  SCI1.BRR = 0x6A;//106  /* ビットレート設定(9600bit/s)*/  for(i = 0;i < 0xFFFF; i++);/*待ち*/  SCI1.SCR.BYTE = 0x30; /* RE,TE->1送受信を許可*/  SCI1.SSR.BYTE; /* ダミーリード*/  SCI1.SSR.BYTE = 0x80; /* エラービットをクリア*/ } /* 送信部分 */ void SCI1_SendData( char data ) { while( SCI1.SSR.BIT.TDRE == 0x00 ); /*未送信データが送られるまで待つ */ SCI1.TDR = data; /* 送信データのセット*/ SCI1.SSR.BIT.TDRE = 0x00; /* 送信フラグのクリア*/ } /* Main関数 */ void Main(void) { GA_Port_init(); //各GAのポートを初期化 INT_INIT(); /* 割り込みの初期設定 */ ipr_register_set(); /* 割り込み優先順位レジスタ 設定 */ DEBUG_LED1 = 0x01; /* デバッグLED設定 */ DEBUG_LED2 = 0x01; /* デバッグLED設定 */ DEBUG_LED3 = 0x00; /* デバッグLED設定 */ DEBUG_LED4 = 0x00; /* デバッグLED設定 */ h8_sciinit(); /* SCI初期設定 */ while(1){  SCI1_SendData( 'A' );  wait();  DEBUG_LED2 = ~DEBUG_LED2 ;  } }

  • H8/36064を使ったシリアル通信について

    今学校のほうでH8/36064をつかってA/D変換したデータをPCに送るためのプログラムを作っているのですが、取り込んだデータをシリアル通信を使ってPCに送るとどうしても文字化けしてしまいます。 だめな原因などを教えていただけないでしょうか。 /*プログラム*/ #include "iodefine.h" #include <machine.h> //割り込みマスクビット変更関数set_imask_ccr()を              //使用するためのインクルードファイル #include <stdio.h> void main(void) { while(1){ if(AD.ADCSR.BIT.ADF == 1) Getad(); } } init() //A/D変換およびタイマV初期設定用関数 { set_imask_ccr(1); //割り込み禁止設定 AD.ADCSR.BIT.SCAN = 1; AD.ADCSR.BIT.CH = 101; TV.TCRV1.BIT.ICKS = 0; TV.TCRV0.BIT.CKS = 3; //Φ/128 TV.TCORA = 115-1; //コンペアマッチAの値 TV.TCRV0.BIT.CCLR = 1; //タイマカウンタクリア TV.TCRV0.BIT.CMIEA = 1; //割り込み発生フラグ設定 set_imask_ccr(0); //割り込み禁止解除 } void Sci3() //シリアル通信設定 { unsigned int dmy; IO.PMR1.BIT.TXD = 1; //TXD端子使用設定 SCI3.SCR3.BYTE = 0; //SCR3クリア SCI3.SMR.BYTE = 0; //SMRフォーマット設定 SCI3.BRR = 47; //9600bps for(dmy = 280;dmy > 0;dmy--); SCI3.SCR3.BIT.TE = 1; //送信動作許可 } void sendCharSCI(char data) //データ送信設定 { while(SCI3.SSR.BIT.TDRE==0); //トランスミットデータレジスタエンプティが真になるまで待機 SCI3.TDR = data; //トランスミットデータレジスタに送信データ(8bit)をセット SCI3.SSR.BIT.TDRE = 0; //「送信中」フラグを立てる return; } void print(char *str) { while(*str !='\0') { sendCharSCI(*str); str++; } return; } Getad() { volatile unsigned int *data = (unsigned int *)0xfa00; volatile unsigned int *data2 = (unsigned int *)0xfa10; *data =AD.ADDRA; *data = *data >> 6; //右に6bitシフト *data2 =AD.ADDRB; *data2 = *data2 >> 6; //右に6bitシフト AD.ADCSR.BIT.ADF = 0; AD.ADCSR.BIT.ADST = 0; Sci3(); // SCI3初期化 sendCharSCI(*data); sendCharSCI(*data2); } #pragma interrupt (TimerV(vect=22)) //割り込み処理関数としてTimerVを宣言 void TimerV(void) { static int count; //20000回(0.1秒)ごとにGetad // コンペアマッチフラグを0に戻し、次のコンペアマッチに備える。 TV.TCSRV.BIT.CMFA = 0; if(count<100) count++; else { count = 0; AD.ADCSR.BIT.ADST = 1; //AD変換開始 } }

  • AVRマイコン UART動作異常

    AVRマイコンのATmega168にてPCとRS-232Cにてシリアル通信(UART)を行うと最初のスタートビット'L'が正常に出ず、スタートビット'L'の後すぐに'H'に戻ってその後データビットを送っています。2回目以降のスタートビットは正常に'L'が指定したボーレートの時間幅で出ており、問題はありません。最初のスタートビットが正常に出ない原因がわかりませんので教えてください。 システムクロック:1MHz(内部発振器のみ) ボーレート:4800bps データビット数:8bit ストップビット数:1bit パリティビット数:なし -------------------------------------------- #include <avr/io.h> #include <util/delay.h> #include <avr/pgmspace.h> #define sbi(addr,bit) addr |= (1<<bit) #define cbi(addr,bit) addr &= ~(1<<bit) void port_init(void){ PORTB = 0xFE; DDRB = 0xFF; asm("NOP"); } void uart_init(void){ sbi(DDRD,1); cbi(DDRD,0); asm("NOP"); } void uart_putchar(unsigned char c){ loop_until_bit_is_set(UCSR0A,UDRE0); // asm("NOP"); UDR0 = c; } void _delay_1s(void){ int i; for(i=0;i<100;i++){ _delay_ms(10); } } int main(void) { port_init(); uart_init(); UCSR0B = _BV(TXEN0); UCSR0C = 0b00000110; UBRR0H = (uint8_t)0; UBRR0L = (uint8_t)12; while(1) { uart_putchar(0b01011010); _delay_1s(); } return 0; } -----------------------------------------------

  • H8/3069 SCIについて

    H8/3069のシリアル通信機能についての質問です。 SCI0を調歩同期式に設定して、パソコン上のハイパーターミナルと通信しています。SCI1とSCI2をクロック同期式に設定して、tx1とrx2,tx2とrx1,sck1とsck2を配線接続した状態です。 このとき、PC(ハイパーターミナル)からの送信データ⇒SCI0で受信⇒SCI1から送信⇒SCI2で受信⇒SCI0からパソコンに対してデータ送信したいと思っています。 ところが、SCI1のクロック同期式でのデータ送信がまずできません。データもクロックも出せていないです。 そこで、SCI0,SCI1,SCI2のすべてを調歩同期式に設定した場合は、上記のデータの送受信は成功しています。 H8/3069において、SCI0,SCI1,SCI2のシリアル通信方式の設定を上記のように、1つのH8に対してクロック同期と調歩同期を混在させた場合、何かうまく動作しない原因は考えられますでしょうか。 プログラムでのSCI0とSCI1,SCI2の初期設定の違いは、SCI1とSCI2は、SMRレジスタC/Aビットを1(SCI0は0)にして、SCI2については、SCRレジスタのCKE1ビットを1(SCI0,SCI1は0)にした状態にしています。 よろしくお願いいたします。

  • H8Sマイコンの機能に相当するAtmelのマイコン

    現在、H8S2368マイコンというのを使用しているのですが、Atmelのマイコンでそれに相当するようなマイコンをご存じでしたらご教授頂きますようお願い致します。 なお、H8S2368マイコンの仕様は http://japan.renesas.com/products/mpumcu/h8s/h8s2300/h8s2368/index.jsp こちらのサイトで次のようになっていました。 低電圧高速動作 3.0~3.6V/33MHz動作 最小命令実行時間:30ns ROM/RAM 512kB/32kB:H8S/2368F 384kB/32kB : H8S/2364F 384kB/24kB:H8S/2367F 256kB/32kB : H8S/2362F 256kB/24kB : H8S/2361F 256kB/16kB : H8S/2360F 256kB/16kB:H8S/2365 -  /16kB:H8S/2363 シリアル通信機能強化 SCI×5ch(I2C×2chオプション) 等 どうぞ、よろしくお願いいたします