PROGISPを使用して、ARDUINOIDEで作成されたプログラムとAVRMCUをARDUINOボードに作成する方法をダウンロードします



Use Progisp Download Program Written Arduino Ide



最初にタイトルの由来についてお話します。私がやったことは、もともとARDUINO MEGA2560とさまざまなモジュールを使用して構築されたもので、プログラムは当然ARDUINOIDEで記述されていました。しかし、この種のパッチワーク製品は当然十分ではありません。さらに重要なのは、ARDUINOボードの電源が以前に切れたということです。概略図を見ました。コンピュータのUSB電源と12V電源の両方を接続すると、USB5Vと12Vが回転します。5Vを並列に接続して大電流を供給しますが、インターネットで確認しました。同じ電圧の2つの電源を並列に接続すると、実際には非常に簡単に問題が発生します。現在の分布は予想通りではないので、素直に、均等に分割されます。電源の内部抵抗に関係していて、燃えやすいので、オープンソースの回路図を参考に回路基板を設計し、電源方式を変更して、すべての部品を装着したいと思いました。同じボードで、ファームウェアを変更し(つまり、プログラムの前に言った)、マイクロコントローラーに焼き付けました。そうは言っても、AVRとARDUINOの関係を説明する必要があります。

ARDUINOは、ATMELのAVRマイクロコントローラーをメインコントロールチップとするオープンソースハードウェアであり、独自の開発環境であるARDUINOIDEも備えています。では、ARDUINOボードはAVRマイクロコントローラーでどのように構築されていますか?たとえば、ARDUINO MEGA2560は、メイン制御チップとしてATMEGA2560を使用して構築されています。 ARDUINOはAVRマイクロコントローラーの一般的なI / Oポートのいくつかを選び出し、彼に新しい名前を付けました。たとえば、maga2560のPD0はARDUINOボードのデジタル21に対応します(PWMとCOMMUNICATIONのI / Oポートもデジタルです)ポート)、PF0はボードであるADC0に対応します。 ANALOGINのA0に移動します。各バージョンは、AVRマイクロコントローラーの設定を事前に設定して販売されています。各バージョンの関連情報は、ARDUINOが配置されているフォルダーのhardware arduinoの下にあるboards.txtで確認できます。このフォルダーには、各バージョンのヒューズ設定、シリアルポートのボーレート設定、ブートローダーファイルの場所などが記録されています。 。 ARDUINO IDEでバージョンを選択すると、関連するパラメーターがこのファイルに記載されているパラメーターに切り替わります。



ARDUINO I / O AVR I / O

I / Oポートについて話した後、ARDUINOのダウンロード方法について話しましょう。 AVR MCUのダウンロード方法には、ISP、JTAGエミュレーション、高電圧並列ダウンロードなどがあります。ARUIDNOの初期ダウンロードではCH340Gが使用され、その後、特定のバージョンからATMEGA8および16がUSBからシリアルポートへの実現に使用されました。 ARDUINOMEGA2560マニュアルのダウンロードモジュールの概略図は次のとおりです。
画像



私はこの原則を理解していないので、これ以上は言いません。重要なのは、ARDUINOは従来のダウンロード方法を使用していないということですが、彼のダウンロード方法はどのようにそれを実現しているのでしょうか?答えはBOOTLOADERです。投稿はこれについて非常に興味深い比喩を作りました。チップが人間の場合、ISPのダウンロードは洗脳と同等であり、シリアルポート経由でダウンロードすると、テキストを読み取って頭に書き込むことができると彼は言いました。詳細については、リンクを参照してください。
ispとシリアルダウンロードの比較

BOOTLOADERは、公式プログラムの前の小さなプログラムです。 FLASHには専用のストレージエリア(呼び忘れ)があり、必要に応じてさまざまな機能を実現でき、一般的にシステム起動前の初期化作業として使用されます。そして、ARDUINOは彼を使ってシリアルポートのダウンロードを実現しました。具体的な手順については、後で説明します。

----------分割線-------------



私の開発プロセスについて話させてください。

1. PROGISPを使用して、ARDUINOIDEで作成されたプログラムをダウンロードします

