記事内に広告が含まれています

【ワレコの電子工作】Microchip StudioとATMEL-ICEでATmega328PをLEDチカチカしてDebugする【成功】

この記事は約21分で読めます。
スポンサーリンク

ワレコ

実は最近、AVRプログラミングに挑戦中だ。

取り敢えずLEDチカチカに成功した。

AVRマイコンはArduinoに搭載されているマイコンチップだ。

Arduino UNOを使ったLEDチカチカの実験は一年ほど前にやってみた。

最初はVisual Studioの環境でやってみて上手く行った。

その次に、Arduino IDE統合開発環境でも上手く行った。

当記事では、Arduino UNOに載っているATmega 328Pと言うAVRマイコンを単体で使ってLEDチカチカに成功したのでその過程を備忘録として記事にした。

では本題に入ろう。

スポンサーリンク
スポンサーリンク

Arduino UNOとAVRの関係

AVRマイコンとは何か?

Atmel社(2016年にMicrochip Technology社に買収された)のAVRマイコンに関してはWikipediaの解説が分かり易い。

AVR(AVR)は、Atmel社が1996年に開発した、RISCベースの8ビットマイクロコントローラ(制御用IC)製品群の総称である。2016年以降はMicrochip社によって製造・販売されている。

(略)

PIC同様に回路構成が簡単でCPU、メモリ(RAM、ROM)、I/O、データ記憶用のEEPROM、クロック発振回路、タイマーなどが1チップに収められており、書き込まれたプログラムにより制御される。

ISP (In-System Programming) に対応し、コンパレータを内蔵する等、i8051ピンコンパチ品や外部にRAMやI/Oを増設する外部バスのあるものもあり、電子工作を行う人の間で人気がある。ISPには、In Circuit Serial Programming (ICSP) やJTAGという仕組みがある。

引用元 https://ja.wikipedia.org/wiki/Atmel_AVR

まあ要するにAVRマイコンはワンチップにマイコンの機能が全部入っているのだ。その開発環境もMicrochip Technology社から無償で提供されているので、電子工作でAVRマイコンを使う人も多い。

ワテもいよいよAVRマイコンプログラミングに挑戦したいと思って始めたのだ。

Arduino UNOにもATmega328P AVRマイコンが載っている

Arduino UNOと無料の統合開発環境Arduino IDEを使えば大抵の電子工作は出来るだろう。

例えば下写真のArduino UNO R3互換ボードと付属パーツ一式を使えば各種実験が出来る。

このキットには超音波モジュール、温度センサー、湿度センサーその他多数のセンサーが含まれている。モーターもある。

なので、上写真のようなArduino UNOあるいはArduinoシリーズの他のボード(Arduino Nanoなど)を買って、無料の開発環境Arduino IDEを使えば自分がやりたい実験は殆どカバーできるだろう。

でも、ブレッドボード実験するだけならそれで良いのだが、実験後にそれらの機器を自作の電子工作に組み込みたい場合には、もしArduinoの基板ごと組み込むとなるとサイズも大きいし値段も数千円かかる。

Arduino UNO純正品なら三千円くらい、上写真のような互換品でArduino UNO互換ボード単体なら二千円弱だろう。

一方、AVRマイコン単体なら、値段も100円~300円くらいだ。Arduinoに載っているATmega328P-PUなら秋月電子で買うと、1個 ¥240(税込)となっている。

ATmega328P-PUならパッケージはDIP28と小型だし、クロックも内蔵しているので、5V電源を繋げば以下の機能を持つ8ビットマイコンが簡単に自作出来るのだ。

■主な仕様
・シリーズ:ATMEGA
・電源電圧:1.8~5.5V
・コア:megaAVR
・コアサイズ:8bit
・クロック:20MHz
・プログラムメモリ:32kB
・EEPROM:1kB
・RAM:2kB
・GPIO:23pin
・ADC:6Ch
・UART/USART:1Ch
・I2C:1Ch
・SPI:1Ch
・タイマ:3Ch
・オシレータ:内蔵/外付
・パッケージ:DIP28

引用元 https://akizukidenshi.com/catalog/g/gI-03142/

AVRマイコンの開発環境はMicrochip Technology社から無償で提供されているMicrochip Studio(旧Atmel Studio)やMPLAB X IDEなどがある。

Microchip Technology社はPICマイコンで有名だが、Atmel社を買収したのでAVRマイコンもラインナップに加わった。MPLAB X IDEと言うのは、元々はPICマイコン向けの統合開発環境だったが、2018年にMPLAB X IDEでAVRマイコンもサポートをした(※)。

