
注意イメージ-xkcd
あなたが無人島にいると想像してください。 また、マイクロコントローラーをプログラムすることは非常に重要です。 なぜですか? さて、救助のチャンスが急激に低下する緊急ビーコンを修正するとしましょう。
アセンブラーコースを忘れていないことを喜んで、あなたは何とか砂の中に棒でプログラムを書きました。 いくつかの奇跡によって、生き残ったものの中で、コントローラーのドキュメントの印刷が良いことが判明しました(まだ開始する時間がなかったのは良いことです!)そして、プログラムはなんとかマシンコードに翻訳されました。 最もナンセンスがありました-それをコントローラーにフラッシュすること。 しかし、半径500キロメートル以内には、コンピューターはもちろんのことプログラマーは一人もいません。 電源(ココナッツ
素手でMKをフラッシュする方法は?
Atmelは実験的なMKとして機能します。 説明した手法は、コマンドコードがわずかに異なる場合があることを除いて、AVRファミリのほぼすべてのコントローラーで機能します。
インターフェース
AVRファームウェアの最も一般的で便利なインターフェイスはSPI (シリアルペリフェラルインターフェイス)です。 SPIを介して接続するには、4本のワイヤのみが必要で、グランドはカウントしません。- SCK-クロック信号。すべてのデータ交換操作を同期します。
- MOSI (マスターアウトスレーブイン)-マスターからスレーブへのデータライン。
- MISO (マスターインスレーブアウト)-反対に、スレーブからマスターへのデータライン。
- RESET -SPI経由でファームウェアを有効にするには、このピンに論理「0」を適用する必要があります。
したがって、3つの信号を生成し、(オプションで)1つを読み取る必要があります。 これは最も簡単な図です:

図 1. SPIの最も単純な接続スキーム。
便宜上、入力信号の表示を追加できます。 スキームは複雑ですが、過度ではありません。

図 2.シグナル表示のあるスキーム。
バウンス保護
残念ながら、ボタンを使用してSPI信号を生成するだけでは、良い結果が得られません。 この理由は、 接触バウンスと呼ばれる不快な現象です。 閉じられると、機械的接点が衝突し、互いに跳ね返り、1つのパルスではなく、いくつかのパルスが得られます。 バウンスを抑制するには、一対の論理要素から簡単な回路を組み立てる必要があります。

図 3.チャタリングを抑制するRSトリガー。
これはRSトリガーであり、スイッチの下側の接点を閉じる瞬間に状態「1」に切り替わり、バウンスの残りのパルスを無視します。 「0」に戻るトリガーリセットは、上部の接点が閉じたとき、つまりボタンが放されたときに発生します。
「ほら、逃げちゃった!」と読者は言います。「私は砂漠の島に座っています。 ここでトリガーはどこで取得できますか?」まあ、電子回路なしでバウンスを取り除くことができます。 「乾いた」接触部を
MOSIおよびRESET信号は、SCKとは異なり、チャター抑制を必要としません。ここでは、サンプリング時の信号レベルのみが重要であり、エッジは重要ではありません。
SPIはどのように機能しますか?

図 4. SPIのタイミング図。
SPIは同期インターフェイスです。すべての操作は、マスターによって生成されるクロック信号(SCK)のエッジによって同期されます。 最大転送速度は、コントローラのクロック周波数の1/4に制限されています。 最小速度に制限はありません。クロック信号がなければ、データ交換は「凍結」され、インターフェースは任意の期間静的状態のままになります。
SPI伝送は、全方向モードで、各方向にサイクルごとに1ビット実行されます。 SCK信号の立ち上がりエッジで、スレーブデバイスはMOSIラインから次のビットを読み取り、立ち下がりエッジでMISOラインに次のビットを生成します。 図4。
ファームウェアプロトコル
プログラマとMK間のすべての通信は、32ビットコマンドの送信とコントローラーの応答の受信で構成されます。 コマンドの完全なリストはデータシートにあります。ここで、ファームウェアMKに対して実行する必要がある操作をリストします。- コントローラーをプログラミングモードにする。
- (オプション)デバイス識別子を読み取ります。
- 消す
- フラッシュに記録します。
- (オプション)記録の検証。
各ステップを詳細に検討してください。
プログラミングモードを有効にする
プログラミングモードは、RESETフットに「0」を供給することでアクティブになります。 しかし、微妙な点がいくつかあります。 Atmelは、最初にRESETピンとSCKピンを低レベルに設定してから、コントローラーに電源を投入することをお勧めします。 これが不可能な場合は、電源をオンにした後、SCKに「0」を適用し、次にリセットに正パルスを適用します。

図 5. MKをプログラミングモードに転送します。
しかし、それだけではありません。 次に、実際にプログラミングモードをオンにするコマンドを送信する必要があります: 10101100 01010011 xxxxxxxx xxxxxxxx

図 6.コマンド「プログラム有効化」。
xで示されるビットは任意です。 3番目のバイトの送信中に、コントローラーは2番目のバイト( 01010011 )を送り返す必要があります。 これが発生した場合、すべてが正常であり、コマンドは受け入れられ、コントローラーはさらなる指示を待っています。 答えが異なる場合は、MKを再起動して再試行する必要があります。
ID検証

図 7.チーム「読み取り署名バイト」。
MKのメモリに何かを書き込む前に、必要なモデルが正確に揃っていることを確認する必要があります。 各コントローラーモデルには、独自の3バイトの識別子(署名)があります。 次の形式のコマンドで読むことができます
00110000 000xxxxx xxxxxxbb xxxxxxxx
bb (コマンドの3番目のバイト)の代わりに、識別子の最初のバイトを00、2番目を01、3番目を10に置き換えます。 識別子の対応するバイトは、コマンドの4番目のバイトを送信するときにコントローラーによって送信されます。
ATtiny13の場合、識別子の値は00011110 10010000 00000111 ( 0x1E 90 07 )です。
コントローラーのクリーニング

図 8.チーム「チップ消去」。
次のステップは、MKのメモリをクリアすることです。これは、コマンド「Chip Erase」を送信することにより実行されます
10101100 100xxxxx xxxxxxxx xxxxxxxx
このコマンドは、フラッシュとEEPROMの内容を消去し(すべてのセルにFFが含まれます)、ロックビットが設定されている場合は削除します。
フラッシュメモリへの書き込み
ATtiny13のプログラムメモリ(フラッシュ)は、512個の2バイトワード(1Kバイト)で構成されています。 ワードアドレスの解像度は9ビットです。 フラッシュメモリはページに分割され、各ページのサイズは16ワード(合計32ページ)です。 フラッシュ記録は2段階で実行されます。
まず、ページバッファにデータをロードする必要があります。そのためには、「プログラムメモリページのロード」コマンドを使用します
01000000 000xxxxx xxxxbbbb iiiiiiii-ワードの下位バイトをロードする場合、および01001000 000xxxxx xxxxbbb iiiiiiii-高ワードをロードする場合。
bbbbコマンドの 3番目のバイトの最下位 4ビットはページ上のワードのアドレス、 iiiiiiiiはロードバイトです。 まず、ワードの下位バイトを常にロードし、次に同じワードの上位バイトをロードする必要があります。

図 9.コマンド「Load Program Memory Page」。
ページバッファがロードされたら、「Write Program Memory Page」 01001100 0000000a bbbbxxxx xxxxxxxxコマンドを実行して、ページを直接コントローラメモリに書き込む必要があります。
2番目のバイトの最下位ビットと3番目のバイトの最上位4ビット:bbbb-書き込み用の5ビットのページ番号。

図 10.コマンド「Write Program Memory Page」。
これはすべてややこしく見えますが、複雑なことは何もありません。 プログラムメモリの任意のバイトのアドレスは、10ビットで構成されます: ppppp:bbbb:w 、ここで
ppppp-ページ番号(「プログラムメモリページの書き込み」コマンドで使用);
bbbb-ページ上のワードのアドレス(「プログラムメモリページのロード」コマンド内)。
wは、ワードの上位バイトまたは下位バイトを識別するビットです(「プログラムメモリページの読み込み」コマンドの最初のバイトで暗号化されます)。
読書フラッシュ

図 11.「Read Program Memory」コマンド。
ファームウェアをMKに書き込んだ後、データの整合性チェックが実行されなかったため、記録されたデータをチェックするとよいでしょう。 確認する唯一の方法は、フラッシュメモリの全量を読み取り、オリジナルと比較することです。
プログラムメモリの読み取りは、書き込むよりも簡単です。 ページングを忘れて、読み取りはバイト単位です。 Read Program Memoryコマンドは次のようになります。
00100000 0000000a bbbbbbbbb xxxxxxxx-ワードの下位バイトの読み取り用、 00101000 0000000a bbbbbbbb xxxxxxxx-上位の場合 。
2番目のバイトと3番目のバイト全体の最下位ビットa:bbbbbbbbbは、メモリ内のワードのアドレスです。 読み取りバイトは、コマンドの4番目のバイトの送信中に返されます。
プログラミング完了
おそらく最も簡単な操作。 プログラミングを完了してMKを動作モードにするには、RESETに論理レベル「1」を適用するだけで十分です。 コントローラが起動し、新しいプログラムに従って動作します。
練習する
この知識を実践する時が来ました。 実験の犠牲者-ATtiny13-はブレッドボードに閉じ込められ、信号ドライバーが近くに組み立てられ、すべての準備が整いました:
図 12.実験スキーム。
「どこにも簡単なものはない」という形式のプログラムを縫います。
ldi R24, 0x02 out DDRB, R24 out PORTB,R24 L1: rjmp L1
彼女がすることは、PB1を足に与えて無限ループに入ることです。 マシンコードでは、たった4語しかかかりません。
E082 BB87 BB88 CFFF
コントローラにフラッシュするには、次のコマンドを入力する必要があります。
1010 1100 0101 0011 0000 0000 0000 0000 // program enable 1010 1100 1000 0000 0000 0000 0000 0000 // chip erase 0100 0000 0000 0000 0000 0000 1000 0010 // load addr.0000 low byte 82 0100 1000 0000 0000 0000 0000 1110 0000 // load addr.0000 high byte E0 0100 0000 0000 0000 0000 0001 1000 0111 // load addr.0001 low byte 87 0100 1000 0000 0000 0000 0001 1011 1011 // load addr.0001 high byte BB 0100 0000 0000 0000 0000 0010 1000 1000 // load addr.0010 low byte 88 0100 1000 0000 0000 0000 0010 1011 1011 // load addr.0010 high byte BB 0100 0000 0000 0000 0000 0011 1111 1111 // load addr.0011 low byte FF 0100 1000 0000 0000 0000 0011 1100 1111 // load addr.0011 high byte CF 0100 1100 0000 0000 0000 0000 0000 0000 // write page
スタートキー、行こう!
わずか425回のクリックで、MKが蘇ります。 今、あなたは間違いなく、こののろわれた島から見つけられ、救われるでしょう。