« オプティマイズのロジアナ | トップページ | Tiny用のソフトI2Cスレーブ »

2008年8月24日 (日)

Mega168のUART

Mega168でまたはまる(01/06/08)
 お正月休みもいよいよ今日で終わり。10日近く。長かったが考えてみたら、お正月の行事以外は、マイコンだけの正月だった。あっという間に時間がたったように思う。昨日、焼きもちをやいたのか、かまってもらえなかった車が故障して工場入り。折角、今日は秋月に買い物に行こうと思っていたのだが、とりやめ。そのかわり、またAVRで遊んでいる。

 温度ロガーを久しぶりに動かしてみる。何と、バッテリーに直結し、念を入れてスーパーキャパシタでバックアップしてあるRTCが動いていない!そんな馬鹿な。電圧を測ってみる。1.1Vしかない。電池はまだ2.8V以上ある。誰が犯人だ。テスターで見たところでは、コンデンサーの逆流防止につけたダイオード(ショットキーバリアダイオードIS4)で激しく電圧降下している。順方向の損失が少ないと言う触れ込みなのにこれではRTCは動けない。ブレッドボードの電池(4.2V近く)を供給してやる。ところがRTCは目覚めない。青くなる。壊れた? たかだか¥500のものだが、最近は¥500もする部品は重要部品だ。

 念のため電圧を測ってみる。これが1.4Vにしか上がっていない。RTCの動作最低電圧は1.7V。やれやれ。荒療治でダイオードのところショートさせて動かしてみる。何と、RTCは正確な時刻をけなげに返してくるではないか。思わず、チップをさすって苦労をねぎらってやった。考えてみたら、コンデンサが動くのは電池がないときだけ。ダイオードがなく逆流したとしても電池に影響はない。ダイオードをとりはずすことにして一件落着した。

 Mega168の話である。新しいブレッドボードにお目見えした。手始めにソフトUARTをつけてPCとやりとりするテストプログラムを入れてみる。Megaクラスになるとデータシートの量は半端ではない。2分冊にしてもTinyの1冊分を上回る。それにしてもこのドキュメントがすべて日本語になっているのはありがたい。ボランティアだそうだ。頭が下がる。Tinyとはだいぶレジスタの名称や機能がかわり、あちらこちら直してテストにこぎつけた。

 これがまた動かないのである。送信はデータポートをプルアップしてデータがおかしくなったのを除けば順調に出来たのに、受信がまた全く反応がない。Tinyと違うところはピンチェンジ割込みが詳細になったこと位で違いはない。これまたロジアナを取り出し、調べるとどうも割り込みを止めたはずなのにビットが来るたびに割り込みが入っている。

 スタートビットは論理1なのに、試しに0で動くようにすると、字化けしながらもデータは受け取れる。それにしても割り込みがデータ入力中に来るのは何故だ? MegaはUARTをハードで持っているのであまりこだわることはないのだが、これもやりだしたら止まらない。昨日の夜から散々悩みぬいて、ようやく気がついたのは、またまたここに書くのも恥ずかしい前と同じお馬鹿なミスだった。

 このあいだビットハンドリングで反省したばかりなのに、また同じ思い違いである。弁解になるが、解明が長引いたのには原因がある。これまでのTinyのプログラムにそもそも勘違いがあったのに、ビット0に受信ポートがあったお陰で、何の問題もなく動いていたのだ。つまりポートをある1バイトのエリアに読み込んで所定のビットの値を調べるとき、

DATA=PORTx & (1<<PINy);  とすると、DATAには、PINyの値だけが入る。

ビット表現なら、00010000 というような値だ(y=4のとき)。データが0なら 00000000になる。これを1(00000001)と比較してもどちらも一致しない。Tinyのときは、yが0だったので、00000001で偶然、一致していたのである。Megaはピン位置が3にあり、00001000で、10進数字なら8と比較しなければいけない。

 ロジアナで、データを読んでいる最中に割り込みが上がっている様子が見えたのも混乱を増した。良く考えてみれば、スタートビットが上がっていないので読み込みルーチンを素通りしていただけである。データはプログラムとおかまいなくPCから送られ、その都度プログラムは対応するが何もしていなかった。いやいや便利になるのも良いが、情報が多すぎると言うのもまた別の問題だ。何か世間と同じようなことがここでも起きている。