※ Microchip Technologyは10月3日(米国時間)、 PICの統合開発環境(IDE)である「MPLAB X」にて、AVRマイコンの対応を開始したことを発表した。

https://news.mynavi.jp/article/20181011-704709/

と言う訳で、AVRプログラミングをやるならMicrochip Studio(旧Atmel Studio)やMPLAB X IDEなど、どちらを使っても良いようなので、ワテの場合は取り敢えずMicrochip Studio(旧Atmel Studio)を使う事にしたのだ。

AVRマイコン単体で使うメリット

上にも書いたように別の機器に組み込む場合にはArduino UNO基板ごと組み込む方式だとサイズも大きいし、値段も高い。

その点、AVRマイコン単体で使えばサイズも小さいし値段も安い。このように費用の面でAVRマイコン単体で使う事はメリットがある。

それ以外のメリットとしては、AVRマイコン単体で使うとブートローダーが不要なのだ。

Arduinoの場合なら専用のブートローダーが工場出荷時にフラッシュメモリの中に書き込まれていて、自作のプログラム(Arduinoの世界ではスケッチと言う)もフラッシュメモリに書き込む。

そしてArduinoの電源が入った場合やリセットボタンが押された場合には、まずはブートローダーが起動して、その後、USB経由でスケッチが送られて来ればそれをフラッシュメモリに書き込む。スケッチが送られて来ない場合には、既にフラッシュメモリに書き込まれているスケッチが実行されると言う手順になっているようだ(ネット情報で)。

と言う訳でArduinoを使うとブートローダーが介在するので、パソコンとUSB接続して開発作業する時点では便利だが、Arduinoを何かに組み込んだ場合でもブートローダーが介在するので今一つスッキリしない。それにブートローダーの分だけフラッシュメモリを消費してしまう。

一方、AVRマイコン単体で使う場合には、ブートローダーなどは必要なく、自作のスケッチをAVRのフラッシュメモリに書き込んでおけば良いのだ。このほうが分かり易いしスッキリする。

かつ、デバッグ機能を持っているライター(ATMEL-ICEなど)を使えば、開発中のデバッグ作業もやり易い。

と言う事で、ワテはAVRマイコンを単体で使う手法の学習を開始したのだ。

Atmel-ICEとATmega328Pをブレッドボードで接続する

AVRマイコンの書き込みやデバッグツールは幾つかある。

トランジスタ技術 2021年04月号によると、

などが利用出来るとの事だ。

ワテの場合は、取り敢えず一番目のAtmel-ICEを使う事にした(下写真)。

Atmel-ICEとATmega328Pをブレッドボードに配線接続する

さて、ネット検索してもArduinoを使ってLチカする例は多数の解説記事があるのだが、AVR単体でLチカ実験する例が見当たらない。

その理由は分からない。

そんな簡単な事はわざわざ解説記事にするまでもないと言う事なのかも知れない。

では、Atmel-ICEのマニュアルを詳しく読めば分かるかなと思って必死で読んでみた。

でも、このAtmel-ICEのユーザーズガイドには信号線の意味などは詳しく書いてあるが(でもワテは良く理解できていないw)、Microchip Studioを使ってプログラムの書き込みやデバッグを行う手法などは説明されていない。

で、必死でネット検索してみたところ、まさにそんなLEDチカチカ実験をやっているYouTube動画を発見した。

動画 ATMEL-ICE、Microchip Studio、ATmega328Pを使ってLEDチカチカ実験のYouTube動画

以下では、このYouTube動画に従ってLEDチカチカ実験を行った。

ブレッドボードを使って下図の回路を組む。

引用元 https://github.com/MicrocontrollersAndMore/Atmel_Programming_Tutorial_1_1st_Programming_and_Blink_a_LED

注意事項としては、デバッグケーブル6Pの中にあるVCC(+5V)線はATmel328Pチップを駆動する能力は無いので、専用の5V電源を用意する。そしてデバッグケーブル6PのVCC(+5V)線はその5V電源に接続する。たぶんこの6Pコネクタ内のVCC(+5V)線は電源供給用ではなくて電源電圧検出用なのかなと思う(要確認)。

さて、上図に基づいて下写真のようにブレッドボードに組んでみた。

写真 ATmega328Pをブレッドボードに挿してATMEL-ICEとは付属のフラットケーブル接続

上写真で白いATMEL-ICEボックスは左に出ている黒いUSBケーブルでWindows10パソコンと接続している。

一方、ブレッドボードの左に来ている黒ケーブルはACアダプタ(5.2V、1.2A)だ。上YouTube動画では9Vの乾電池006Pから三端子レギュレータ7805を使って5Vを生成している。ATmega328Pのデータシートを見ると電源電圧(Operating Voltage)1.8 – 5.5Vなので5.2Vでも大丈夫だろう。

