Saturday, September 13, 2014

ATmega328Pファームウエアー書き込み

私はMakefileを作って、ARDUINO対応の16MHzファーム書き込みに対応しています。

このMakefileファイルは https://github.com/osamuaoki/avrdude-friend にあります。

$ make set

などとシェルから入力して使ってください。(avrdudeやarduinoパッケージはインストールする必要ががあります)

ここで理解するべき基本は:
  • チップの初期状態は、8MHzの内部発振器をプリスケーラーで1/8に分周したのをMCUのクロックで使っている。
  • ARDUINO用の状態は、16MHzの外付クリスタル発振器をそのままMCUのクロックで使っている。
  • ARDUINO用のファームウエアーをフラッシュに書いたあと読み出せないようにLOCKしている。
  • 読み出せないようロックされたのを外すには全消去(erase)しかない。

MCUがこれで消去して初期化できなくなるケースとして、何かの間違いで外部クロック使用に設定してしまうことがあるそうです。その際はクロックピンに何らかのクロックをいれればなんとか対応できます。

これよりややこしい壊し方をした際には、RESETに12Vをかけてプログラムする高圧パラレルプログラミング(ATINY等では高圧シリアルプログラミング)なのですが、滅多に無いので新しいチップを買う方が安いですね。

Linuxの基本が分かっていればMakefileの意図するところはわかりますよね。分からないときは


などを読んでください。

Avrdude 6.1-2 がFT232Rには必要

FT232Rベースのプログラマーを使おうとして最近動かなくなったと言う事ございませんか?

少なくともLinux系ではそのようです。

avrdude中のこのコード部分は「すzのAVR研究」にある「FT245R/FT232R で avrdude (2)」と同じようです。 http://suz-avr.sblo.jp/category/780472-1.html 「すzのAVR研究」からコードがマージされたのがバージョン6以降です。でもどうも最近動かないようでした。

結論としては、どうも使用するスレッドライブラリーでバージョンアップがあり、「すzのAVR研究」も含めてタイミングがルーズなところでアップデートしたライブラリーを使うとレグレッションでコケるようです。これはUPSTREAMで問題になってい、パッチもありました。このパッチを私のところで当てると一発で問題解決しました。

DEBIANにパッチ付きでレポートしたところ、すでに修正されました。Debian/Ubuntuなら6.1-2以降のバージョンなら修正済みです。あと一週間もすればDEBIANのTESTING環境やUBUNTUで使えるようになるでしょう。
 https://bugs.debian.org/760764

アップストリームもこのパッチを適用したようなので、まもなくすべて修正されるので安心してください。
 https://savannah.nongnu.org/bugs/?40086

実の所、まずTTL-232R-5Vをプログラマー用に買いましたが、それを確認する前に安さに引かれてプログラマー機能内蔵のUncompatinoも買ってしまいました。さてUncompatino用の部品セットに入っているATMega328PにはARDUINOのファームが入っていないので自分で書き込む必要がありAVRDUDEを起動して動かなかったときには焦りました。

ちなみに、FT232R用のコードはft245r.cとft245r.hです。avrftdi.cなどでは無いようです。

FT-232Rベースのプログラマー作成方法集

ATmega/ATtinyなどのファームウエアーを最初に書き込む際には、専用のプログラマーが必要です。

もちろんARDUINOを一つ持っていれば、教科書通り新品のATMega328Pにブートローダーを書き込むことができます。http://arduino.cc/en/Tutorial/ArduinoISP

何かの拍子でARDUINO上のATMega328Pを壊すと回復不能のようで不安ですよね。ARDUINOに頼らずにプログラマーを確保する一番簡単な方法はFT-232Rを使うプログラマーです。この際ホストPC側のプログラムにはAVRDUDEというプログラム(6.1-2以降)が必要です。(この話は後で書きます)

ここで重要なのは、FT232Rというのは単なる非同期シリアルへの変換だけでなくかなり高機能な同期シリアル変換機能を持っているということです。この機能を使うと「遅い」といわれたシリアルポートを使ったbitbang(ビット叩き)とは異次元の高速書き込みができることです。

