PR

Atmel Studio + USBasp + avrdude でAVRに書き込む

Atmel Studio 7.0でビルドしたバイナリをAVRに書き込む方法をまとめておく。なお、現在は名称がMicrochip Studioに変っているがやり方は同じ。

書込みツール

AVRにプログラムを書き込むには、ツール(ハードウェアとソフトウエア)が必要。ハードウェアは安価なUSBaspを使うことにする。USBaspは公式サイトで回路図も含めて公開されている。

USBaspの公式サイトに、対応しているソフトウェアがリストアップされている。ここでは、avrdudeを使う。ダウンロードサイトはこちら。

現時点は、バージョン6.3が最新。Windows用のコンパイル済みファイルは「avrdude-6.3-mingw32.zip」。これをダウンロードしておく。

 

USBaspのドライバ

インストール

OSはWindows 10(Pro 64bit)で行った。

USBasp本体をPCのUSBポートに差し込めば自動的に認識される。

『デバイス」の中に見えるようになる。しかし、使えるようにはなっていない。

そこで、USBaspの公式サイトで紹介されているZadigの出番。

ここからダウンロートする。インストールは不要。ダウンロードしたzadig-2.4.exeをダブルクリックすればそのまま動く。

こんなふうにUSBaspが認識されるはず(もちろん、USBasp本体を挿しておくこと)。

ちょっと余談。ここには、ドライバがインストールされていないものが出てくる。そのため、一旦、この作業を行った後(ドライバがインストールされた後)では、USBaspは出てこない。ドライバを再インストール(変更)する場合は、Optionsの中の「List All Devices」をチェックすれば、すべてのデバイスが出てくるようになる。

話を戻して、ドライバのインストール。

libusb-win32 (v 1.2.6.0)を選び、「Install Driver」を押す。これでドライバのインストールが始まるが、少々時間がかかる。「応答なし」になったりしてちょっと不安になるけれど、そのまま待つ。手元のPCで数十秒程度だったかな?

これでドライバのインストールは終了。

「ドライバーは使用できません。」の表示が消えている。上手くいかない場合は、libusbKやWinUSBを試してみる。

動作確認

念のため、ドライバが動作することを確認しておく。

  1. 先にダウンロードしておいたavrdudeのZIPを展開する。
  2. コマンドプロセッサ(コマンドプロンプト)を起動し、avrdudeを展開したディレクトリに移動する。
  3. avrdude.exeを実行する(引数なし)。
  4. 問題がなければ、avrdudeのヘルプが表示される。

    問題がある(ドライバがインストールされていない・間違っている)場合は、avrdudeが動作せず、エラーが表示される。
  5. USBaspが認識されるか確認しておく。”avrdude.exe -c usbasp”と入力すると、次のように表示される。

    これは本来はAVRのデバイスを指定するようにとのエラーメッセージではあるけれど、USBaspが認識されていることの確認には使える。

ここまで見ておけば、多分大丈夫。

このような感じで、avrdudeはコマンドラインで使用できる。以下、参考になるサイト。

Atmel Studioへのavrdudeの組込み

avrdudeはコマンドラインで使えるとは言え、やっぱり面倒。そこで、avrdudeをAtmel Studio 7.0の中から使えるように設定する。「使えるように」とは言っても、本格的に連携して何かができるようにと言うようなものではなくて、Atmel Studioから見て外部ツールとして起動できるようになるだけだけど。それでも、ワンタッチでプログラムの書き込みができるようになるので便利。

Atmel Studio 7.0自体のインストールはこちらの記事。

では、Atmel Studio 7.0にavrdudeを組み込む方法。

  1. Atmel StudioのToolsタブの「External Tools…」を開く。
  2. ここに必要なコマンド等を書き込む。

     

    • Titleは自分でわかり易い名前。AVRのデバイスごとに登録することになるのでそれを踏まえた名称や、プロジェクトに対応するものにすると良いだろうと思う。ここでは、デバイス名にしておく。
      USBasp ATtiny85
    • Commandはavrdude.exeの場所をフルパスで記入する(インストールした環境に合せて変更する)。
      D:\tools\AtmelStudio\avrdude-6.3-mingw32\avrdude.exe
    • Argumentsはavrdudeに与える引数。次の通り。
      -p t85 -v -v -c usbasp -P usb -U flash:w:"$(ProjectDir)Debug\$(TargetName).hex":i
      • -pはデバイスの指定。ATtiny85の場合は「t85」。その他のデバイスの場合は、上のavrdude + USBaspの動作確認でで表示されたものを参考に。
      • -vはメッセージのレベル。数が多ければ多いほど実行時に様々なメッセージが表示される。ここでは二つ付けている。お好みで。
      • その他は上の通り。コピペでOK。
      • 【補足】 クロック分周器を使わない場合はフューズビットの指定(-U lfuse:w:0xe2:m)も入れる(出荷時は分周器設定がなされており1/8になる(8MHzのつもりが1MHzでの動作になる))。
    • Use Output windowにチェックを入れる。これでavrdudeからのメッセージがAtmel Studio内に表示される。チェックを入れないと別のコンソールが立ち上がってメッセージが表示されるが、avrdudeの終了とともにそのコンソールは自動で閉じられるので、実質、読めない。

      これで「OK」を押せば、設定完了。Toolsタブ内に登録したコマンドが見える。

      このまま選択すれば、即座に起動する。