これらの二つの機器は、フラットケーブル(ATMEL-ICEキット付属品)で接続している。

ところがこのフラットケーブルのピンアサインが分かり辛いのだ。

ATMEL-ICE付属デバッグケーブルについて

このフラットケーブルは正式名称はDebug Cableと言うようだ。

ATMEL-ICEユーザーズガイドから下図を引用させて頂く。

引用元 https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-ICE_UserGuide.pdf

上図で左側10Pコネクタ(メス)は白いATMEL-ICEケース側面のAVRソケット(オス)に挿す。ちなみにその隣にはSAMソケット(オス)と言うのもある。そちらはSAMマイコンをデバッグする時に使う。

一方、上図Debug Cableの右側には6Pコネクタ(メス)が付いている。その部分を下図のようにワテが図解してみた。

図 Debug Cable一端の6Pメスコネクタ(3行x2列)挿し込み方向を上向きに描いているので注意

上図でVCC, GND, RESETはその意味は何となくわかる。

残りの三つは以下の通り。

  • MOSI (Master Out Slave In)
  • MISO (Master In Slave Out)
  • SCK (Serial Clock)

「もし」とか「味噌」とかなんのこっちゃ!?と思っていたが、その意味は以下のような役割がある。

  • MOSI マスターからスレーブへの送信
  • MISO スレーブからマスターへの送信
  • SCK  マスターとスレーブを同期させるためのクロック信号

との事だ。

ちなみにデバッグケーブルの途中にも10Pメスコネクタがある。なんでこんなややこしいケーブルなのか疑問だったのだが、なんとなく分かって来た。

つまりATMEL-ICEはAVRマイコンだけでなくSAMマイコンなど各種のチップのライターやデバッグに使える汎用的な製品なのだ。なのでケーブルも各種の接続方法に対応できるように、こんな複雑な構造をしているようだ。

当記事でやるAVRマイコンを使うLEDチカチカ実験では右端の6Pメスコネクタのみ使うので、他のコネクタは気にしなくても良い。

ATMEL-ICEの三つのLED表示の意味

ATMEL-ICEの白いケースに付いている三つのLED表示の意味も覚えておくと良い。

図 ATMEL-ICEの三つのLED表示の意味

引用元 https://avr.jp/user/DT/PDF/Atmel-ICE.pdf

図 ATMEL-ICEの三つのLED表示や用SAM10Pソケット(オス)、AVR用10Pソケット(オス)

引用元 https://avr.jp/user/DT/PDF/Atmel-ICE.pdf

Microchip StudioとAtmel-ICEを使ってATmega328PでLEDチカチカ

さてブレッドボードで回路を組んだので、次はMicrochip Studio統合開発環境を起動してLEDチカチカ実験用のプログラムを実行すれば良いのだ。

下図のようにMicrochip Studioを起動してみた。

図 Microchip Studio(色合いは設定機能で標準色を濃色に変更している)

うん?Visual Studioソックリやがな。

どうやらMicrochip Studioの中身はVisual Studioのようだ。なぜならMicrochip Studio起動時にPowered by Visual Studioと表示されているし。

これは有難い。ワテの場合、Visual Studioの達人なのだ。

なのでMicrochip Studioも馴染みやすいぞ。

さてMicrochip Studioで新しいソリューションを作成して、「GCC C Executable Project」を選んでOKをクリックする。

そうするとmain.cファイルなどを含んだプロジェクトのテンプレートが読み込まれるので、main.cに最初から書いてあるコード部分は削除して下のコードに置き換える。

// MyAtmelBlink.c

// put LED on PC5

#ifndef F_CPU					// if F_CPU was not defined in Project -> Properties
#define F_CPU 1000000UL			// define it now as 1 MHz unsigned long
#endif

#include <avr/io.h>				// this is always included in AVR programs
#include <util/delay.h>			// add this to use the delay function

///////////////////////////////////////////////////////////////////////////////////////////////////
int main(void) {
	
	DDRC |= (1 << PC5);			// set Port C pin PC5 for output
	
	while (1) {					// begin infinite loop
		PORTC ^= (1 << PC5);	// flip state of LED on PC5
		_delay_ms(500);			// delay 1/2 second
	}
	return(0);					// should never get here, this is to prevent a compiler warning
}

コード LEDチカチカ実験用のC言語ソースコード

引用元 https://github.com/MicrocontrollersAndMore/Atmel_Programming_Tutorial_1_1st_Programming_and_Blink_a_LED/blob/master/MyAtmelBlink.c

