8051 ファミリの ATMEL AT89C51 でアプリケーションを開発しています。
電源の再投入またはソフトウェアによってリセットが行われたかどうかをコーディングで判断する方法を誰かが提案できますか?
8051 ファミリの ATMEL AT89C51 でアプリケーションを開発しています。
電源の再投入またはソフトウェアによってリセットが行われたかどうかをコーディングで判断する方法を誰かが提案できますか?
Atmel 8051 Microcontrollers Hardware Manual (PDF リンク)によると、電源制御レジスタ (PCON / 87h) の電源オフ フラグ (POF / ビット 4) は、VCC が 0 から公称電圧に上昇したときにハードウェアによって設定されます。電源オフ フラグのリセット値は、電源オン (コールド リセット) 後にのみ 1 になります。ウォーム リセット (ソフトウェア リセットなど) は、このビットの値に影響しません。
さまざまなベンダーが、このような場合に利用できる SFR 空間に独自のレジスタを実装していることがよくあります。たとえば、Silicon Labs では、リセット ソース レジスタ (RSTSRC) でパワーオン リセット フラグ (PORSF) を使用しています。
特定の 8051 バリアント ベンダーに依存するかどうかは、大きく異なります。ベンダー提供のレジスターを使用するのが最善ですが、ベンダーを変更すると、コードが壊れたり、さらに悪いことに、誤動作を引き起こします。
システムに外部 RAM があり (バッテリ駆動ではない)、メモリの予約済み部分のどこかに一連のバイト (0xAA、0x55 など) を書き込み、それがまだそこにあるかどうかを確認することができます。起動後。そうでない場合は、コールド スタートです。もちろん、アセンブラーの起動コードを変更して、メモリのこの部分が初期化されないようにする必要があります (または、開始ごとにゼロになります)。また、このメモリをリンケージから除外するようにリンカーに指示する必要があります。他のものに使用されます。
最後に、コードに条件付きコンパイルを含めて、特殊レジスタを備えた 8051 バリアントがある場合はそれを使用し、そうでない場合はプラン B を試してください。
私は数バイトの内部 8051 メモリでそれを行いました / すべての外部 RAM はバッテリ駆動でした / そして、すべての 8051 バリアントが起動時に一貫したポリシーを持っているわけではないことを知りました - すべての内部メモリが初期化されているものもあれば、初期化のみされているものもありますSFR と他のいくつかの特定の領域により、説明されている手順を実行するために数バイトが残っています。
一度リセットすると8051の最初からすべてが始まるため、リセットがどのように発生したかを判断する方法はないと思います.
私がうまくいくと思う1つの方法は、
リセットのすべてのソフトウェアコードの前に変数Xを取り、X = 1(ソフトウェアリセットを示す)を設定し、外部とインターフェースする場合はこの変数を任意のROMに保存するとします。
リセットごとに、最初に、この変数 X をチェックしてどのリセットが発生したかを確認し、次回の検出のために X を 0 に変更するインスタンスを含めます。
外部 ROM がない場合は、少なくとも D ラッチを接続します。
これがうまくいくことを願っています。これが機能するかどうか教えてください。