結論はほとんどありませんか? RESETを使用します

マイクロコントローラー上のデバイスの開発者の多くは、入力/出力ポートの数を除いて、選択されたMKがすべてのパラメーター(速度、メモリー、必要な機能の可用性)に適している状況に少なくとも一度直面しました。 「足」が1つしか欠落していない場合は特にがっかりします。そのため、チップの次のモデルを選択する必要があります。 ボード上のより多くのスペースを占有し、より多くの電力を消費し、最終的にはさらにコストがかかります。



ポートを節約するために、開発者は信じられないほどのトリックに頼ります。 たとえば、あるフォーラムで、RCチェーンを通じて1つのポート(データとクロック)のシフトレジスタを制御する方法に出会いました。 これらの方法の一部は、デバイスの信頼性の低下とその再現性の低下につながります(チップの特定のインスタンスのパラメーターによって異なります)。そのため、すべての長所と短所を分析して、慎重に使用する必要があります。



ただし、「余分な」ポートを見つける方法があります。これは単純で安定しており、多くの場合に使用できます。 これはRESETピンの使用です。





実際、私は2つの方法を知っています。



1つ目は、MKに特別なフラグ(ヒューズ)RSTDISBLがあり、プログラム(「0」に設定)されると、RESETピンを通常のI / Oポートに変え、他のポートと一緒に使用できることです。 この方法は簡単ですが、1つの重大な欠点があります。そのような切り替えの後、通常最も一般的なタイプのデバイスである低電圧プログラマーを使用してMKをプログラムできません。 突然MKに新しいプログラムを縫い付けたい場合は、RESETピンで12ボルトを使用するプログラマが必要になります。 そのようなプログラマーはあまり一般的ではないので(実際、その威厳はスイッチRESETのような状況でのみ現れ、そうでなければ低電圧のものよりは良くありません)、この方法は(完成したデバイスをコピーするのではなく)デバイスの開発にはあまり適していないと思います。



2番目の方法は、おもちゃ「Traffic Light」を開発したときに私が発明しました。 アイデアによると、信号機は2つの方向(赤2、緑2、黄色1)で信号を発するはずでした。さらに、動作モードを通常と「夜」(黄色の点滅)の間で切り替えられるようにしたいと思います。 したがって、LEDを制御するための5つの出力と、モード切り替えボタン用の1つの入力が必要でした。



8ビットAVRマイクロコントローラーのラインの中で最小のものはAttiny13およびその対応するATtiny25、ATtiny45、Attiny85であり、主に大きなメモリ容量で区別されます。 これらのデバイスは8ピンパッケージで作られているため、電圧を供給するためにリードを差し引くと、最大6つのI / Oポートが残りますが、そのうちの1つはRESETによって占有されるため、5つのポートが残ります。 これでLEDを制御できますが、ボタンには問題が残ります。



そして、リセット入力を使用してボタンを接続するというアイデアが思いつきました(図を参照)。





このオプションは次のように機能します(ATtiny13の例の表記):MKにはステータスレジスタMCUSRがあり、そのビット0..3はMKリセットの原因に応じて「1」に設定されます。



ビット0-電源投入時にリセット。

ビット1-RESETピンでの低リセット。

ビット2-低電圧検出器の動作時にリセット。

ビット3-ウォッチドッグタイマーによるリセット。



MK(割り込みベクトル0)の初期化手順では、MCUSRレジスタを確認し、リセットの原因を見つけることができます。 チェックした後、ビットに「0」を書き込んでレジスタをクリアする必要があります。



デザインでは、RESETピンで低レベルのリセットが発生したかどうかを確認しました。 はいの場合、ユーザーはモード切り替えボタンを押しました。 この場合、プログラムは動作モードを切り替えます。



注:MKを再起動する理由に関係なく、すべての内部デバイスがリセットされます。 つまり、必要なモードで必要なデバイス(タイマー、I / Oポートなど)を再起動するたびに、初期化手順が必要になります。 レジスタとメモリの状態は、RESETピンを低レベルにリセットしても変更されません(モードを切り替えたり、別の制御アクションを実行できます)が、電源を入れたり電源電圧を下げてリセットすると、メモリとレジスタを初期化する必要があります。あいまいになります。



説明した方法が誰かに役立つことを願っています。 ご質問やご提案にお答えします。



UPD:コメントがスピーチをしたので、私はもう一つのスキームを与えます、トピックについては全くではありませんが、私はそれが役に立つと思います。 タスクは、ゲーム「Brain Ring」のタイマークロックを作成することでした。 それはほとんど野外の状況にあり、手元に配線がほとんどなかったので、2線式ラインのLEDを制御し、ボタンの押しを制御するために、リモートを作成する方法を理解する必要がありました。 次のスキームが開発されました。









次のように機能します。ボタンの状態を確認する必要がある場合は、レベル「0」をPD0に入力してPD1を確認します。 ボタンを押すと、「0」が表示されます。 LEDを点灯するには、PD0を「1」、PD1を「0」にします。 ゲームの詳細は誰かがボタンを押すのを待ってからLEDを点灯させることなので、動的な表示さえ必要ありません。まずクリックを待ってからLEDを点灯します。



興味深い点がありました:デバッガーですべてが正常に機能し、開始時にレイアウトをテストすると、押されたボタンがすぐに検出されました。 頭を悩ませた後、入力用のPD1ポートの初期化(プルアップ抵抗を使用)とそのステータスのチェックの間に遅延を追加しようとしました。 リモコンへの長い配線の静電容量(約10メートル)により、プルアップ抵抗により信号レベルがすぐに「1」に達しないことが判明しました。 遅延はわずか数マイクロ秒でしたが、MKはすぐに動作し、これは重要であることが判明しました:)



UPD2:信号機ファームウェア(ASMとコンパイル済みコードのソース) はここにあります 。 行56〜72に注意してください。これらの行には、リセットのタイプを認識するための説明されたロジックが含まれています。



All Articles