これがLEDチカチカ実験用のC言語ソースコードなのだ。

実行前の設定作業

早速実行してみたいところだが、その前に少し設定が必要だ。

プロジェクトのプロパティを開くと下図が出る。

図 プロジェクトプロパティで「Tool」を開いて「Atmel-ICE」やInterface「ISP」選択

上図において「Tool」をクリックしてSelected debugger/programmerは「Atmel-ICE」、Interfaceは「ISP」を選択する。

次に、「ツール」メニューの「Device Programming」を実行する。

下図のウインドウが開くので、DeviceやInterfaceを選んで「Apply」をクリックする。

あと、Device signatureやTarget Voltage右隣の「Read」ボタンをクリックすると情報が読み取られれば成功だ。

図 「ツール」メニューの「Device Programming」ウインドウ

なお、原因不明なのだが当初は上図のDevice signature「Read」ボタンで正しくデバイス情報が読み取れていたのだが、その後、InterfaceをISPからdebugWireに変えて実験したところ、Device signature「Read」がエラーするようになった(下図)。

図 Device signature「Read」でエラー

Failed to enter programming mode. ispEnterProgMode: Error status received: Got 0xc0, expected 0x00 (Command has failed to execute on the tool)

Unable to enter programming mode. Verify device selection, interface settings, target power, security bit, and connections to the target device.

でもこのエラーが出ても問題無くLEDチカチカプログラムはデバッグ有りでも無しでも実行出来ているので、実用上は問題無い。

でも気になるのでこのエラーの意味や原因を調査する予定だ。

2021/11/16追記

このエラーの原因と解決方法が分った。

参考にしたサイトはここだ。

 https://okwave.jp/qa/q8720572.html

このサイトによると、原因と解決方法は以下の通り。

debugWIREのヒューズビットが有効になっているのでしょう。
その場合デバッグモードしかできなくなりますので、ISPによるライターモード通信はできません。

解除方法は以下です。
1、一時停止でデバッグモードに入る。
2、debugメニューから「disable debugWIRE and close」を選ぶ。

これヒューズがOFFになるのでライターモードでデバイスシグネチャが読めます。
debugWIREはこれをよくやるので要注意ですよ。

引用元 https://okwave.jp/qa/q8720572.html

下図のように実際にやってみた。

Debugモードで実行中に、ブレークポイントでブレークさせて一時停止。

その状態で、上図のように「disable debugWIRE and close」を実行する。

その結果、このエラーは解消出来た。

 

では、本題に戻ろう。

デバッグなしで開始(Ctrl+Alt+F5)を実行する

ではプログラムを実行してみよう。

デバッグなしで開始(Ctrl+Alt+F5)を実行する。

図 LEDチカチカ実験プログラムをデバッグなしで開始(Ctrl+Alt+F5)を実行成功

そうすると一瞬でコンパイルとビルドが終わって、プログラムが実行される。

その結果、ブレッドボード上のATmega328Pにバイナリコードが書き込まれて実行が開始する。

そして無事にLEDが100ミリ秒ごとに(周期200ミリ秒か)チカチカして成功した。

おお、これでワテもAVRプログラミングの第一歩を踏み出す事が出来た。

小さな一歩であるがワテにとっては大きな飛躍だ。アームストロングワレコ船長と呼んでくれw

デバッグ実行(F5)する

さて、この時点でデバッグ実行(F5)を押すと、下図のエラーメッセージが出て失敗する。

図 デバッグ実行F5押下で表示されるエラーメッセージ

ISP on Atmel-ICE does not support debugging.
Device is only programmed.
Use Start Without Debugging to avoid this message.

このメッセージの意味としては現状のInterface設定ISPでは、デバッグがサポートされていないとの事だ。

ネット検索してみたところ、以下のAVRフォーラムにまさにこの件のQ&Aがあった。

https://www.avrfreaks.net/forum/isp-atmel-ice-does-not-support-debugging

このフォーラムの回答ではInterfaceをISPからdebugWireに変更すれば良いとの事なので、下図のように変更した。

 

図 ToolタブでInterface設定をISPからdebugWireに変更する

その結果、下図のようになった。

図 ToolタブでInterface設定をISPからdebugWireに変更した

そしていよいよデバッグ実行(F5)を押すと下図が出た。

図 デバッグ実行(F5)で出たメッセージにYesをクリック

まあ良く分からないがメッセージを読む限りはDWENヒューズを使ってSPI(何やこれは?)と言うのを有効化すると良いらしい。そこでYESをクリックしてみた。

SPIとは?

