1チップマイコン AVR で、遊んでみる

1チップマイコン AVR で、遊んでみる                               [2012.03.29]

1.Arduinoで、エラーになりスケッチが書き込めなくなった
  アマチュア無線のトランシーバーから出る周波数表示情報から自動的にアンテナを切り替えるインタフェース
  の開発を始め、基本的な動作がOKになった。 周波数バンドが変わった時にブザーを瞬間鳴らす等のおまけ
  機能のデバッグをしていたら、突然に次のエラーメッセージが出て、プログラムの書き換えができないように
  なった。
  3日がかりで試行錯誤の結果、やっと修復できた。原因が論理的に説明できないので1つの
  事例紹介と思って、見てください。これで、解決した方は一報いただけると今後の励みになります。
  [ardude: stk500_getsync(): not in sync: resp=0x00] ←0x00は、0x98など固定ではなかった。

2.切り分け開始
  (1) まずネットで検索開始
    上記のエラーメッセージで、検索すると内外に非常にたくさんのHIT。珍しい事象じゃなかったんだね。
  (2) やってみたけど解決しなかった方法
     ・リセットボタンを10秒以上押したまま、USBを抜いて、入れる。
     ・CPUの交換      ・その他いろいろ
  (3) 一時的に解決
     共立のWRT-3で、Fuse-bitとBOOT-Loaderの再書き込みを実施。1回だけは、Arduino-IDEで書き込み
     ができるが2回目からは元に戻って、書き込みできないで同様のエラーメッセージが出る。
  (4) リセット回路にロジックチェッカー(LED+抵抗)を接続して、書き込みを行ってみる
    全くLEDが目視では点灯しない。リセット回路を疑い、DTRからRESET-PIN間の0.1μFのコンデンサ
    容量を変えて試みるが解決しない。
  (5) Fuse-Bitを疑い、色々な組み合わせをやってみるが解決せず
    当然だが、メーカーのデーターシートを見ながら実施した。おかげで不明だったFUSE-Bitの設定がある
    程度、見えてきた。
  (6) 何なのか訳が分からないサイト
    Net上に度々出てくる「千秋ゼミYCIT版AVRdude」に行ったが全く意味不明のサイト。学者の独りよがり
    にしか思えなかった。
  (7) WindowsXPに切換えて確認
    PCは、Win7-64bitとWinXP-32bitのデュアルブートにしているので、XPに切替て確認したが解決なし。
     ここ以降はWindowsXPで行っています。。

3.解決!!
  (1) 探している内に次のSiteにたどり着いた
     http://www.geocities.jp/arduino_diecimila/bootloader/index.html#top
  (2) ここに書いてある次をダウンロードする
    すz氏制作のFTDI BitBang AVRライタソフトavrdude-serjtagです。 serjtag-0.3.zip
    ライタソフトのコンフィグ・ファイルです。 avrdude.conf
     avrdude用のGUIラッパーです。 avrdude-GUI-1.0.5.zip
  (3) avrdude-GUI
     version 1.0.5は、avrdude-serjtagをコントロールするGUIで、FUSE-Bitの制御は
     できたがBoot-Loaderの書き込みはエラーになってできなかった。
     やむなくGUIはあきらめて、コマンドプロンプトからavrdudeを実行する。
     書き方は次のPageに書かれている。
     この記事は、168で書かれており、168Pの場合は、記事中の168のところを168pにする。
     http://www.geocities.jp/arduino_diecimila/bootloader/index_old.html
     最終的にこの記事のおかげで解決に至った。Kimio Kosakaさんありがとうございました。
  (4) 私がタイピングした内容は下記
    1.作業ディレクトリーへ移動 (私のWindowsインストールDIRはE:です、適宜変更してください)
      >cd E:\Program Files\avrdude-serjtag\binary
    2.低速でFuse-bitを書き込む (ロックビットを除く)
      >avrdude.exe avrdude -c diecimila -P ft0 -p m168p -t -B 4800
      まず,チップを初期化(erase)します
        avrdude> erase
      次に各ヒューズビットを書き込みます
        avrdude> w efuse 0 0x00
          >>> w efuse 0 0x00
        avrdude> w hfuse 0 0xdd
          >>> w hfuse 0 0xdd
        avrdude> w lfuse 0 0xff
          >>> w lfuse 0 0xff
        avrdude> quit
