問題タブ [xc8]
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.
compiler-construction - PIC16 C コンパイラ
Windows で動作する PIC 16 ファミリ用の優れた C コンパイラを探しています。
何人かの同僚がbknudcを使用していますが、何人かはそれを嫌っているようです。どうやらリンカーを効率的に使用することはできず、すべてのコードをインクルード ファイルに設定するのが最善であることがわかりました。
SDCCは良さそうに見えますが、まだベータ版のようで、セットアップや対処が簡単ではありません。
他にもかなりの数のオプションがありますが、それらはすべて、それら自体に応じて利用できる最良のものです。このトピックについて議論しているフォーラムをいくつか見つけましたが、誰も互いに同意していないようです。MikroC、CCS(高価)、HiTech、BoostC。
何が良くて何が悪いのか、本当の情報を知りたいです。
私が正しければ、PIC16 アーキテクチャは本当に C フレンドリーではないのでしょうか? とにかくプログラマーが ANSI C で作業できるようにするコンパイラーはありますか? そして、十分に良いデバッガをセットアップする方法は?
c - 非標準関数の戻り値の型: Splint 解析エラーの修正
組み込みシステム XC8 C コンパイラ (PIC マイクロプロセッサ用) を使用しています。以下が許可されています。
ただし、非標準の C であるため、Splint 静的アナライザーは次のエラーを返します。
解析エラー: 非関数宣言: ビット: "--------------------------------------"整数。
エラーのファイル/行は、それぞれの .h ファイルの関数プロトタイプです。
Splint が残りのファイルを分析できるようにするには、どうすればこれを修正できますか? 次の 2 つの方法があると思います。
CLI 経由で Splint に渡すことができるフラグを見たことを覚えていると思います。これは、指定された非標準型を標準型に置き換えるように指示します (たとえば、bit を unsigned char に置き換える) が、今はまったく見つからないようです!
また、おそらく、ANSI-C 要件を満たしながら、XC8 が戻り値の型を
bit
?
進捗:
フォーラムで次の情報を見つけましたが、マニュアルで -D フラグの使用方法に関する情報が見つかりません。
キーワードを無視するには、 -Dnonstandardkeyword= を追加して、プリプロセッサがそれを削除するようにします
と
-Dspecialtype=int を使用して、カスタム型を int として解析します。
c - このステート マシンがその状態を維持しないのはなぜですか?
こんにちは、StackOverflow!
次のコードには、外部照明デバイスの動作を変更する単純なステート マシンがあります (コメントが示すように)。状態は、GP1 に接続されたボタンを押すことによって変更されます。GP1 に接続されている回路は、VDD を 0.6VDD と比較するコンパレータ デバウンシング回路であり (RC/ダイオード/シュミット トリガ回路も試しました)、信号を強制的に LO にします。ボタンをすばやく押すと、スコープ上にきれいな方形波が表示されます。
PIC10F200の現在の (そして望ましくない)動作は次のとおりです。
- スイッチが押されている (状態 = 0)
- ステート マシン変数のインクリメント (状態 = 1)
- 照明はケース 1 に進み、オンになります
- 照明が 1 秒以上点灯している
- 照明が消える
- ボタンが再び作動するか、電源がオフになるまで、システムはこの状態を維持します
問題は、なぜこのように振る舞うのかということです。また、可能であれば、ボタンを 1 回押すだけで状態が 1 つ増えるように修正するにはどうすればよいでしょうか。システムの電源が入っていて、ボタンが再び作動しない限り、PIC はそれを維持しますか?
更新: このコード/システムで何を達成しようとしているのかについて少し混乱しているように見えるので、完全なコンテキストを提供しましょう。このマイクロコントローラであるPIC10F200は、エレクトロルミネセンス (EL) ワイヤ ドライバの全体的なボード設計の一部です。マイコンコントローラは、ドライバICのポートに接続することで、ドライバ回路を有効にするかどうかを制御するだけです。システムには 4 つの動作モードがあり、ワイヤは常時オン、ワイヤは点滅、ワイヤは高速で点滅、低周波ビートが検出されるたびにワイヤが点滅します (システム内の別の回路)。GP0
EN
これらの動作モードからの移行は、PCB に取り付けられる押しボタン (一時的にオン) スイッチによって制御されます。これstate
には、上記のコードで、ボタン操作間で安定した状態を維持することが必要です。現在、これは行われておらず、この投稿の元の部分で説明されているように動作します。質問のタイトルが示すように、現在安定していないのはなぜstate
ですか?どうすれば安定しますか?
更新 (2014-03-08): 解決策
GP0 が出力で、GP2 が T0CKI で、作動時に信号を LO に駆動するスイッチがあると仮定して、次の設定を行う必要があります。
OPTION のビット 0 ~ 3 が本当に重要かどうかは、判断の呼び出しであり、WDT モジュールの使用を選択するかどうかです。
さらに、ボタン リリース検出の実装は、カウント中の任意の時点で GP2 が LO になるとリセットする単純なカウンター メカニズムです。
c - 複数のソース ファイルにわたる XC8 ライブラリの編成と #define
これは複雑な投稿ですので、しばらくお待ちください。なるべく凝縮させてみました…
PIC マイクロコントローラー用の別のツール チェーンを使用して XC8 を使用しています。以前のコンパイラでは、独自のライブラリのセットアップと使用、およびこれらのライブラリ全体での定義の使用がはるかに簡単に思えました。
再利用のために独自の関数ライブラリを作成したいと考えています。また、それらすべてを自分で選択したディレクトリ構造に保存したいと考えています (これは、複数のマシン間で、およびその他のさまざまな理由で、それらが自動的に同期されるようにするためです)。以下は、単純化された架空のファイル構造です。
\projects\my_project //現在のプロジェクト ディレクトリ
\some_other_directory\my_library\comms_lib //私の通信ライブラリ
\some_other_directory\my_library\adc_lib //私の ADC ライブラリ
ここで、引数のために、私のライブラリのそれぞれに __XTAL_FREQ 定義が必要であるとしましょう。頻度はプロジェクトごとに異なる可能性があります。
ここに私の質問があります:
ライブラリ ファイルの場所をコンパイラに伝える最良/最も効率的な方法は何ですか?
すべてのヘッダー ファイルに __XTAL_FREQ を追加する以外に、すべてのヘッダー ファイルで定義を使用できるようにするにはどうすればよいですか?
別のヘッダー ファイル (project_config.h としましょう) に格納する必要があると誰かが言う可能性があります。このファイルは、将来のプロジェクトごとに配置され、それに応じて変更されます。別のヘッダー ファイルが答えである場合、次の質問は、ライブラリ ヘッダー (プロジェクトと同じディレクトリにない) を取得して、新しいプロジェクトごとに project_config.h ファイルを正しく参照するにはどうすればよいですか?
前もってありがとう、マーク
i2c - XC8 pic16f876a I2C slave
How to implement the code to use the peak in slave mode?I come to you because I have not found on the web a satisfactory answer to my search.
I am an experienced train principle on orders outsourced PIC16FXXX. The goal is to unload the electronic map of the less urgent tasks.
To do this, I would use the I2C. Until then, I merely driven components already established. And now, I have my own component.
You might say to me that all the crap is useless but it is important to know where you are going.
So I set up a toolchain cross between my PC and my pic with MPLAB and reliable compiler XC8 Hi-Tech.
I Locate a good example of code and it seems complete to send data to a component. I have not been able to receive control on my PIC.
This is what I wrote in C (the compilation is ok): i2c.h
#xA;main.c
#xA;Example of communication: Start bit 11110000 -> 1111000 (code) + 0 (write) ACK (slave) 00000001 -> LED 7 = 0/6 = 0 Led / Led 5 = 0/4 = 0 Led / Led 3 = 0/2 = 0 LED / LED 1 = 0/0 = 1 Led Stop bit
wait Master
Start bit 11110000 -> 1111000 (code) + 0 (write) ACK (slave) 00000000 -> LED 7 = 0/6 = 0 Led / Led 5 = 0/4 = 0 Led / Led 3 = 0/2 = 0 LED / LED 1 = 0/0 = 0 Led Stop bit
wait master Loop
Here are question I pose now. How to implement the code to use the peak in slave mode?
Thank you very much for your help.
c - C char 配列または文字列の発音区別記号
バックグラウンド
私はいくつかの組み込みプロジェクトに取り組んでおり、非標準の文字とフォントを処理しようとしています。
600 以上の要素配列に生のビットマップ フォントがあります。この配列の 5 要素ごとに 1 文字が含まれます。最初の 5 要素に 32 文字 (スペース)、6 ~ 10 要素に 33 文字 (!) などがあります。
国別の分音記号 ("ę" など) を処理する必要があります。122 文字の後に配置しました。print("Test ę");
Cソースを入力したときに適切な文字が出力されるように、文字を再マップしようとしています。
問題
したがって、ソースに次のように入力します。
これを試すと(Cが「ę」にどのコードを入れるかを確認しようとしました):
これを回避するには?
XC8 コンパイラ (gcc ベース?) を使用しています。
コンパイラのマニュアルで、7 ビット文字エンコーディングを使用していることを確認しましたが、何か方法があるのでしょうか? ソース ファイルは UTF-8 でエンコードされています。
編集
エミリエンによって提案された wchar.h は私にとってはうまくいくように見えますが、残念ながら私のコンパイラには wchar.h がありません。
たぶん、プリプロセッサのトリックですか?次のような筋金入りのテキスト準備は本当に避けたいです。
assembly - Microchip XC8 が .as ファイルを複雑に書き込むのはなぜですか?
以下のコードでは、TRIS レジスタの 1 番目、2 番目、3 番目、最後に 4 番目のビットを設定しています。生成されたアセンブリ コードが...おかしいのはなぜですか?
知っておくと便利: コードがコンパイルされるマイクロコントローラーのデータ メモリは、いくつかのバンクに分割されます。ビット 6 と 7 はstatus
レジスタの位置 5 と 6 に入り、ビット 0 ~ 5 のみがオペコードに格納されます。TRIS
したがって、位置 0x86 のレジスタにアクセスする場合、オペコードに格納される値は6
.
具体的な質問:
(134)^080
: これは、特定の銀行6
のアドレスである に変換されます。TRIS
なぜコンパイラは単に or を書かないの(6)
です(134)
か? TRIS がバンク 0 にないことを明確にするためだけですか、それとも他の理由がありますか?+(0/8)
:0
ビット位置を表し、8
そのレジスタ内の総ビット数を表します。私の意見では、結果は常に分数であり、決して整数ではないため、この式は何の役にも立ちません。したがって、アドレス計算には寄与しません。(0)&7
:(0)
は再びビット位置を表しますが、バイナリ AND がどのような目的で7
機能するのかは、私にはよくわかりません。- コマンドは何をし
line
ますか?
コード (生成された *.as ファイルからの抽出)
c - プログラムは無限ループを終了します (PIC マイクロコントローラ)?
PIC 16f690 マイクロコントローラ用のプログラムを書いたのは、自分のプログラムが無限ループから抜け出しているように見えることに気付いた後です。
PORTC のピン 3、4、5 に LED があります。
私が理解している限りでは、LED は約 1 秒間点灯し、その後永久に消灯するはずです。代わりに、毎秒点滅し続けます。
これを MPLABX で書き、PICkit3 と C8 コンパイラを使用してプログラムしました。