私のマイクロUSBははんだ付けできず、はんだ付けされたボードの残りの部分を無駄にしたくないので、私はPROGISPを使用してARDUINOIDEで記述されたプログラムをダウンロードします。
ARDUINOボードの通常のダウンロードは、USBポートを介して行われ、コンパイラーでワンクリックでダウンロードできます。 PROGISPを使用してダウンロードする場合は、コンパイルされた16進ファイルが必要です。 ARDUINO IDEでコンパイルされた16進ファイルをエクスポートし、次のように設定します。

  1. ARDUINO IDEを開き、[ファイル]-> [設定]を開き、Cドライブのパスをクリックして、メモ帳でpreferences.txtを開きます。
    画像
  2. ARDUINO IDEを閉じます(非常に重要です!)
  3. メモ帳でpreferences.txtを開いた後、16進ファイルが保存されているパスを選択し、最後の行にbuild.path = D: arduino MyHexDirを追加します。このパスを自分で選択してください。ファイルを閉じます。
  4. 検証が成功したかどうかを検証します。成功しなかった場合は、ファイルが変更されたときにARDUINOが閉じられなかった可能性があります。この時点でファイルを再度開くと、文章がテキストに追加されていないことがわかります。
  5. 成功すると、コンパイルされたHEXファイルがディレクトリにあります。

次は、AVRマイクロコントローラー用にセットアップする必要があるいくつかの場所です。私の経験と注意すべき点、ヒューズビットについて話しましょう。私がAVRマイクロコントローラーに触れたのはこれが初めてであり、私は多くの場所を理解していません。以前はCH340Gを直接使ってダウンロードできると思っていましたが、後で気づきました。まず第一に、AVRのヒューズビットは非常にユニークなものです。クロックの選択、システムクロックの周波数分割、開始時にプログラムの実行を開始するアドレス、さまざまな有効化などを決定します。 AVRが工場出荷時、デフォルトでは内部RC発振器回路を使用し、ボードは外部16M水晶発振器を使用するため、クロック回路として外部水晶発振器を選択するようにヒューズビットを変更する必要があります。ヒューズビットはISPでダウンロードする必要があるため、PCBの2番目のバージョン用にISPのダウンロードポートを追加し、インターネットで2つのusbispダウンローダーを購入しました。残念ながら、ダウンローダーをコンピューターに接続した後、コンピューターは新しいハードウェアを検出せず、デバイスマネージャーでも検出しませんでした。幸いなことに、売り手が責任を負い、ドライバーフリーの書き込みソフトウェアを送ってくれました。下の写真を参照してください。
画像
画像
ダウンロードリンク: ドライブフリープログラム
このソフトウェアには、ヒューズプログラミング用のウィザードモードがあり、非常に便利です。ヒューズビットの各ビットの意味を確認する必要がないため、ヒューズビットの設定が非常に簡単になります。このソフトウェアを使用して、ヒューズ位置の変更とプログラムのプログラミングを成功裏に実現しました(最初のステップは常に最初にチップモデルを選択することであることを忘れないでください)。もちろん、真ん中にはいくつかのビネットもあります。たとえば、ヒューズビットで「システムクロックを8で割った値」を選択したため、実際のクロックは水晶発振器の値の8分の1にすぎませんでした。また、明らかにBOOTLOADERを使用しなかった場合は、[リセットベクトルをBOOT領域の先頭に移動する]を選択しました。アドレス '、マイクロコントローラが私のプログラムを実行しない原因になります。主な問題は、シングルチップマイクロコンピュータのクロックの選択です。ここで強調する必要があります。「RC発振器」は回路とコンデンサ回路で構成されるクロック回路を指し、「外部クロック」は私たちの代わりにアクティブな水晶発振器を指します。 「外部低周波水晶発振器」は、超低周波のパッシブ水晶です。 「外部実物大水晶発振器」がわかりません。いくつかの場所に書かれたいくつかのヒューズビットの値を見てください。外部RC発振回路です。要するに、あなたはそれを必要としません。 「外部低電力水晶発振器」は、外部パッシブ水晶発振器と発振器コンデンサで構成されるクロック回路です。 CKSEL3:0 = 1000〜1111に対応します。これでヒューズの設定は完了です。
画像

次に、バーンインプログラムを確認し、[フラッシュの読み込み]をクリックします。他のオプションを設定した後、[自動]をクリックしてすべての操作を完了します。ここで、ちなみにFLASHとEEPROMの違いは、FLASHの容量が大きく、一般的なプログラムがインストールされていることです。 EEPROMの容量は小さくなります。 MEGA2560の場合、サイズはわずか4Kで、主に不揮発性データストレージに使用されます。この時点で、ARDUINOIDEとPROGISPでコンパイルされたプログラムのAVRへのダウンロードが正常に完了しました。
- - - - - - - 境界線 - - - - - -
それでは、開発プロセス中に遭遇した非常に興味深い現象について話しましょう。すべてのヒューズ位置を設定した後、すぐにオシロスコープで水晶発振器の起動状況を観察しましたが、次の結果が得られました。
画像