3.高速クロックで動作するか確かめます
  ヒューズビットが正しく書き込まれていたら高速クロックで動作する。
        >avrdude -c diecimila -P ft0 -p m168p -t
         avrdude: BitBang OK
         avrdude: pin assign miso 3 sck 5 mosi 6 reset 7
         avrdude: drain OK
          ft245r: bitclk 230400 -> ft baud 115200
         avrdude: AVR device initialized and ready to accept instructions
         Reading          |   ##################################### |
100% 0.00s
         avrdude: Device signature = 0x1e940b
         avrdude> quit
4.コマンド・ライン・モードでブートローダを書き込みます
  Boot-Loaderをあらかじめ、\Program Files\avrdude-serjtag\binary内にcopyしておきます。
  >avrdude -c diecimila -P ft0 -p m168p -U flash:w:ATmegaBOOT_168_diecimila.hex
       (初期化、書込み、べりファイを行います。)     
5.ロックビットを書き込みます
  >avrdude -c diecimila -P ft0 -p m168p -t
  avrdude> w lock 0 0x0f
  >>> w lovk 0x0f
  avrdude> quit
  一旦,DicimilaからUSBケーブルを外します。X3とICSPの配線を外します。
  再度,DicimilaにUSBケーブルを接続します。リセット・ボタンを押します。
4.328について
  終わってから見つけたのですが、328の場合は、次のPage書かれている方法で多分OKだと思います。
  私が168Pで、行ったのと同じ感じです。
   http://d.hatena.ne.jp/toshi_hirasawa/20110204/1296804870
5.さらに原因を考察する
  何回かIDEから書き込んでOKの確認後にしばらく本当の原因について考えてみました。
  原因は、ハードウエアではない。Fuse-Bitの設定でもない。
  思いついたのは、今回のIDEから書き込みエラーになるのは、何らかの原因でメモリーエリアに残っている
  プログラムの消去を失敗しているのではないか??ということです。
  (1) 追試
     共立のWRT-3で、同じことをやってみた。まず、Chip確認が終わったら。「消去」を行う。
     その後、Fuse-Bit、boot-Loaderの書き込みをする。
     結果はOKです。その後は、何回でもIDEから書き込めるようになりました。
  (2) 現状での結論
     何回も同じChipにスケッチの書き込みを行っている内に何らかの条件で、フラシュメモリー上にゴミが
     残ってしまう。
     その後、書き込みに行くとゴミがあるためWriter(CPU?)は、異常の検出をしてエラーメッセージで終わる。
     CPUのフラッシュメモリー内を完全に消去してから、Fuse-BitとBoot-Loaderを書き込むと正常に戻る。
     コマンドプロンプトからavrdude.exe を実行して解決した時と、共立のAVRWRT-3でフラシュメモリーの
     消去を行った時は同じ要因だったのではないかと思いました。
     まだ、これで完全解決なのか不明ですが、手持ちの168Pについて3個が書き込めない同じ症状でしたが
     3個とも復活しました。
     要するに、おかしくなったら、フラッシュメモリーを完全消去して書き直せば好いってことでした。
     手順は消去後に①Lock-Bit:FF、 ②Fuse-Bit書込み⇒E:F8、H:DD、L:FF ③Lock-Bit:CF です。
     これは、168Pの場合で他のCPUは個々に数値を合わせてください。
     328Pの32TQFPとDIPは、①Lock-Bit:FF、 ②Fuse-Bit書込み⇒E:FD、H:DA、L:FF ③Lock-Bit:CF
     2560の場合は、、①Lock-Bit:FF、 ②Fuse-Bit書込み⇒E:FD、H:D8、L:FF ③Lock-Bit:CF
     でOKでした。Fuse-Bit⇒E:F8、H:DD、L:FF では、1回目はOKですが2回目から書けなかったです。
      「困ったら基本に戻れ」 先人の教え通りの結果にがっかりでした