You are here

ATMEGA644PでArduino

ATMEGA644Pを搭載したAVR-DEV-AM644RXのArduino化(Sanguino化?)を試みてみました。すでにAVR-DEV-AM644RXがお手元にある方は、すぐにでも試してみてはいかがでしょうか。

グラフィックLCDなどを既にお持ちであれば、AVR-DEV-AM644RXの基板とATMEGA644PだけのセットAVR-BASE-AM644RXで手軽にトライアルできます。

回路の追加

AVR-DEV-AM644RXをArduino化するためのハードウェアの修正はきわめて簡単で、10分もあれば終わってしまいます。まずは、Sanguinoの回路構成を確認してください。

作業内容は以下の通りです。

  • 16MHzのクリスタルの追加
  • ブートモニタ用のLEDの追加
  • スケッチのアップロード時のオートリセット回路の追加

まず、Arduinoのタイミング関係の基礎となる16MHzのクリスタルとそのセラミックコンデンサを追加します。

次に、ブートモニタ用のLEDをPB0(PIN1)に追加します。LEDには、電流制限用の1KΩ程度の抵抗を直列に接続し、PB0に1が出力された場合にLEDが発光するように接続します。AVR-DEV-644RXにはもともと2個のLEDが実装されていますが、以下のような理由で新たにLEDを追加します。
Sanguinoのソフトウェアパッケージに同梱されている標準のブートローダは、その稼働状況を示すために、PB0に接続されているLEDを利用するように構成されています。AVR-DEV-644RXの標準のLEDは他のピンに接続されているため、Sanguinoの標準のブートローダでは利用できません。そこで、ブートローダーの書き換え(といってもピンマッピングの1行程度の修正?)をしなくて良いように、LEDを追加しました。
なお、AVR-DEV-644RXのPB0は、もともとグラフィックスLCDのR/W制御用に割り当てられていますので、ブートプロセスが終わったスケッチ実行時には、グラフィックLCDの制御に用いられ、その状態が追加されたLEDに表示されることになります。

最後に、スケッチのアップロード時にオートリセットが実行されブートローダーが自動実行できるように、リセット回路を追加します。
Sanguinoは、シリアルのRTSをリセットのトリガーに利用しているようですが、ここでは、Arduinoの一般的な方法であるDTRを利用することにしました。まず、DSUB9コネクタの4番ピンとRS232レベルコンバーターのADM232A相当のICの8番ピンを接続します。その出力となる9番ピンとATMEGA644Pのリセット信号用の9番ピンを0.1μFのコンデンサで接続します。(配線の絶縁対策は忘れずにX-()

これで、オートリセットができるようになりました。

ブートローダーの書き込み

AVR-DEV-AM644RXのポート構成

AVR-DEV-AM644RX固有の接続情報を含め、Sanguinoでのデジタルポート、アナログポートのピン構成を示します。
AVR-DEV-AM644RXでは、グラフィックLCDがI/Oピンの多くの部分を占めていますが、グラフィックLCDが必要ない用途であれば、それをソケットからはずすことにより、ほとんどのI/Oピンをスケッチで自由に利用できるようになります。

どのような経緯あるいは制約があったのかわかりませんが、標準(ATMEGA168版)のArduinoでは、PDポートからデジタルI/Oピンの番号が振られているのに対して、Sanguinoでは、PBポートから番号が振られており、若干の注意が必要です。

デジタルポート

Arduinoポート 端子名 接続先 備考
D0 PB0 GLCD:R/~W、ブートモニタLED
D1 PB1 SW2
D2 PB2/INT2 GLCD:RES
D3 PB3/OC0A GLCD:CL PWM
D4 PB4/OC0B/~SS LED2 PWM
D5 PB5/MOSI
D6 PB6/MISO
D7 PB7/SCK
D8 PD0/RXD0 USB:TX
D9 PD1/TXD0 USB:RX
D10 PD2/RXD1/INT0 SW1
D11 PD3/TXD1/INT1 SW3
D12 PD4/OC1B LED1 PWM
D13 PD5/OC1A PWM
D14 PD6/OC2B GLCD:A0 PWM
D15 PD7/OC2A PWM
D16 PC0/SCL
D17 PC1/SDA
D18 PC2 GLCD:~CS1
D19 PC3 GLCD:~CS2
D20 PC4 GLCD:DB4
D21 PC5 GLCD:DB5
D22 PC6 GLCD:DB6
D23 PC7 GLCD:DB7

アナログポートはデジタルI/Oとして利用できるのは、標準のArduinoと同様ですが、デジタルI/Oピン番号の振り方が、アナログピン番号と逆順に振られているので注意が必要です。

アナログポート

Arduinoポート 端子名 接続先 備考
A0/D31 PA0 GLCD:DB0
A1/D30 PA1 GLCD:DB1
A2/D29 PA2 GLCD:DB2
A3/D28 PA3 GLCD:DB3
A4/D27 PA4
A5/D26 PA5
A6/D25 PA6
A7/D24 PA7

まずは手始めのスケッチ

グラフィックLCDの表示

AVR-DEV-AM644RXの主要な出力装置であるグラフィックLCDを利用するためには、その液晶をリフレッシュするための2KHz程度のクロックを供給する必要があります。もともとArduino対応を想定していなかったAVR-DEV-AM644RXでは、このクロックをTimer0のPWM機能で生成することを想定しており、PB3/OC0AピンがグラフィックLCDのクロックピンに接続されています。

しかしながらArduinoでは、Timer0はシステムの中核の計時機能として利用されており、自由に設定を変更して利用することができません。ただし、analogWrite関数を利用したPWM機能を利用することにより、PB3/OC0AピンからTimer0に基づくPWM出力を行い、グラフィックLCDにクロックとして供給することができます。肝心の周波数はArduinoの計時機能にかかわるため、安易に変えることはできませんが、そのままの周波数(グラフィックLCDに要求されている周波数に比べると少々低いのですが。。。。)をグラフィックLCDに与えると、かなりマージンがあるようで問題なく表示されることを確認できました。(もちろん規格外なので、動作保証は出来ません)

ちなみに、出力されるPWMクロックの周波数は約977Hzで、グラフィックLCDが要求しているクロック周波数のほぼ半分です。なお、Arduinoの公式サイトのanalogWriteの説明では、PWM出力の周波数は490Hzと書かれていますが、Timer0に基づくOC0A, OC0Bに関しては誤りで、その2倍の周波数が正解です。

これは、analogWriteに関するcoresのソースを読めば一目瞭然で、Timer0由来のPWMは、高速PWMを利用しているのに対し、Timer1/Timer2由来のPWMはフェーズ・コレクトPWMを利用しており、プリスケーラやカウント数の設定が同じでも、周波数が2倍異なることになります。

各PWMピンの出力周波数の違いは、測定器があれば簡単に確認できますが、圧電サウンダを持っているならば、それを接続すると、出力される音が1オクターブ異なるため、耳で確認することができます。(絶対音階 or 具体的な周波数はわからないけど。。。 :-P)

D3(PB3/OC0A)
analogWrite(3, 128) ;

開発ソフト: 
チップファミリー: 
MCUチップ: