ATmega128(BTC068)でPRS-DE07MS通信プログラム作成中
すいません m(_ _)m、本記事はブログ引越時に書式が崩れました。順次修正中です。
ATmega128でPRS-DE07MSと通信させようとがんばっているのですが、変なところで引っかかってました。
受信完了待ちを手抜きして、ソフトタイマ(いわゆるループで待つやつ)を組み込んでいたのですが、単純にソフトタイマのテストプログラムで実行するとちゃんと1秒でタイムアップしてくれるんですが、なぜか本ちゃんプログラムに組み込むと20秒ぐらいかかってしまいました。しかも、割込みかからないように作っているはずなのに、なぜか割込みがかかってしまい、なんだか何もかもが変!な状態にはまり込んでいました。
具体的には、こんなプログラムです。
// 受信完了待ちをしながら待ち時間検出 // (手抜き1secタイマ) for( ulCnt = 0L;((( UCSR1A & _BV(RXC)) == 0 )&&( ulCnt < 416667L )); ulCnt++ );
こんだけなんですけど、不思議とうまくいきません。で、さじを投げそうになっていた時に、ふとUSART1をいじっているところを見直してみたら、
while(!( UCSR1A & _BV(UDRE))); // 送信バッファ空きチェック UCSR1B |= ~_BV(TXB8); // 9ビット目ON UDR1 = ucData; // データ送信開始
送信処理の中で割込みイネーブルを全部、セットしていました…○| ̄|_
当然、フラグをクリアする処理なんて割込み処理に書いていませんから、きっとものすごい勢いで割込み処理が呼び出されていたんだと思います。よく考えれば、割込みディセーブルにしているのに割込みがかかってしまっている時点で気が付くべきでした。
で、ここのところ、本当は、
while(!( UCSR1A & _BV(UDRE))); // 送信バッファ空きチェック UCSR1B |= _BV(TXB8); // 9ビット目ON UDR1 = ucData; // データ送信開始
と書かないといけない部分です。なんでこんな間違いしていたかって言いますと、(たぶん)マルチビットを立てない方を関数を先にコーディングしてコピってからマルチビット立てる方の送信部分を書いたため、やっちゃったぽいです。ちなみにマルチビットを立てないほうはこんな感じです。
while(!( UCSR1A & _BV(UDRE))); // 送信バッファ空きチェック UCSR1B &= ~_BV(TXB8); // 9ビット目OFF UDR1 = ucData; // データ送信開始
この「&」(アンド)を「|」(オア)にすればいいや!って、ちょいちょいっとやってしまったのが原因っぽいです。
通信のほう、もうちょっとでいけそうなので、気を取り直してがんばります。
Your Message