SPI(Serial Peripheral Interface)はクロックに同期させてデータの通信を行う同期式シリアル通信のひとつで,E2PROMやセンサとのデータ通信によく使われています。
SPIでは,クロック(SCLK),データ入力(SIN),データ出力(SOUT)および
チップセレクト(CS)の4本の信号線を用いて通信します。

引用元 https://www.lapis-tech.com/jp/common/miconlp/tips/2-18-spi%E3%81%A8%E3%81%AF/

 

そして再びデバッグ実行(F5)を押すと、今度は無事に実行出来た(下図)。

図 デバッグ実行(F5)してブレークポイントでブレークした状態

試しに上図のようにブレークポイントを設定してみたらそこで正しくブレークする。

ステップ実行も出来る。

それらの過程でブレッドボード上のLEDを観察していると、LEDが点灯したり、消灯したり、交互に繰り返している事も確認出来た。

まあこの辺りのデバッガーの操作方法はVisual Studioと全く同じなので、自称Visual Studio達人のワテは難なく使いこなす事が出来るのだ。

と言う事で、当初の目標である「AVRマイコン単体でLEDチカチカ実験を行う」は成功裏に完了したのだ。

写真 ブレッドボード上のATmega329P AVRマイコンでLEDチカチカ実験の様子

まとめ

ワレコ

AVRプログラミングをマスターしたいと思っている。

そして、AVRマイコンを使った電子小物を自作したいのだ。

具体的には、まずはモーターを制御したり、リモコンで機器を操作するなどやってみたい。

当記事では、Arduino UNOに使われているATmega328P AVRマイコンを単体で使ってLEDチカチカ実験をする過程を備忘録として紹介した。

途中で表示されたエラーに関しては、必要に応じてISPモード、debugWireモードを切り替えれば解決する。例えばdebugWireモードの時にはDevice signature「Read」コマンド実行でエラーするが、このコマンドはISPモードに戻せば成功する。

生の(あるいは素のと言うべきか)AVRマイコンは100円前後の値段なので安いのがうれしい。

使ったハードウェアは以下の通り。

 写真例 ハードウェア ワテのコメント
Waveshare ATMEL AVR Programmer AVR プログラマ USB AVRISP XPII Compatible Atmel AT AVR ISP mk2 mkII In-System Programmer Supports AVR Studio 4/5/6 (Atmel-ICE)
ATMEL-ICEベーシックキット 秋月で買うと安い。
Love Girl DIP28 ATmega328P-PU MCU ICチップ(UNOブートローダー付き)
Atmega328P-PU 生のAtmega328P-PUを数個買えば当記事でやったような実験を色々出来る。
LEOBRO ブレッドボード ジャンパーワイヤキット 830ポイント はんだレスブレッドボード ブレッドボード用ワイヤ 14種類×10本 収納ケース付き ピンセット付き
ブレッドボード 配線ワイヤー セット フレッドボードは良く使うので大小幾つか持っていると良い。
ANMBEST 1500点電子部品DIY品揃えキット、3mm LEDランプ、5mm LEDランプ、セラミックコンデンサ、電解コンデンサ、三極真空管トランジスタ、ダイオードトランジスタ、抵抗器
LED、抵抗、コンデンサ この手の部品セットは消耗品と考えて必要に応じて買い増しすると良い。
5V 2A ACアダプター 5.5*2.1mm ACアダプター PSE認証 Punasi DC TVボックス USBハブ 極性:インナープラス(+)、アウターマイナス(ー) GPS おもちゃ Webカメラ ルーター 電源アダプタ DCコネクター*8 dvdプレーヤー acアダプター
ACアダプタ 5V 2A 5V2Aくらいのヤツが有ればAVRだけでなくCMOSロジック回路などにも利用出来る。
Amazonベーシック USBケーブル プリンター用 3.0m (2.0タイプAオス - マイクロBケーブル) ブラック
USB Micro-Bケーブル(ATMEL-ICEに付属) ATMEL-ICEベーシックキットに付属しているがダイソー100円商品でも良い。

表 LEDチカチカ実験に使ったハードウェア

これと、無償の統合開発環境Microchip Studioを使えばワテと同じ実験をする事が出来る。

それに加えて下写真のようなArduino UNO互換ボードと実験用部品一式も買えば、いろんな実験が出来るのだ。

(続く)

スポンサーリンク
コメント募集

この記事に関して何か質問とか補足など有りましたら、このページ下部にあるコメント欄からお知らせ下さい。

AVRDIY
スポンサーリンク
シェアする
warekoをフォローする
スポンサーリンク
われこ われこ

コメント