問題タブ [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.

0 投票する
8 に答える
7012 参照

compiler-construction - PIC16 C コンパイラ

Windows で動作する PIC 16 ファミリ用の優れた C コンパイラを探しています。

  • 何人かの同僚がbknudcを使用していますが、何人かはそれを嫌っているようです。どうやらリンカーを効率的に使用することはできず、すべてのコードをインクルード ファイルに設定するのが最善であることがわかりました。

  • SDCCは良さそうに見えますが、まだベータ版のようで、セットアップや対処が簡単ではありません。

  • 他にもかなりの数のオプションがありますが、それらはすべて、それら自体に応じて利用できる最良のものです。このトピックについて議論しているフォーラムをいくつか見つけましたが、誰も互いに同意していないようです。MikroCCCS(高価)、HiTech、BoostC。

何が良くて何が悪いのか、本当の情報を知りたいです。

私が正しければ、PIC16 アーキテクチャは本当に C フレンドリーではないのでしょうか? とにかくプログラマーが ANSI C で作業できるようにするコンパイラーはありますか? そして、十分に良いデバッガをセットアップする方法は?

0 投票する
2 に答える
861 参照

c - 非標準関数の戻り値の型: Splint 解析エラーの修正

組み込みシステム XC8 C コンパイラ (PIC マイクロプロセッサ用) を使用しています。以下が許可されています。

ただし、非標準の C であるため、Splint 静的アナライザーは次のエラーを返します。

解析エラー: 非関数宣言: ビット: "--------------------------------------"整数。

エラーのファイル/行は、それぞれの .h ファイルの関数プロトタイプです。

Splint が残りのファイルを分析できるようにするには、どうすればこれを修正できますか? 次の 2 つの方法があると思います。

  1. CLI 経由で Splint に渡すことができるフラグを見たことを覚えていると思います。これは、指定された非標準型を標準型に置き換えるように指示します (たとえば、bit を unsigned char に置き換える) が、今はまったく見つからないようです!

  2. また、おそらく、ANSI-C 要件を満たしながら、XC8 が戻り値の型をbit?

進捗:

フォーラムで次の情報を見つけましたが、マニュアルで -D フラグの使用方法に関する情報が見つかりません

キーワードを無視するには、 -Dnonstandardkeyword= を追加して、プリプロセッサがそれを削除するようにします

-Dspecialtype=int を使用して、カスタム型を int として解析します。

0 投票する
3 に答える
461 参照

c - このステート マシンがその状態を維持しないのはなぜですか?

こんにちは、StackOverflow!

次のコードには、外部照明デバイスの動作を変更する単純なステート マシンがあります (コメントが示すように)。状態は、GP1 に接続されたボタンを押すことによって変更されます。GP1 に接続されている回路は、VDD を 0.6VDD と比較するコンパレータ デバウンシング回路であり (RC/ダイオード/シュミット トリガ回路も試しました)、信号を強制的に LO にします。ボタンをすばやく押すと、スコープ上にきれいな方形波が表示されます。

PIC10F200現在の (そして望ましくない)動作は次のとおりです。

  1. スイッチが押されている (状態 = 0)
  2. ステート マシン変数のインクリメント (状態 = 1)
  3. 照明はケース 1 に進み、オンになります
  4. 照明が 1 秒以上点灯している
  5. 照明が消える
  6. ボタンが再び作動するか、電源がオフになるまで、システムはこの状態を維持します

問題は、なぜこのように振る舞うのかということです。また、可能であれば、ボタンを 1 回押すだけで状態が 1 つ増えるように修正するにはどうすればよいでしょうか。システムの電源が入っていて、ボタンが再び作動しない限り、PIC はそれを維持しますか?

更新: このコード/システムで何を達成しようとしているのかについて少し混乱しているように見えるので、完全なコンテキストを提供しましょう。このマイクロコントローラであるPIC10F200は、エレクトロルミネセンス (EL) ワイヤ ドライバの全体的なボード設計の一部です。マイコンコントローラは、ドライバICのポートに接続することで、ドライバ回路を有効にするかどうかを制御するだけです。システムには 4 つの動作モードがあり、ワイヤは常時オン、ワイヤは点滅、ワイヤは高速で点滅、低周波ビートが検出されるたびにワイヤが点滅します (システム内の別の回路)。GP0ENこれらの動作モードからの移行は、PCB に取り付けられる押しボタン (一時的にオン) スイッチによって制御されます。これstateには、上記のコードで、ボタン操作間で安定した状態を維持することが必要です。現在、これは行われておらず、この投稿の元の部分で説明されているように動作します。質問のタイトルが示すように、現在安定していないのはなぜstateですか?どうすれば安定しますか?

更新 (2014-03-08): 解決策

GP0 が出力で、GP2 が T0CKI で、作動時に信号を LO に駆動するスイッチがあると仮定して、次の設定を行う必要があります。

OPTION のビット 0 ~ 3 が本当に重要かどうかは、判断の呼び出しであり、WDT モジュールの使用を選択するかどうかです。

さらに、ボタン リリース検出の実装は、カウント中の任意の時点で GP2 が LO になるとリセットする単純なカウンター メカニズムです。

0 投票する
1 に答える
495 参照

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 定義が必要であるとしましょう。頻度はプロジェクトごとに異なる可能性があります。
ここに私の質問があります:

  1. ライブラリ ファイルの場所をコンパイラに伝える最良/最も効率的な方法は何ですか?

  2. すべてのヘッダー ファイルに __XTAL_FREQ を追加する以外に、すべてのヘッダー ファイルで定義を使用できるようにするにはどうすればよいですか?
    別のヘッダー ファイル (project_config.h としましょう) に格納する必要があると誰かが言う可能性があります。このファイルは、将来のプロジェクトごとに配置され、それに応じて変更されます。別のヘッダー ファイルが答えである場合、次の質問は、ライブラリ ヘッダー (プロジェクトと同じディレクトリにない) を取得して、新しいプロジェクトごとに project_config.h ファイルを正しく参照するにはどうすればよいですか?

前もってありがとう、マーク

0 投票する
0 に答える
3959 参照

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.

0 投票する
2 に答える
559 参照

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 がありません。

たぶん、プリプロセッサのトリックですか?次のような筋金入りのテキスト準備は本当に避けたいです。

0 投票する
2 に答える
1095 参照

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 ファイルからの抽出)

