問題タブ [8051]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - 8051 (8 ビット) マイクロコントローラでの予期しないビット シフト結果
次のコードを検討してください。
このコードは TI CC1111 SoC (8051 コアを搭載) で実行され、最適化なしで C99 方言を使用するように構成された IAR EW8051 8.10.3 を使用してコンパイル/デバッグされています。コメント内の値は、IAR デバッガーで観察されたものです (シミュレーターまたは実際のデバイスを使用した同じ結果)。
aftercrc16 = crc16 << 8;
は ではなくcrc16
の値になると思います。 0x4300
0x0000
C99 標準 (まあ、2005 年 5 月 6 日ドラフト) のセクション 6.5.7.3-4 によると。
整数昇格は各オペランドで実行されます。結果の型は、昇格された左オペランドの型です。右オペランドの値が負の値であるか、プロモートされた左オペランドの幅以上である場合、動作は未定義です。
E1 << E2 の結果は、E1 左シフトされた E2 ビット位置です。空いたビットはゼロで埋められます。E1 が unsigned 型の場合、結果の値は E1 × 2^E2 となり、結果の型で表現可能な最大値より 1 を法として減じられます。E1 に符号付きの型と非負の値があり、E1 × 2^E2 が結果の型で表現できる場合、それが結果の値です。それ以外の場合、動作は未定義です。
これに対する私の見解は、結果の型は符号なしの 16 ビット整数で、値が((0x0043)*(2^8)) % 0x10000 == 0x4300
.
何か不足していますか?ありがとう。
frequency - C8051F996 の UART および FSK 実装
UART 信号を送信しようとしていますが、FSK エンコードされています。ボーレート 290 で UART が動作しています。P0.7TX で送信しています。コンピューターに接続すると、期待どおりの結果が得られます。ただし、この UART の FSK 信号を生成してオーディオ経由で送信し、そこでデコードしたいと考えています。今のところ、データの送信のみに集中しています。
0 と 1 の周波数を作成するために、PCA に基づいて 2 つの関数を作成しました。だいたい1.2kHzと2.4kHzくらいです。また、「loopOne」と「loopZero」は割り込み内で実行する必要があることもわかりました。そうしないと、MCU が loopOne と loopZero を順番に呼び出して、波形を歪ませます。
したがって、私の問題は、割り込みラインを介してUARTの出力を取得し、割り込みを呼び出してから、TXが低いか高いかに応じて割り込みに関数を呼び出す方法がわからないことです。
2つの外部割り込みでそれを行うことができます.1つは出力が低いとき用で、もう1つは出力が高いとき用ですが、別の目的で割り込みの1つが必要なので、同じ割り込みまたは別の割り込みを連結して使用する必要があります。どの関数を呼び出すかを区別する必要があります。
私はCコードでSilicon Laboratories IDEを使用しています。MCU は SiLabs C8051F996 です。
c - アドレス空間オーバーフロー
コードで問題が発生しています。コードをコンパイルすると、Address Space Overflow というエラーが発生します。これを解決するにはどうすればよいですか。私は keil コンパイラと AT89C51RD2 MCU を使用しています。これは、これまでに使用されたスペースです -
プログラムサイズ: data=149.0 xdata=594 const=1136 code=8467 .
メモリ全体を使い果たした可能性があります。
エラーステートメントは次のようになります。
エラー L107: アドレス空間のオーバーフロー
スペース: メモリスペース(DATA)
セグメント: セグメント名(Function_name)
長さ: 000004H
説明: 指定されたセグメントは、指定されたアドレス空間に配置できません。 セグメントは無視されます。
ありがとう
c - 関数がまったく実行されていない、または正しく実行されていない
killnoise 関数が呼び出されても実行されず、プログラムが常にそれに到達する組み込み C プログラムで作業していますが、この関数の出力で値をチェックすると、何も起こらなかったことがわかります。
ここに私がそれを呼ぶ場所と方法があります:
ここで、NUMPOINTS、biguparray、bigleftarray ... は以前に宣言されたグローバル変数です。
ご協力いただきありがとうございます(別の機能で同じ問題に直面しています)
c - ビットが左にシフトしないのはなぜですか?
私は Keil に埋め込まれた C を使用しています。私は、ビットを保存し、ビットシフトしてから再度保存し、8ビットすべてが保存されるまで繰り返すようにプログラムしようとしています。
ただし、デバッグすると(デバッグが間違っている可能性があります)、値は「01 00 00 00 00 00 00 ...」しか表示されません。論理「1」を格納してから左にシフトすると、「02 00 00 00 00 00 00...」と表示されます。ループが繰り返されると、同じことが何度も繰り返されます。私が期待したのは、「01 01 01 01 01 01 01...」でした (すべての入力ビットが「1」であるとしましょう)。この問題を解決するにはどうすればよいですか?
あ、もう解決しました。
c - keil uvision4 は 8051 ハードウェアの十分な代替品ですか?
8051 MC でプログラムまたは Embedded-C を作成したいと考えています。ISR、LED 点滅、ラウンド ロビンなどのプログラム。ハードウェアなしで可能ですか?プログラムを作成するには、keil uvision4 ハードウェア シミュレータだけで十分ですか? 助けてください。
c - ゼロへの最速の方法
unsigned int をゼロにする最速の方法は何ですか?
現在、値を 0 に設定しているだけですが、変数をゼロにするためのトリックがあるかどうかわかりません。現在のプロジェクトに数クロック サイクル戻る必要があります。私は標準の 8051 プロセッサを使用しており、2 つの異なる変数があり、それが役立つ場合はゼロにする必要があります。
c - シリアルポート伝送について助けが必要
現在、Keil C51 プログラミングで DS89C450 MCU を使用しています。
立ち下がりエッジ トリガーである P3^2 に赤外線レシーバーが接続されています。リモコンのキーを押すたびに、割り込みがトリガーされ、xdata X または Y に保存されます (ビットごと、次にバイトごとに 500 バイト)。
データ ビット ('1' または '0') をバッファからシリアル ポート経由でハイパーターミナルに送信しようとしています。ただし、リモコンを押してもデータが表示されません。
誰でも専門家が理由と方法を教えてもらえますか?
プログラムはここにあります:
c - タイマー値を変数に保存することは可能ですか?
私はDS89C450timer0を使用して、受信データの値が「0」のときに0からカウントし、データが「1」のときにのみ停止し、私が持っている値と比較します。ただし、タイマーがカウントした量の値を保存して、値の比較にifループを使用できるようにすることは可能ですか。
例えば:
誰かがそうすることが可能であることを知っていますか?
c - 8051でのコードの最適化
それで、私はこの挑戦をしなければなりません、それは8051マイクロコントローラーのためのカメラ監視システムを実装することです。
仕様は次のとおりです。
各カメラは動きセンサーに関連付けられており、動きを検出するたびに、このカメラの記録が登録および保存されるカメラの1つになります。センサーが5秒を超えて動きをキャプチャしない場合、このカメラはそれ以上記録されません。
カメラがオンになっていない場合は、ビデオレコーダーを「一時停止」する必要があります。
複数のカメラがオンになっている場合は、マルチプレクサ(mux)を使用して、各カメラが3秒間記録されるようにカメラ信号を選択する必要があります。このように、すべてのアクティブなカメラは3秒間記録する必要があります。アクティブなカメラが1つだけの場合、その信号はマルチプレクサ内の唯一のカメラである必要があります。
これは、以下のコードですでに達成しています。そして今やらなければならないことは、コンパイラーの最適化なしでコードのサイズを最適化することです。コードは今では198バイトですが、180バイト未満にしようとしています。
出来ますか?私はすでに#defineの計算を試みましたが、コンパイラーはすでにそれを最適化しています。