タグ付けされた質問 「c」

Cは、命令型(手続き型)システム実装言語です。比較的単純なコンパイラを使用してコンパイルし、メモリへの低レベルのアクセスを提供し、機械語命令に効率的にマップする言語構造を提供し、最小限のランタイムサポートを必要とするように設計されました。したがって、Cは以前はアセンブリ言語でコーディングされていた多くのアプリケーションに役立ちました。http://en.wikipedia.org/wiki/C_(programming_language)から

1
PIDでのD(差別化)の実装
モーター速度制御用のPIDコントローラーを実装しています。PIコントロールの実装が完了しましたが、これは完全にうまく機能します。仕様では、D部分に次の方程式を使用してフィルタリング手法を実装するように指示されています。 ここまでで私が理解しているのは、これは一般的にエラーの変化率に対応することをs表して"dx/dt"いますが、ここではフィードバックの変化率と関連付けることができます。Td/N全体的なゲイン出力を制限するためのものです(これが正しいと思います)。これをCコードで表すために、次の方法を試しました。 s = (CurrentFeedback()-Old_Feedback)*100/(MaxFeedback()); //to calculate the % change in feedback s = s*1000/sampleTime; //1000 is multiplied because sampleTime is in milliseconds D = (Td*s)/(1+(s*Td/N)); D = D*KP; //Kp is multiplied as per the standard pid equation. Old_Feedback = CurrentFeedback(); PID = P+I-D; さて、Dを追加した結果は、私が予測したものとは異なります。D部分の式を正しく実装したかどうかを知りたいだけですか?微分の基本的な数学の理解に間違いをしていますか? 注: VFDから直接取得されるため、kp、ti、tdの再計算を変更する自由はありません。

2
安全なUART通信プロトコルを作成するにはどうすればよいですか?
安全なUART / USB通信プロトコルを作成する方法を考えていました。マイコンとパソコンの通信に必要です。私は〜10個のコマンドを使用しており、それぞれに10個の個別の確認応答コマンドを使用すると思いました。 交換は次のようになります。 PCがUARTを介してウェイクアップコマンドを送信する µCはPCが接続されていることを認識し、そのコマンドをPCに送信します。 0x01 PCは要求された処理(一部のハードウェア関連)を実行し、~0x01完了時に応答します(2つの数の間に大きな「距離」を作成するために数を無視します)。 µC 0x01は送信したことを認識し~0x01、PCから期待しています。~0x01µCは、何か他のものが戻ってきた場合、何かがうまくいかなかったことを認識し、新しい要求またはエラーメッセージを送信します。 µCが送信する0x01場合、PCはそれを理解0x02して~0x02送り返しますが、~0x01ノイズによるµCの読み取りはかなり悪いでしょう。 送信に関してそれはどのくらい安全ですか、またはこれをより安全にするにはどうすればよいですか?

2
シリアル経由のMCUの制御コマンドの実装
PCからシリアル経由でコマンドを受け入れるようにするプロジェクトにコマンドインターフェイスを統合することを検討しています。 アイデアは、デバイスはそれを実行しますが、コマンドが送信され、それを実行するというものです。これは、シリアルデータを待機している単なるアイドルデバイスであることがわかったほとんどの例とは異なります。 たとえば、LEDを制御してアニメーションを再生するデバイスなどです。3つのプリセットアニメーションがあるとします。オンにすると、常に1番を再生します。PC側では、「プリセット2を再生」または「色を緑に変更」コマンドを送信するか、デバイスにライブリアルタイムアニメーションを送信します。 LEDで遊ぶ。 だから私の質問は、私はこの「デザインパターン」について多くの情報を見つけることができないということですか?どこを見ればよいのかわかりません。一番近いのは、既製のarduinoシリアル解析ライブラリです。ただし、C /非Arduino /理論的アプローチの詳細を探しています。 私はシリアルプロトコルを調べていますが、これはSPIやI2Cなどのことであり、実際にソフトウェアで制御/コマンドインターフェイスを実装する方法ではありません。 HDLCについても知りましたが、これは標準/プロトコルのようです。同様のスレッドは/programming/1445387/how-do-you-design-a-serial-command-protocol-for-an-embedded-system これはいくつかの非常に素晴らしい情報を持っていますが 、やるべきことですプロトコル/通信自体で。 これをコード化/実装してコマンドまたはコントロール機能を作成する方法を見つけようとしています。 無限ループを使用して、着信コマンドのシリアルを監視およびキャッチし、IFステートメントのリストを使用して、実行するコマンドを選択しますが、コマンドおよびシステムが正常である必要がない場合、またはその場合コマンドを逃した? 割り込み駆動、ステートマシン? 例を調べて見つけるために使用できる正式な名前はありますか? 編集: 同じ質問をしている人のために、私は調査中にこの本当に良い例を見つけました、 http://www.adnbr.co.uk/articles/parsing-simple-usart-commands