追加も同様。Toolsタブの「External Tools…」を開く。

「Add」を押す。

後は、上と同じ手順。ATtiny13Aの場合は、-pで指定するデバイス名は「t13」(aは付かない)。必要に応じて、「Move Up」、「Move Down」で並び順を調整する。

Toolsタブ内に登録したコマンドが表示される(追加されている)。

avrdudeを直接呼び出す格好で上手く書き込めない場合は、バッチファイルを組んでそれを組み込むようにするといいらしい。

 

使い方

まずは、Atmel Studioでプロジェクトをビルドする(当然、エラーがないように)。

続いて、ターゲットデバイスとUSBaspを接続する。

接続(向き)に充分注意して。

後は、上に書いた通り、Toolsタブ内に出てくるものを選ぶだけ。

これですぐに起動される。

(上の通りに「Use Output window」にチェックを入れていれば)Atmel Studio内に動作時のメッセージが表示される。

もし、下のようにエラーになってしまった場合は、もう一度書き込んでみる。それでもダメな場合は、USBaspを一旦PCのUSBポートから抜いて、挿し直す。いまのところ、これで解決している。

別のツール(ソフトウェア)

USBaspはavrdude以外のツールでも使用できる。手元で試したものでは、PROGISPでも動いた(書き込めた)。

ただし、PROGISPの公式サイトは消滅しているようなので、ここでは「動いた」という事実の紹介に留める。「progisp 使い方」や「progisp download」などで検索すると情報は見つかるはず。

