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

このQ&Aのポイント
  • ルネサスのCPU H8S2378を使用してプログラムを組んでいるが、調歩同期式通信によるデータの送信が上手く行かない。
  • 送信動作の確認はPCに接続してteratermで行ったが、データが入ってこず、オシロスコープでTXD1のポートを確認してもデータは出力されていない。
  • プログラムはポート割り込みなどの初期設定を行い、無限ループに入ってLEDの点滅とデータ'A'の送信を繰り返すように記述しているが、LEDの点滅とデータの送信が行われていない。
回答を見る
  • ベストアンサー

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

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

  • ベストアンサー
  • pyonmae
  • ベストアンサー率64% (40/62)
回答No.1

こんにちは。 モジュールストップ状態は、解除されていますでしょうか?

andocchy
質問者

お礼

モジュールストップ状態の解除を行ったら送信できるようになりました。 モジュールストップモードの存在を知らずに何日も悩んでいましたので、アドバイス頂き大変感謝しております。 ありがとうございました。

関連する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 --------------------------------------------------------------------------------------------------

  • 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変換開始 } }

  • 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に近づいていくのかなぁ、と感じるのですが、正確な計算方法など教えていただけると助かります。

  • H8/36064のAD変換データの文字列化について

    たびたびの質問失礼いたします。 前回シリアル通信によって文字化けがおきることについて質問させていただいたものです。 前回の質問後、10ビットのA/D変換データを文字列に置き換える方法を調べstatic void uint2Hex()によって文字列に置き換えを行っているのですがまだうまく解消できませんでした。 申し訳ないのですが再び助言をいただけないでしょうか。 H8/36064を使用しTera Termに取り込むことで確認を行っています。 ボーレートなどのシリアル通信の設定はマイコン側、Tera Term側であわせてあります。 #include "iodefine.h" #include <machine.h> //割り込みマスクビット変更関数set_imask_ccr() を使用するためのインクルードファイル #include <stdio.h> void main(void) { init(); 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 initSCI3(void) //シリアル通信設定 { 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 rs_putc(char c) //1文字送信 { while(SCI3.SSR.BIT.TDRE == 0); //トランスミットデータレジスタエンプティが真になるまで待機 SCI3.TDR = c; //トランスミットデータレジスタに送信データ(8bit)をセット SCI3.SSR.BIT.TDRE = 0; //「送信中」フラグを立てる } void rs_puts(char *st) //文字列送信 { while(*st != 0){ rs_putc(*st); st++; } } static void uint2Hex(unsigned long n, short upper, char *buf) { char c; char a = 'a'; short len = 0; short i, half; if(upper) a = 'A'; // 大文字/小文字の設定 // 16進文字列へ変換し文字数をカウント do{ i = n & 0x0F; if(i > 9) buf[len] = (unsigned char)(i + a - 10); else buf[len] = (unsigned char)(i + '0'); len++; n >>= 4; }while(n != 0); half = len >> 1; // 文字の並び順を直す for(i=0; i < half; i++){ c = buf[i]; buf[i] = buf[(len-1)-i]; buf[(len-1)-i] = c; } buf[len]='\0'; // 終端コードの挿入 } Getad() { volatile unsigned int *data = (unsigned int *)0xfa00; volatile unsigned int *data2 = (unsigned int *)0xfa10; initSCI3(); // SCI3初期化 *data =AD.ADDRA; *data = *data >> 6;//右に6bitシフト *data2 =AD.ADDRB; *data2 = *data2 >> 6;//右に6bitシフト rs_putc(*data); rs_putc(*data2); AD.ADCSR.BIT.ADF = 0; AD.ADCSR.BIT.ADST = 0; } #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変換開始 } }

  • 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です。 よろしくお願いします。

  • H8-3052Fを用いた文字列の受信

    私は現在、H8-3052Fを用いて別の回路と画像データなどを送受信するソフトをGCC-Developpers Liteを用いて作っています。 H8-3052Fを用いてunsigned char型の文字列をRS-232Cで受信して、配列に格納する方法を教えて下さい。 現在は下記の1文字受信関数を用いていますが、うまく出来ません。 Main文では常に文字列受信を待っている状態で、またITU割り込みで1秒ごとに別の処理が走るようにしています。 char SCI1_IN_d(void) //受信文字を返す { char c; //受信データ格納変数 while (!(SCI1.SSR.BYTE&0x78)); //受信もしくはエラーフラグが立つまで待つ if(SCI1.SSR.BIT.RDRF==1) //受信完了でRDRF=1 { c=SCI1.RDR; //データ取り出し SCI1.SSR.BIT.RDRF=0; //受信フラグクリア } else { //受信完了していないならRDRF=0 SCI1.SSR.BYTE&=0x80; //エラーならエラーフラグクリア c=0; } return c; //受信文字を返す } 以上です。 何分素人なので解りかねることがあると思いますが、宜しくお願い致します。

  • マイコンを用いたバイナリー形式での通信の方法

    以下のようなハード環境とプログラムで、マイコンの変数値をPCへ取り込む環境(データロガー)を実現しております。ただし、更にデータの取り込み速度を向上させたく考えておりますが、その手段として、”バイナリー形式”での通信が適用できると情報を得ておりますが、具体的な手法が不明です。よろしくご教授をお願いします。 <環境> ・H8マイコン ・RS-232CでPCと接続 ・PCでのデータ取得は、ハイパーターミナルを利用 <プログラム> (1)送信する部分 H8のSCI3を利用して、1文字ずつ送信 以下具体的に作成したプログラムです void sci3_tx(char data){ while (SCI3.SSR.BIT.TDRE==0); SCI3.TDR=data; } (2)実際の送信 "1234"(←千二百三十四)と"3456"(←三千四百五十六)というデータを連続して送信したい場合には、 sci3_tx(1+48); sci3_tx(2+48); sci3_tx(3+48); sci3_tx(4+48); sci3_tx('\r'); sci3_tx('\n'); sci3_tx(3+48); sci3_tx(4+48); sci3_tx(5+48); sci3_tx(6+48); sci3_tx('\r'); sci3_tx('\n'); と処理し、ハイパーターミナルでデータを保存して、"1234"と"3456"を取り出しています。 <ご質問の詳細> (1) 上記のように2つの数値をバイナリー形式で送信するためには、どのように実施したらよいのでしょうか? 例えば、バイナリーの場合2の8乗であるので、 1234を送信する場合、255+255+255+255+214で、11111111、11111111、11111111、11111111、 11010110と送信して、加算処理をすればよろしいでしょうか? (→255を11111111と送信するプログラムもいまいち不明ですが) (2)バイナリー形式で送信する際の送信始め/終わりの区切りはどのように考えたらよろしいでしょうか? (3)バイナリー形式を受信できるソフト(ハイパーターミナルに対応するもの)は、何になりますでしょうか? 以上、いくつかのご質問をさせていただきましたが、参考となる情報(Web、書籍)がありましたら、合せてご紹介をお願いいたします。

  • PICマイコンでGIEビットが1に出来ません。(コンパイラのバグ?)

    質問は初めてです。 GIEビットが1にセット出来ません。 デバッグでは、 GIE = 1; の文が無視され飛び越えます。 デバッグのwatchで監視してもセットされないのが確認出来ます。 マイコンに書き込んで実行させても割り込みが発生してないのが分かります。 環境はMAPLAB IED v8.46 と HI-TECH PICC の無料版?です。 ↓プログラム全てを書くとやたら長いのでIOなどの設定している関数だけ表示します↓ void Ioport(){ PORTA = 0x00; //ポートA初期化 PORTB = 0x00; //ポートB初期化 PORTC = 0x00; //ポートC初期化 TMR0 = 0x00; //タイマ0初期化 OSCCON = 0x60; //外部クロック20MHz使用 OSCTUNE = 0x00; //動作クロックのチューン無し CM1CON0 = 0x00; //コンパレータ無効でデジタルIOモード可能 CM2CON0 = 0x00; ANSEL = 0x00; //デジタルIOモード ANSELH = 0x00; OPTION = 0x08; //RBプルアップ有効、TMR0を命令クロック、 //プリスケーラをTMR0に使わない T0IF = 0; //フラグ タイマ0初期化 T0IE = 1; //割り込みタイマ0可能 GIE = 1; //割り込み全体可能(ココが飛ばされます) TRISA = 0b11000000; //出力:0~4LED7セグメントのブロック用5つ WPUB = 0b11100111; //0~2プルアップ設定 3赤外線受信4赤外線送信 TRISB = 0b11101111; //0~2ボタン3つ 出力:4赤外線送信 TRISC = 0b00000000; //0~7LED7セグメントのパーツ用8つ //GIE = 1; ココに書くとコンパイラがエラーを起こします。 } void main(void){ Ioport();     //GIE = 1; ココに書くとセットしてくれて正常に動作します。 } 他に GIE = 1; を書く場所によっては、 Ioport()関数の最後に書くと、 67.23 ";" expected 71.1 undefined identifier "portBRead" 77.9 void function can't return a value 81.9 void function can't return a value 85.9 void function can't return a value 88.9 void function can't return a value 91.9 void function can't return a value と、的外れ的なコンパイルエラーが出ます。 そして、 main()関数のIoport()関数の後に書くと、 何故か正常動作し実際に書き込んでも正常に動作します。 後 書く順番によっては T0IF = 0; GIE = 1; T0IE = 1; と書くとGIEビットは1にセットされるが、T0IEビットは無視され飛び越えます。 新規projectで再度試しましたが同じでした。 これは、コンパイラのバグなのでしょうか? 解決策の回答をお願いします。

  • モータの制御

    //ステッピングモータの回転 //右に2回転、停止、左に1回転、停止これを3回繰り返す //ITUO使用、フラグが立つのを待つ //10msごとにモータに出力 //str_4.c #include <3048f.h> void ioinit(void) { PB.DDR = 0xff; } void ituinit(void) { ITUO.TCR.BIT.CCLR = 1; //カウンタクリア要因 ITUO.TCR.BIT.TPSC = 3; //タイマプリスケーラ 25MHz/8=3.125MHz ITUO.GRA = 31249; //3.125MHz/31250=100Hz、10ms、100pps ITUO.TIER.BIT.IMIEA = 0; //IMFAフラグによる割り込み禁止 } void wait(void) //停止時間 { Long t=200000; while(t--); } int main(void) { int i = 3; //繰り返しカウンタ int p; //回転パルス数 int md = 0x11; //モータ出力データ ioinit(); ituinit(); PB.DR.BYTE = md; wait(); ITU.TSTR.BIT.STR0 = 1; //タイマスタート while(i--){ for(p=0;p<96;p++){ //2回転 PB.DR.BYTE = md; md <<= 1; //右回転 if(md == 0x110) //4回シフトしたかの判断 md = 0x11; //4回シフトで初期値に戻す while(!ITU0.TSR.BIT.IMFA); //フラグが立つのを待つ ITU0.TSR.BIT.IMFA = 0; //フラグクリア } wait(); //少し停止 for(p=50;p>0;p--){ //1回転、1パルス多くした PB.DR.BYTE = md; md >>= 1; //左回転 if(md == 0x08) //4回シフトしたかの判断 md = 0x88; //4回シフトで初期値に戻す while(!ITU0.TSR.BIT.IMFA); //フラグが立つのを待つ ITU0.TSR.BIT.IMFA = 0; //フラグクリア } wait(); } PB.DR.BYTE = 0x00; //モータ励磁OFF while(1); //ここでとまっている } このプログラムのフローチャートがわかりません。

専門家に質問してみよう