電圧は約1Vで、わずかなリップルがあります。それで、水晶発振器はまだ起動していないと判断しました。その後、時計回路が再はんだ付けされましたが、問題は解決されませんでした。最後に、試してみる姿勢で点滅するLEDプログラムを作成し、時計を内部RC発振回路に変更しました。出力をテストしたところ、出力があることがわかりましたが、周波数が間違っていて、実際の周波数は理論周波数の8分の1でした。 1つは、前の「システムクロックを8で割った値」を突然思いついたので、このオプションを削除しました。確かに、出力は正常でした。その直後、外部の水晶発振器にクロックを切り替えて、再度出力を測定したところ、出力は正常でした!次に、水晶発振器をもう一度テストしましたが、波形はまだ水平線です!結論:AVRはC51とは異なり、水晶発振器が発振を開始した後、明らかな正弦波はありません。内部RC発振回路に設定した場合、外部水晶発振器に設定した場合、水晶発振器のピンレベルは0V、水晶発振器の一方のピンの電圧は1V、もう一方のピンの電圧は0.7Vとなります。正弦波ではありません。

2. AVRMCUをARDUINOボードにする方法

以前のダウンロード方法はAVRダウンロード方法であり、ここで説明するダウンロード方法はARDUINOのダウンロード方法です。 ARDUINOのダウンロードは、実際にはAVRマイクロコントローラーのIAPダウンロード方式を使用しています。 IAPは、アプリケーションプログラミングの略語であり、システムのアップグレードによく使用されます。その原理は、チップ全体のフラッシュを2つの部分に分割することです。1つはアプリ領域と呼ばれ、もう1つはブート領域と呼ばれます。これら2つの領域のサイズは、ヒューズの位置に応じて設定できます。ここでは、ブートローダーがブート領域に焼き付けられ、ブート領域のプログラムがシリアルポートからプログラムを受信して​​、プログラムの自己更新を実現し、ダウンロードします。

それはあなたのシリアル回路でうまく機能します(CH340Gで構築されたシリアル回路については、私の他のブログを参照してください CH340Gに基づくワンクリックダウンロード はんだ付け等に問題がない場合は、コンピューターとボードをAVRISPに接続してください。 ARDUINOの[ツール]-> [ボード]でボードモデルを選択した後、プログラマーで[AVR ISP]を選択し、最後に[ブートローダーの書き込み]をクリックします。成功したら、ARDUINOの通常のダウンロード方法を使用してダウンロードできます。

ただし、前の質問と同様に、私のコンピューターはAVR ISPを認識しないため、ここではブートローダーの16進ファイルが引き続き使用されます。 arduinoインストールディレクトリを見つけて、hardware / arduino /の下のboards.txtを開きます。さまざまな種類のボードに関する情報があります。ここでは、ヒューズとブートローダーがどこにあるかにのみ焦点を当てます。例として、Arduino Mega2560を取り上げます。
mega2560.bootloader.low_fuses=0xFF
mega2560.bootloader.high_fuses=0xD8
mega2560.bootloader.extended_fuses=0xFD
mega2560.bootloader.path=stk500v2
mega2560.bootloader.file=stk500boot_v2_mega2560.hex

上記の情報に従って、ヒューズの下位ビット、上位ビット、および拡張ビットを変更し、stk500v2ディレクトリでstk500boot_v2_mega2560.hexファイルを見つけて、ブート領域に書き込みます。暗号化された値については、気にしないでください。ロックされていると悪い結果になります。これで、ARDUINOIDEでダウンロードできるボードができあがりました。

ヒューズビットの設定方法について詳しく説明します。 arduinoは修正されましたが、理解する必要があります。
画像
画像
上記は、arduinoが提供するヒューズビットを設定した結果です。
1.ブート領域のサイズを4096ワードに設定します。結局、ブートローダーには20k以上があります。
2.「リセットベクタをブートエリアの開始アドレスと終了アドレスに移動する」にチェックを入れます。これを行わないと、MCUがリセットされるたびにプログラムが最初から実行されます。つまり、IAPのダウンロードは有効になりません。チェック後、MCUはリセット後、最初にブート領域でプログラムを実行します。この時点でダウンロード要件がある場合は、プログラムをダウンロードし、完了後に通常どおりアプリ領域でプログラムを実行します。
3. [暗号化なし]をオンにします。確認することをお勧めします。代わりに次の2つをチェックすると、フラッシュの内容を変更できなくなります。
4.他の人のブログから判断すると、ブートエリアプログラムの実行中にアプリエリアの内容を読み取ることは絶対に禁止されており、新しいプログラムがアプリエリアに書き込まれます。したがって、ここで「ブートローダー領域で実行されているLPM命令がアプリケーション領域からデータを読み取ることを許可しない」をチェックする必要があります。 (LPMはプログラム領域を読み取る命令であり、SPMはプログラム領域を書き込む命令です。)しかし、ここで彼がチェックしたのは、「SPMとLPMはアプリケーション領域へのアクセスに制限がない」ということです。よくわかりません。誰かが私にアドバイスをくれることを願っています。