0 投票する
2 に答える
1969 参照

c - プログラムは無限ループを終了します (PIC マイクロコントローラ)?

PIC 16f690 マイクロコントローラ用のプログラムを書いたのは、自分のプログラムが無限ループから抜け出しているように見えることに気付いた後です。

PORTC のピン 3、4、5 に LED があります。

私が理解している限りでは、LED は約 1 秒間点灯し、その後永久に消灯するはずです。代わりに、毎秒点滅し続けます。

これを MPLABX で書き、PICkit3 と C8 コンパイラを使用してプログラムしました。

0 投票する
0 に答える
1323 参照

c - eeprom_write/read 関数によりコンパイル エラーが発生する (PIC マイクロコントローラ)

PIC 16f690 マイクロコントローラ用に MPLABX と C8 コンパイラを使用しています。

C8 データシートを読むと、eeprom_write/read 関数が xc.h ヘッダーに含まれているようです。ただし、MPLAB は関数を認識せず (識別子 eeprom_write/read を解決できない)、コンパイルしません。eeprom を使用するために必要な他の初期化はありますか?

保存しようとしている変数は、どちらも 1 バイト未満の符号なし文字です。文脈から外れて、これはそれらがどのようにフォーマットされているかです(「最終」は以前に宣言された文字です):

0 投票する
2 に答える
6391 参照

c - plib I2C 関数に関する XC8 で「未定義のシンボル」エラーを受け取る

こんにちは、StackOverflow!

私の質問は、下に(はるかに)貼り付けられたプログラム内で報告されているエラーに関するものです。ターゲット デバイスはPIC12LF1552で、シリアル ペリフェラルが 1 つ搭載されており、Microchip の XC8 コンパイラに付属のライブラリと組み合わせて使用​​できると想定しました。インターネット上の一部のソースは、PIC18 ラインのハイエンド デバイスのみがライブラリ機能をサポートすると述べていますが、他のソースは、ライブラリ機能は問題なく動作すると述べています。そのため、I2C 関数をゼロから書き直すことも、このプロジェクト用にアセンブリをまったく作成することもしないことにしました。そこで、XC8 に付属の周辺ライブラリを使用することにしました。それらをソースする方法については、コンパイラのドキュメントを読みました(i2c.h下)。ドキュメントと私が見たいくつかの例に従って、これらのコマンドで実行するエラーチェックがいくつかあることは知っていますが、当面は、マスターとスレーブの両方が完全に動作すると仮定して、これを取り除くことができます地面。

関連するすべてのパスを含めました。そのため、コンパイル プロセスでここまで到達すると想定しています。C 言語とコンパイラの内部動作に関する私の知識レベルは非常に限られています。これらのツールを基本レベルで使用する方法しか知らないので、ここで欠けている基本的なものがあるかもしれません。

とにかく、このコードを MPLABX v1.95 でコンパイルすると、次のようになります。

:0: error: undefined symbols: _AckI2C(dist/pickit3/production\strobe.X.production.obj) _ReadI2C(dist/pickit3/production\strobe.X.production.obj) _IdleI2C(dist/pickit3/production\strobe.X.production.obj) _OpenI2C(dist/pickit3/production\strobe.X.production.obj) _StopI2C(dist/pickit3/production\strobe.X.production.obj) _NotAckI2C(dist/pickit3/production\strobe.X.production.obj) _WriteI2C(dist/pickit3/production\strobe.X.production.obj) _StartI2C(dist/pickit3/production\strobe.X.production.obj)

Google、StackOverflow、または私の特定のコンテキストからこの問題に関連するものを見つけることができませんでした (別の人が、Microchip のレガシー C18 コンパイラから移植するときに非常によく似た問題を抱えていましたが、私はその人が彼の問題を解決するために行ったすべてのことを既に行いました) .

問題は、なぜこのコンパイラ エラーが発生するのかということです。また、C 言語または Microchip の実装でこれを引き起こしているメカニズムは何ですか?