5

いくつかの値をレジスタに送信し、1 秒待ってから値を変更するプログラムを作成することになっています。問題は、動作を 1 秒間停止する命令が見つからないということです。

4

3 に答える 3

11

タイマー割り込みを設定するのはどうですか?

このKeil 8051 アプリケーション ノートには、いくつかの役立つヒントとコード スニペットがあります。

于 2010-03-10T18:50:22.927 に答える
4

そのような「指示」はありません。ただし、少なくとも 1 つのハードウェア タイマー ペリフェラルがあることに疑いの余地はありません (正確なペリフェラル セットは、使用している正確なパーツによって異なります)。使用している部品のデータシート/ユーザーマニュアルを入手し、タイマーのプログラム方法を理解してください。その後、それをポーリングするか、割り込みを使用できます。通常、定期的な割り込みを生成するようにタイマーを構成し、次にカウンター変数をインクリメントします。

タイマー割り込みについて知っておくべき 2 つのこと: まず、カウンター変数が 8 ビットより大きい場合、それへのアクセスはアトミックではないため、割り込みコンテキストの外側では、割り込みを一時的に無効にして読み取りを行うか、2 回読み取る必要があります。それを検証するために同じ値を連続して使用します。次に、タイマー カウンター変数を宣言volatileして、コンパイラがその変数へのアクセスを最適化しないようにする必要があります。これは、割り込みとスレッド間で共有されるすべての変数に当てはまります。

別の代替手段は、サポートされている場合、低電力の「スリープ」モードを使用することです。目的の期間の後にプロセッサをウェイクアップするタイマーを設定し、必要なスリープ命令を発行します (これは、コンパイラによって「組み込み」として提供されるか、周辺レジスタによって制御される場合があります。これは一般的なアドバイスであり、 8051固有;あなたの部品がスリープモードをサポートしているかどうかはわかりません。

いずれにせよ、部品固有のドキュメントに目を通す必要があります。正確な部分を教えていただければ、それについての助けが得られるかもしれません。

3 番目の解決策は、8051 固有の RTOS カーネルを使用することです。このカーネルは、探している周期的な遅延機能と、マルチスレッドおよび IPC を正確に提供します。

于 2010-03-10T21:01:45.890 に答える
4

10msごとに中断するようにタイマーを設定します。その割り込みで、変数をインクリメントします。

また、割り込みを無効にしてその変数を読み取る関数を作成する必要があります。

メイン プログラムでは、タイマー変数を読み取り、開始時よりも10 100 大きくなるまで待ちます。

タイマー変数のロールオーバーに注意することを忘れないでください。

于 2010-03-10T19:04:51.823 に答える