avr-gccのバグらしき現象にぶち当たりました。

現象は、USARTの受信データ読み込み関数を関数を呼び出す所と異なるファイルに定義していると連続受信時にリセットがかかったかの様な状態になる事です。

MCU状態レジスタ(MCUSR)の値を出力してリセット要因を見てみましたが、リセットされた形跡がありません。なのでJMP命令等で突然飛ばされている感じです。割り込みは禁止にしっぱなしなので割り込み関連ではないと思われます。

今のところ、USART受信関数の位置を変更するだけで現象が発生しなくなっているが、本当の原因が何なのか分っていないのでいつまたこの現象に遭遇するか心配です。

現象発生前後で大きくプログラムの構成を変えたので原因解明に1週間以上を費やしてしまいました…。原因を追い詰めたファイルを置いておきます。


開発環境:WinAVR-20090313
使用マイコン:ATmega644P
使用リソース:USART 0ch(非同期、19200baud)

現象発生ソースコード: winavr_usart_bug_generate.zip
現象発生しないソースコード: winavr_usart_bug_not_generate.zip


追記 2009.06.10
バグではなかったみたいです。
詳細はこちら

ATmega644PとRS-232C変換器のテスト(2)

RS-232Cの通信は SDC・トンランスポータ の作成時のデバッグ用としても必須なのでもう少し触ってました。

RAM内のデータを16進数表示でダンプできるようにしようとしていたところ、何故か電源ON後の1文字目が正常に表示されません。電源ONして初期化後、いきなり送信していたので232CドライバICの電源電圧がまだ安定していないのかと思い、1秒まってから送信しても現象は同じです。

電源ON/OFFを繰り返していると正常に送信されている時もあります。
前回送信した時の最後に何かよからぬ情報が出ているのか? と疑い思案に暮れていましたが、どうも電源ON/OFF時の電圧のふらつきが犯人のように思えてきました。

で、簡単な対象方法としてパリティを付加して送ってやると、上記の現象は発生しなくなりました。
パリティ」って重要なんだと改めて認識させられました。

ATmega644PとRS-232C変換器のテスト

SDカード・トランスポータ作成の前に、ATmega644Pの動作テストを行っています。

uart_test_01

先ずは簡単な所から…といいつつ、前回作成した RS-232C変換器のテストも兼ねて UARTの受送信を試してみました。

案の定というか、久しぶりにAVRに触ったので一発では動いてくれませんでした。
先ずはじめに、avrsp.exeを立ち上げて、デバイスチェック(-r)をしようとしたら"Unknown Device" と表示された。

これから推測するに、ATmega644Pと通信は出来ているが、取得したデータに avrsp が対応していないということではないかとみた。で、よくよく考えてみるっと、今まで使ってきたデバイスはATtiny2313/V, ATtiny26L と比較的昔からある物で、2006年からAVRを触り始めて以来ライターを更新していなかった。

ChaNさんのHPに行くと案の定更新されていて、ATmega644Pには2007年3月18日に対応されている。
早速DLし、所定の場所に保存して実行すると…認識しました!!
試しにヒューズビットを見てみると…見れます。

あれれっ、供給クロックが1/8になってるぞ!?
こいつもですか。確か、ATtiny2313もこのビットがあって最初は望んだクロックが出てなくて悩んだものです。

ヒューズビットを書き換えて、ソースファイル(ATmega644P 8MHz UART)をコンパイルし、書き込みます。
いざ実効!! ってしますが、先にも書いたように正常に動いてくれません。文字を送信し続けるだけの簡単なプログラムなのに…。

先ずはソフトを疑ってみます。が、どこをどうみても確からしいです。
ふと、MakefileのMPUの種類に"ATmega644"を選択していたことを思い出しました。
WinAVRについてくる "MFile" というソフトで選択できたのが "ATmega644" でした。そう、"ATmega644P" ではないんですね。これってインストールしているWinAVRのバージョンが古いのではないでしょうか? と思い、最新版(20090313)をインストールして "MFile" を実効してみると、選択に "ATmega644P" が現れてきました。

これで問題は解決したかな。
コンパイルしなおして書き込んで実行!!
やっぱり現象は同じです。'A'という文字を送信しているだけなのにまったく違う文字が出てきます。それも設定したボーレートではなく、1/4位のボーレートで。意味不明です。

これだけでは分らないので、オシロスコープを引っ張りだしてきて送信されている波形を確認してみました。そしたら、正常に送信できている時とそうでない時があります。どうやら、接触不良が原因だったみたいです。

PC上で受信環境を立ち上げつつTx端子周辺の線を触ってみると、ハイパーターミナル上に正常に'A'が送信されてきました。

今度は受信の確認です。
文字を受信するとそこから1引いた文字を返信するプログラムにして実験しました。
今度はすんなりと受送信ができました。

接触不良で1日無駄にしてしまいました……。


ブレッドボード上に組む時に水晶振動子のサイズは微妙です。
なのでこんな(↓)アダプタを作って使用しています。これ1つで水晶振動子(+セラミックコンデンサ)とセラロックの両方に対応しています。

clock_adapter

ATMELのライター標準ピン配置

ATMELのライターのピン配置ですが、未だに TOP VIEW なのか BOTTOM VIEW なのかが分らない。
たぶん、TOP VIEW であっているのだと思うが…。

純正のライターを購入すれば解決するのだろうが、既に作ったので新たに購入する気はさらさらないので未だに解決していない。一応、私が作ったライターは TOP VIEW であるとして作成しています。


atmel_pin_header

黒ねこ時計 くろック D02
プロフィール

jujurou

Author:jujurou
運営HP:チャコの部屋
Twitter:jujurou

カレンダー
01 | 2020/02 | 03
- - - - - - 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
最新記事
最新コメント
カテゴリ
ユーザタグ

ぺるけ Linux RaspberryPi 三段化 6P43P-E 全段差動プッシュプル トランジスタ式ミニワッター 6P43P TRminiWatterPart4 MPD DAC OpenOCD FON2405E buildroot イーサネットコンバータ FM3ペリフェラル Bluetooth BeagleBoneBlack ODROID-U2 library FM3評価ボード mingw OpenGL 6N6P bitbake KiCad 計測 プリアンプ Edison VMware FM4 ミニワッター シングル TL-WR700N 

月別アーカイブ
ランキング

FC2 Blog Ranking

カウンター
検索フォーム
リンク
RSSリンクの表示
QRコード
QRコード
ライセンス
クリエイティブ・コモンズ・ライセンス
Twitter