3
L3G4200Dランダムスパイク
L3G4200Dジャイロスコープに関してこのフォーラムを少し検索しましたが、この問題について言及したことはありませんが、他のフォーラムで他の人がそれについて話すのを見てきました。ジャイロスコープが静止していると、出力に奇妙な大きな値が表示されます。残念ながら、これがなぜだか誰も答えることができなかったようです。 したがって、私はi2cを使用して400kHz(高速モード)でジャイロからデータを収集し、マルチバイト読み取り(一度に6バイト)を使用してジャイロスコープデータを収集しています。100Hzでのサンプリング(上位800Hzも試した)、また、異なる値でのフィルタリングのオンとオフを試してみました。割り込みピンは使用していませんが、GYRCTRLREG4の「ブロックデータ更新」属性を使用しているため、LSBとMSBの両方が読み取られるまでデータは出力されません。フル2000dps、FIFOで何もしていません。正確であれば、正確なレジスタ値を投稿できますが、データシートが手元にない場合がほとんどです。 下の画像は私の問題を示しています。出力されているデータは適切であり、(私の知る限り)正しく計算されており、一般的なノイズは非常に許容範囲です。しかし、デバイスが静止しているときに、これらの迷惑な「ブリップ」がランダムに表示されることに気付きました。数秒間そのままにしておくと、これらのスパイクの1つが得られ、常に約250〜255になります(つまり、((output * 70)/ 1000 'を使用して変換すると〜18)。私が言うように、スパイクはランダムであり、任意の平面に表示できます(下の画像では、X平面の最初のスパイク、Yの2番目のスパイクを見ることができます)。 3つが同時に発生する可能性があります。大きな値は単一のサンプルの場合のみであり、通常に戻ります。 別のスレッドで、前述のように、GYRCTRLREG4のブロックデータ待機関数を使用する必要があることを確認しましたが、変更はありませんでした。私は、MSBがゼロ以上、つまり正の数である場合に問題を絞り込んだ後、MSBとLSBを組み合わせると、これらの大きな数が得られます。たとえば、X平面に必要な2バイトを取得します。LSBで-6を取得し、MSBで0を取得します。これらを組み合わせると250になり、変換すると(250 * 70)/ 1000 = 17.5 dps(つまり、静止/不正確には大きすぎます)。同じサンプルで、Yプレーンの2バイトは-3 LSBと-1 MSNで、これらを組み合わせると-3になり、変換すると-0.21になります(つまり、期待値/正しい)。 私はこの問題に何日も取り組んでいますが、磁力計でこれらのランダムなスパイクが少し表示されているので、(i2cを介して)デバイスを誤って読み取っているのだと思いますか? 提案や試してみたいことは本当に大歓迎です!

3
PIC18のI2C以降
プロジェクトでは、3つのPIC(2つのスレーブPIC18F4620、1つのマスターPIC18F46K22)でI2Cバスを介して通信したいと考えています。後で、さらに多くのスレーブが追加される可能性があります(EEPROM、SRAMなど)。C18コンパイラを使用して、これらのPICのコードをCで記述しています。私はインターネットをよく見て回りましたが、(M)SSP周辺機器を処理するためのライブラリーが見つかりませんでした。I2Cモードの(M)SSPペリフェラルの両方のPICのデータシートを読みましたが、バスのインターフェース方法を見つけることができませんでした。 だから私はマスターとスレーブのライブラリが必要です。 何がお勧めですか?どこかにそのような図書館はありますか?コンパイラーに組み込まれていますか?はい、組み込まれていますか?ネット上のどこかに良いチュートリアルがありますか?

5
AVRのCコードでのこのキャストの何が問題になっていますか?
2つの変数を定義しました。 uint8_t a[2]; uint16_t b; 次にa、型の変数として使用しますuint16_t。例: b = (uint16_t)a; しかし、これは間違っています!私のプログラムはそのようなコードでは正しく動作しません。要素ごとの操作に置き換えbてuint8_t b[2]使用すると、すべて問題ありません。 どうして?
8 avr  c 

5
PICマイクロコントローラーの配線方法は?
私はPICマイクロコントローラーと電気工学の世界にまったく新しいので、気楽に行ってください:) とにかく、私はPIC 16f627をプログラムして、プッシュボタン(トリガーボタン)が押されたときに3つのLEDをオンにし、別のプッシュボタンが押されたときにシャットダウンシーケンスを開始しました(基本的に、各LEDは5秒の遅延で次々にオフになります)。押された(リセットボタン)。私はこれをVellemanのK8048 PICプログラマ/実験ボードでテストしています。ピンRA0およびRA2はそれぞれトリガーおよびリセットプッシュボタンの入力であり、ピンRB0、RB1、およびRB2はLEDの出力ピンです。 実験ボードでの作業は素晴らしいですが、これを実際の回路に移動したいと思います。問題は、どこから始めればよいかわからないことです。3つのLED(それぞれ3.3ボルト)、いくつかの押しボタン、およびワイヤを購入し、次の回路を構築しました。 (恐ろしい回路図のため申し訳ありません) 私が作成した回路では、最初にテストして、LEDが3個の1.5ボルトAAバッテリーで動作するかどうかを確認しました。 しかし、これは機能せず、私は完全に迷っています。参考までに、PICのコードを示します。そのMikroCを使用してCで書かれました。実験ボード上で動作するので問題ないと思います void main() { TRISB.RB0 = 0; TRISB.RB1 = 0; TRISB.RB2 = 0; PORTB.RB0 = 0; PORTB.RB1 = 0; PORTB.RB2 = 0; CMCON = 0x07; TRISA = 255; for(;;){ if(PORTA.RA0 == 1 && PORTB.RB0 == 1 && PORTB.RB1 == 1 && PORTB.RB2 == …

3
#if 0の機能
今日、私はPICのプログラミングにMPLAB Xを使用し始め、コードを入力するための複数のファイルとスポットを含むコードテンプレートを見つけました。私のコードが含まれている単一のファイルがある前に。このテンプレートでは、構成ビットを配置することになっていますが、次のテキストがあります。 /* TODO Fill in your config bits here. Remove #if 0 to embed config words. */ #if 0 /* General syntax for configuration word 1 - Check your device .h file for an up to date listing of available macros.*/ __CONFIG(FOSC_INTOSC & WDTE_OFF & PWRTE_OFF & MCLRE_OFF & …

1
AVR Atmega328pの静的ライブラリを作成するにはどうすればよいですか?
CのArduinoによく似たライブラリを作成しようとしています。 私は過去に試しましたが、コードを失いましたが、すべてのオブジェクトファイルを含む(avr-objdumpによってチェックされた)ヘッダーファイルとライブラリで指定された関数への未定義の参照を大量に取得したことを覚えています。 ライブラリ(サンプルmakefile)をコンパイルする方法と、プログラムをライブラリにコンパイルする方法を知りたい。また、すべてのAVRおよびクロック速度用にライブラリを再コンパイルする必要がありますか、それとも回避策がありますか? さらに情報が必要な場合は、質問してください。 ありがとう 編集:例(機能しない) program.c #include "test.h" int main(void) { test_function(); } test.c #include "test.h" void test_function() { int i; i++; } test.h #ifndef __TEST_H_ #define __TEST_H_ void test_function(void); #endif
8 avr  c  library  avr-gcc 

1
74HC154で8x32 LEDマトリックスに描画
8x32 LEDマトリックスにパターンを送信するにはどうすればよいですか?AT89S52マイクロコントローラーと74HC154 4-16ラインデコーダーを使用しており、Keil IDEを使用してCでプログラミングしています。垂直スキャンを実行しましたが、次のステップで困惑しています。必要に応じて回路図を含めます。回路は以下に示すものと同じですが、74HC138を使用せず、コモンアノードマトリックスを使用し、ドライバーとしてUN2803を使用しています。メモリは使用していません。 ポート1は列、ポート2は行です...コード: row = 0xFF; //for (j=0x01; j< 0x08; j<<=1) { /* scan left to right */ for (j=0x00; j<=0x0F; j++) { E1=0; E2=0; P1 = j; P2 = row; /* Output to LED Port */ for (i = 0; i < 100; i++) { /* Delay …

1
Arduinoのライブラリを作成するときに知っておくべきことは何ですか?
現在の問題を超えて、「Arduinoのライブラリを作成するときに何を知っておくべきですか?」 まず、私がしていること: 私はEclipseをエディターとして使用し、C ++でコードを作成しています。ヘッダーファイルを含む簡単なArduinoアプリケーションを作成し、エラーに対処しています。 最初の問題:「ビルドクリーン」を実行するにはどうすればよいですか?ヘッダーファイルがキャッシュされたかのように、修正したと思われるエラーが表示されます。(はい、私は愚かなことをしている可能性が非常に高いです(編集:私はそうでした)が、ライブラリをクリーンアップする方法を知りたいのですが、オブジェクトファイルの場所がわかりません)。 第二に、どのような規則に注意する必要がありますか?私はArduinoを好きなだけ使用していません。C++でプログラミングするのはとても気持ちがいいですが、ライブラリの目的は、ユーザーにとって物事をシンプルに保つことです。関数名の規則はありますか?定数を作成していますか(グローバル名前空間が#definesで汚染されているようです)?等々。 最後に、他に知っておくべきことはありますか? 私はArduinoライブラリチュートリアルを見てきましたが、これは良いですが、それほど遠くはありません。また、システムにインストールされているライブラリのいくつかをのぞいてみました。
8 arduino  library  c++  c 

2
AVRコードがビットシフトを使用する理由[終了]
休業。この質問は意見に基づいています。現在、回答を受け付けていません。 この質問を改善してみませんか?この投稿を編集して、事実と引用で回答できるように質問を更新してください。 2年前休業。 AVRプログラミングでは、レジスタビットは、a 1を適切なビット位置に左シフトすることによって常に設定され、それらの1の補数によってクリアされます。 例: ATtiny85の場合、PORTB、b 4を次のように設定します。 PORTB |= (1<<PB4); または、次のようにクリアします。 PORTB &= ~(1<<PB4); 私の質問は次のとおりです。なぜそれがこのように行われるのですか?最も単純なコードは、ビットシフトの混乱になります。なぜビットがマスクの代わりにビット位置として定義されるのですか? たとえば、ATtiny85のIOヘッダーにはこれが含まれています: #define PORTB _SFR_IO8(0x18) #define PB5 5 #define PB4 4 #define PB3 3 #define PB2 2 #define PB1 1 #define PB0 0 私にとっては、代わりにビットをマスクとして定義する方がはるかに論理的です(このように): #define PORTB _SFR_IO8(0x18) #define PB5 0x20 #define PB4 0x10 #define PB3 …
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.