もう止まらない(1/9/08)
 来週までに調査報告書を仕上げなければならないのだが、少しづつ進めては、AVRに逆戻り。まあ、2編とも構想がまとまったので執筆は一気にやろうと先送りである。テーマさえ決めれば3日もあれば原稿は書ける、とか言いながら面白いほうに手が動く。

 7日の仕事初めも、午後は秋月へ懸案のUSBシリアル変換モジュールを買出しに行く。¥950。秋月ではUSBシリアル変換ケーブルが\1200なので安いのか高いのかわからないが、Tiny26のLCD表示プログラムのデバッグにUARTは必須で(もう、これのないMCUのデバッグは非能率で考えられない)、PCにもうひとつのシリアルチャネルをつけるためこのモジュール(RS232CでなくTTLベース)はピッタリなのだ。

 これが今から思えば何でもないのだが、動くまでに1日半悩ませた。ISPで機嫌良く動いていたテストプログラムが、全く動かない。USBのドライバーは何の問題もなく、秋月の説明書どおりインストールされPC上で、COM4が出現した。TeraTermでCOM4を指定して端末を開くが全く応答がない。通信関係はこれだから嫌だ。しかし、こちらには今度は強力な武器がある。ロジアナである。次の日(1/8)早速プローブをあちこちつなぎ、データを取ろうとする前に、何気なくDTRピン(先方の準備OKを示す)をテスターで測ってみたら、何と0V。PCのターミナルを止めると5V。あれえ、制御線って負論理だったっけ。何はともあれ、AVR側のプログラム通り、Vccに直結(無条件に通信開始)してみるとデータがターミナルに出た!とりあえずモジュールが動くことは確認されたが、データは化け化けである。A3141232

 スタートビットの位置がおかしいのかと、今度はロジアナでデータをチェックする。正しく送られているようだ。同じUARTでプログラムを変えないと動かないと言うのはおかしい。ロジアナでシリアルに送られたビット列を解読するのは結構厄介で、USBの方のビットレートがUSBプラグを抜き差しする度にデフォルトの9600bpsに戻ったり、USBをさしたままだと、AVRの電源を切ってもAVRが生きていたり(後述)、何がなにやらわけがわからなくなって一旦は実験を投げ出し、調査のほうのメモを書いたりする。

 こういう気分転換が問題解決には良いようだ。何気なくロジアナのビットストリームを見ていたら、送信データの最初が1になっている。前から気になっていたのだが、chaN氏のISPを通したUARTがスタートビットを0にして動かず(RS232Cは負論理のはずなのに)1にしたら全く問題なく動いたのでそのままにしてあったことを思い出した。

慌てて参考書を調べる。データは負論理、制御線は正論理が正式とある。chaN氏のソフトUARTはどちらも正論理のようだ。しかし、これはISPライタを通したUARTで正式ではない。うーむ、このUSBシリアルは制御線も負論理になっているが、データを反転させてみることにする。ブレッドボードはこういうとき本当に楽で、引き出しから昔懐かしい74HC00を取り出し、インバータを作って送信データを反転させてみる。

 出た!勢いに乗って受信ラインも反転させる。これも動いた!いやいや長かった。この解決したときの快感はいつものことながらなにごとにも替え難い。それにしても制御線まで負論理にするのは違反だ。

 AVRの電源を切ってもUSBとつながっていると動く話である。確かにトランスやフォトカップラーで絶縁されているのでなく、線でつながっているので電気的には動いておかしくないのだが、信号線の結線だけでVccに電圧が上がって動くというのは信じられない。AVRは低電圧版なので動く(テスタで2V近くある)のはわかるが、インバータを通してもVccが上がるのである。???である。結局、インバータの電源をUSBから供給されるようにしたら止まった。インバータは動いているので信号ラインは正確な値になるからと言えば説明がつくが、何となく割り切れない。