コメント

  1. JJ1SWI 香川 より:

    「AVR最初の一歩」のキットのプログラムを書き換えてみました。
    書き込み時「もし、下のようにエラーになってしまった場合は」のポップアップはでないものの、これと同じ

    Would you like this fuse to be changed back? [y/n]

    の入力待ちとなり書き込みを終了できません。
    なんどやっても、USBを差し直しても同じです。

    「Use Output window」のチェックを外すと一瞬コマンド窓が出て閉じられ、書き込みは正常に行われました。

    コマンドラインからの実行でも [Y/N] の入力プロンプトもなく、正常に書き込めました。

    (プログラムはこのブログにあったキット付属のAVRのソース?の、LED信号を反転(排他的論理和)の1行のみをコメントアウトしたもので試しています。)

    • jh4vaj より:

      すみません。私のところではその現象は起きていないです。

      Atmel Studioからのavrdude呼び出しでは上手く行かず、直接叩くとOKだという現象はJI1PVVさんのブログで報告されています。

      http://ji1pvv.cocolog-nifty.com/blog/2019/09/post-982905.htm…

      しかし、これは別のAVR(ATtiny13A)を使った場合ですので、別の話かもしれません。

      試しに、ATtiny85をお送りしましょうか?

      • JJ1SWI 香川 より:

        JI1PVVさんのブログ、見ました。
        石も違いますし、こちらでは一回直接叩いてOKとなってもAtmel StudioはNGなのでやはり別の現象のようですね。
        AVRは買い足すつもりでいるので送付の必要はありません。

        ありがとうございました。

        • jh4vaj より:

          承知しました。AVRを換えた際の結果を教えてもらえると助かります。

  2. JJ1SWI 香川 より:

    ATTINY85を2個入手し、試してみましたが同じでした。

    ただ「Use Output window」のチェックを入れなければAtmel Studioでも書き込めました。
    このとき「Close on exit」のチェックを外せばコマンド窓が自動的にとじないのでメッセージは読めます。

    USBaspのファームのアップデートを促すメッセージがでているので、アップデートしてみない気もしますが。。。。。(汗)

    なお13Aでも試してみましたが、全く同じですね。

    • jh4vaj より:

      変化なしですか。USBasp自体に原因があるのかもしれませんね。迷惑でなければ、USBaspを送りますので送り先をお知らせ下さい(Twitter DMで)。違いがあるか見てみたいです。

      USBaspのアップデートはなぜか上手く行きませんでした。失敗すると二度と使えなくなり…。二つ潰しました^^;

  3. 7M4KSC/JE3AJR より:

    こんにちは。付属のUSBaspですが、このサイトの写真では、内部スイッチが5V側になっていますが、送られて来た物は3.3V側になっていましたので、ブルーのケースを開けてスイッチを切り替えると、Device signatureを正常に読む様になりました。なお、圧電サウンダーを切り離しておくと、verify error無しに100%書き込めるようになりました。

    • jh4vaj より:

      情報ありがとうございます。そう言うことなんですね。

      USBaspに関しては、入手したものをそのまま未開封でお送りしていますので、内部のスイッチがどうなっているかはわかりません。スイッチの状態を確認するようにと書いておいた方がいいかもしれませんね。

      圧電サウンダに関しては、多分電圧がかかれば鳴ると思いますので、10kΩ程度を間に入れておくと良いのかもしれません。もしくは、10kΩで+5Vに吊っておくとか。いずれ試してみようと思います。

      • jh4vaj より:

        実際にやってみたところ、上に書いたような方法ではどちらも上手くいきませんでした。プルアップではまったくダメで、途中に10kΩを挟むのなら書込みは大丈夫ですが、稼働時に音が非常に小さくなってしまいました。抵抗値を下げれば音は出るようになりますが、そうすると今度は書き込みが失敗します。両立できるところは見つけられませんでした。

        結局、JP3をジャンパにして、書込み時は圧電サウンダを切り離さなければならないようです。

        当初、間違いで圧電ブザーを使っていたときには大丈夫だったのですが、圧電サウンダにしてからは上手く動かなくなっていたようです。

        改めて情報を頂いたことに感謝します。

        • 7M4KSC/JE3AJR より:

          こんばんは、ご確認とWEB修正、お手数をおかけしました。
          ありがとうございました。
          なお、ブルーのUSBアダプターはもちろん未開封でしたので、
          どうも工場出荷時に、内部スイッチが、5Vだったり3.3Vだったりするようですね。
          ここのWEBの写真の通り、5V側に倒れている事を確認との注意書きを入れておいた方が良いかもしれません。(たまたま私のだけ、だったかもしれません)

  4. y.t. より:

    過去の記事にすみません.記事の通りに進め,以下のようなログが出たのですが,何か原因はわかりますでしょうか?
    avrdude.exe: auto set sck period (because given equals null)
    avrdude.exe: warning: cannot set sck period. please check for usbasp firmware update.
    avrdude.exe: error: program enable: target doesn’t answer. 1
    avrdude.exe: initialization failed, rc=-1
    Double check connections and try again, or use -F to override
    this check.

    avrdude.exe done. Thank you.

    • jh4vaj より:

      まず、最初に、ハッキリした解決方法はわからないと申し上げておきます。すみません。

      前半の、

      avrdude.exe: auto set sck period (because given equals null)
      avrdude.exe: warning: cannot set sck period. please check for usbasp firmware update.

      はUSBaspのファームウェアのアップデートを勧めるワーニングですので、とりあえずは、無視(放置)で良いと思います。

      問題は後半。

      avrdude.exe: error: program enable: target doesn’t answer. 1

      これはターゲット(ATtiny)が応答しないと言っています。
      配線を今一度するくらいしか思いつきません。

      もし、Atmel Studioに組み込んで使っているようでしたら、avrdude.exeを直接使ってみた方が問題の切り分けがしやすいかと思います。

      avrdude.exe -c usbasp -P usb -p t85

      ターゲットと通信できれば、それらしい応答が返ってきます(フューズビットを読み出します)。
      「-p t85」はATtiny85の指定ですので、ご使用のターゲットでバイズが違うならそれに合わせて変更してください。

      また、

      avrdude.exe -v -c usbasp -P usb -p t85

      のように「-v」をつけるとより詳しいメッセージを表示してくれるので、問題解決のヒントが得られるかもしれません。

      • y.t. より:

        迅速な対応ありがとうございました.原因はファームウェアのアップデートでした.新しいUSBを使ったら接続できました.
        ファームウェアのアップデートは特に必要ないのですかね?何か気になってしまいます.

        • y.t. より:

          【追記】
          何度もすみません.何が原因だったかを補足いたします.
          上述したファームウェアのアップデートについては,ArduinoIDEを用いてプログラムを書き込む際に
          avrdude: warning: cannot set sck period. please check for usbasp firmware update
          という警告を生じさせないために行いました.(実際にファームウェアをアップデートするとこの警告は消えました)
          しかし,この記事の手順を踏んでavrstudioでファームウェアを書き換えたusbを用いてしまうと,認識してくれないようです.

          • jh4vaj より:

            状況がよくわかりませんが、問題が解決したのならOKです。
            解決していないのであれば、先に書いたようにavrdude.exe単独で使って問題を切り分けることをお勧めします。