FTDI製のFT-232Rという石はUNOになる前のUSBのARDUINO duemilenoveには乗っていて、この場合うまくジャンパー飛ばしてつなげばプログラマーとして使えるとのことです。
 http://www.geocities.jp/arduino_diecimila/bootloader/index_en.html

この特性に注目した設計をされているUncompatinoというARDUINO (UNOの前の)Duemilenove (半)互換ボードは、通常のICSPコネクターはないもののボード上のFT232Rチップを使ってブートローダーを書き込めるようにできたショートピン2*4本が立っています。(たしか基板+部品で1300円程度とお買い得ですが、表面実装のFT-232Rの半田づけがあるので中上級者用)
 http://akizukidenshi.com/catalog/g/gP-07487/
 http://akizukidenshi.com/download/ds/akizuki/k6096_manual_20130816.pdf

またTTL-232R-5Vという、既製のUSBからTTLレベル非同期シリアル変換ケーブルもプログラマーとして使えるはずです。
 http://www.ftdichip.com/Products/Cables/USBTTLSerial.htm
 http://www.ftdichip.com/Support/Documents/DataSheets/Cables/DS_TTL-232R_CABLES.pdf
具体的には上記ケーブル(私は秋月で1,580円で購入)とICSP用の6PINメスが両方についたケーブル(私はマルツで【LFCBL06-01】6ピンフラットケーブルを154円で購入)を購入します。6PINにコネクターのみを探してもまず見つからないし高いので注意しましょう。そして2列のピンヘッダーを3+1+9=13本の幅で切り出しこれの後ろ側を半田付で結線するだけでアダプターになります。(コネクター間に1本分余裕が要ります)

 # TTL-232R GND 1 Black  -> ICPS GND   (6 pin)
 # TTL-232R CTS 2 Brown  -> ICPS MOSI  (4 pin)
 # TTL-232R VCC 3 Red    -> ICPS VCC   (2 pin)
 # TTL-232R TXD 4 Orange -> ICPS RESET (5 pin)
 # TTL-232R RXD 5 Yellow -> ICPS SCK   (3 pin)
 # TTL-232R RTS 6 Green  -> ICPS MISO  (1 pin)



実写真へのリンク: 配線直後 と 安定化後(ホットメルトの接着剤で固めて配線が切れたりするのを防止。半田付け/接着剤の両工程はピンヘッダーをブレッドボードなどに刺し固定して行うこと。途中で動かすとピンが動いてしまいます。)

GNDとVCC以外はAVRDUDEの設定でなんとでもなるので、配線しやすいようにしてください。(以下の表のD0-D7の数字をavrdude.confや~/.arduino/.avrduderc内のprogramer設定で使用します。ICの脚番号、ソケットの番号とうややこしいので要注意。)

FT232RL
FT232RL
Bit-banging data
Diecimila/Duemilnove
TTL-232R
ttl232r Adapter
Uncompatino
TXD (1)
D0

4 ORANGE
5 (RESET)
→ 2 ATmega
RXD (5)
D1

5 YELLOW
3 (SCK)
→ 3 ATmega
RTS# (3)
D2

6 GREEN
1 (MISO)

CTS# (11)
D3
X3-1
2 BROWN
4 (MOSI)
o o→ MISO
DTR# (2)
D4




DSR# (9)
D5
X3-2


o o→ SCK
DCD# (10)
D6
X3-3


o o→ MOSI
RI# (6)
D7
X3-4


o o→ RESET
VCC


3 RED
2 (VCC)

GND


1 BLACK
6 (GND)


Arduino main MCU side
ATMega328
ICPS
Arduino
MOSI (17)
4
J3-4 (D11)
MISO (18)
1
J3-5 (D12)
SCK (19)
3
J3-6 (D13)
RESET (1)
5
Switch
VCC
2

GND
6


AVRDUDE: -c ttl232r と指定してください。本結線に合わせた設定になります。
(-c ft232r では「Device is not responding to program enable. Check connection.」といわれて動きません。ご注意ください)