信じた私が馬鹿だった(1/10/08)
 電源を切っても動く「お化け」の話はさておき、気持ちよくMegaがお話をするようになったので、調子に乗って、USB経由のシリアルをISPピンではなく、正式のMega168のUARTにつなぐ。これは次のTiny26のスレーブI2C通信をデバッグするには必須で、まずTiny861をISPにつなぎ、別のUSIインタフェースでスレーブI2Cをテストしてから、そっくりTiny26に持ち込んでTiny26 をLCDドライバとして役立たせる計画の一環である。(この手順はこのあいだ思いついて我ながら感心した手順。これがTiny26 のLCDドライバ開発のきっかけでもある)

 そう、Tiny26はUSIインタフェースがひとつしかなく、これをI2Cに使ってしまうと、UARTでのデバッグが出来なくなる。ロジアナはハードとして出ているピンには無敵だが、MCUの中身まではプローブすることは出来ない。UARTでPCにデータを吐き出させるのが効率が良いのだ。そのためにはMega168は別のシリアルでデータのやりとりをやる必要がある。

 と、これがまたうまくいかないのである。コードはあっけないほど簡単で、ちょっと複雑な制御レジスタの設定も、懇切丁寧なウェブの説明があるのでこれを参考にすぐ設定できた。ところが、動くには動いても字化けだらけで話にならない。コードは余りにも簡単でデバッグするようなところは何もない。だいたいMega標準装備のUARTは制御線もないフリーランニング(制御線は別のピンで作れと言うこと)なのでこのあたりを調べる余地もない。それに制御線でデータがおかしくなるわけがない。

 夕食後、調査原稿そっちのけでロジアナをつける。化けているデータを画面で見てみてもその通りのデータでこれまた埒が明かない。調べるところは制御レジスタしかないが、これまた割り込みも使わない簡単設定なので調べるところは殆どない。途方に暮れてデータシートのプログラミング例を見るともなく見ていたら、ウェブ上の情報では、「これは同期シリアル向けの設定で関係ないのでしょう...」と書いてあるレジスタの設定が非同期でもある。

 これが何と、ビットフレームの大きさを決める設定ではないか。慌ててデータシートを読み返したら、デフォルトは8ビットでなく、5ビットになっている!要するに、関係ないといわれて、この制御レジスタを全部0にしていたのが原因で、8ビットのデータをせっせと5ビットにみなして通信していたのが原因であった。

 午後遅くから始めて、夕食をはさんで6時間。コーディングは1時間足らず。MegaのUARTは何事もなく動き始めた。同じ38.4kbpsだが、ソフトUARTより早く感じる。信じた自分が悪かった。このあいだの正論理のUARTといい、情報を無条件に信じてはいけないとわかってはいても、デバッグではつい頭に血が昇って冷静になれなくなる。良い教訓ができた。

|

« オプティマイズのロジアナ | トップページ | Tiny用のソフトI2Cスレーブ »

AVR」カテゴリの記事

コメント

>連続送信のときに受信が1文字おき
という現象がどういうものか良く分かりませんが、考えられるところは、このソフトUARTは、ピンチェンジ割り込みで、受信をしていますので、この設定が疑われます。
 Tiny26(オリジナル)とMega328ではピンチェンジ割り込みの設定はかなり違い、恐らくヘッダーファイルの変更だけでは動かない可能性大です。

 また、クロックの設定も要注意です(たまたま動くときあり)。アセンブラーのソースのボーレート設定も確認してください。

投稿: がた老 | 2012年8月21日 (火) 14時55分

ADC_TESTを使用してATMega328でソフトウェアUSARTを動かしてみました。やっと送受信できるところまできたのですが、連続送信のときに受信が1文字おきになってしまってしまいます。このような現象についてなにか調べるポイントがあれば教えてください。
ATMega328P、内臓8MHz
よろしくお願いいたします。

投稿: よし | 2012年8月18日 (土) 17時23分

コメントを書く



(ウェブ上には掲載しません)


コメントは記事投稿者が公開するまで表示されません。



トラックバック


この記事へのトラックバック一覧です: Mega168のUART:

« オプティマイズのロジアナ | トップページ | Tiny用のソフトI2Cスレーブ »