0

写真のさまざまなピンにあるさまざまなデバイスから読み取るには、同じコードを使用する必要があります。関数呼び出しは、デバイス、つまりデバイス 1 - ポート A0 デバイス 2 - ポート A1 などを決定します。

私のコードでは、ポートを入力/出力、データの送信、データの受信に変更する必要があります。したがって、疑似コードで行う必要があるのは次のとおりです。

関数 readDevice(デバイス番号)

variableType myPortControlVariable;

variableType myPortVariable;

// 使用するデバイス ポートとコントロールを選択します

if(デバイス番号==1)

myPortControlVariable = TRISA0;

myPortVariable = RA0;

if(デバイス番号==2)

myPortControlVariable = TRISA1;

myPortVariable = RA1;

等...

...関数コード内

myPortControlVariable = 0; // 出力に設定

myPortVariable = 1; //1を書く

myPortVariable = 0 を一時停止します。// 0 を書き込む

等....

これを達成する方法を知っている人はいますか?ありがとう

4

5 に答える 5

0
  1. ほとんどの場合、プログラムの途中で PIC ピンの入出力機能を変更することはありません。通常、それらはプログラムの最初に一度設定され、二度と触れられません。さらに、PIC と外部デバイスの両方が同時にラインを駆動して何かを焼損させないようにするにはどうすればよいでしょうか?

  2. 擬似コードでは、入出力レジスタの状態を読み取っています。これを行う理由は想像できません。この状態を設定するのはあなたです。そして、この状態は変わらないはずです。したがって、各ピンの入出力値は既にわかっています。

疑似コードで何をしたいのかわかりませんので、それが私ができるすべてのアドバイスです。代わりに、実際のコードを使用してこれを記述してみてください。

于 2013-10-29T05:15:38.327 に答える
0

周辺機器が I2C インターフェイスを使用しているようです。

Microchip.com が提供するものを見てみましょう。ここに行くと: http://www.microchip.com/CodeExamplesByFunc.aspx

I2C コードの例をいくつか検索できます。最も近いアプリケーション ノートを見つけるには、使用している PIC を正確に知る必要があります。完全に一致するもの (PIC、コンパイラ、ライブラリ、および物理設計) が見つからない限り、調整を行う必要があります。

このアプリケーション ノートを選びました: http://ww1.microchip.com/downloads/en/DeviceDoc/CE337%20I2C_MASTER.zip

このパッケージをダウンロードして解凍し、i2c_master.c ファイルを開くと、PIC 24Fxxxx ファミリのプロセッサと C30 コンパイラ ファイルにある i2c ライブラリを使用してマイクロチップがどのように通信しているかを確認できます。最近 PIC SDK をまとめた場合は、代わりに新しい XC18 コンパイラを使用している可能性があります。これは、使用している PIC にも依存します (したがって、知っておくことが重要です。それ以外の場合は、これらの提案について心を開いておく必要があります)。C30 から新しい XC18 コンパイラへの切り替えに関しては、コードは引き続き機能すると思います。ただし、前述のとおり、調整が必要になる場合があります。

よく見ると、PIC の I2C データ ラインの方向を変更するコードがプログラムのどこにもないことがわかります。これは、xc18 コンパイラ ファイルの i2c.h ライブラリによって抽象化されているためです。さらに、ほとんどの PIC 24Fxxxx クラスのチップには複数の I2C モジュールがあります。I2C インターフェイスを処理し、割り込みを生成するように PIC に設計されたハードウェア。組み込みのハードウェアを使用すると、遅い I2C トランザクション中にコードで他のことを行うことができます。

要約すると、はい、これはすべて手動で行うことができます (それが目的だったと思います)。ただし、使用している PIC によっては、ほとんどの PIC プロセッサに組み込まれているハードウェアではるかに高速に実行できます。

注: この例 (私が話している microchip.com から) では、PIC と I2C ペリフェラルの間を走る I2C クロックと I2C データ ラインを 4.7K 抵抗器を使用して引き上げる必要があります。このリマインダーは、コード例のコメントに書き込まれています - 忘れないように! これは、I2C ドライバー (ソフトウェアではなく、プロセッサ ピンの背後にある電子機器) が「オープン コレクター」設計であるためだと思います。

リンゴとオレンジ: あなたが Arduino Uno のファンで、これがあまりにも複雑だと思うなら、Arduino Uno の単純さの暗い面を考えてみてください:

于 2013-10-30T14:50:18.077 に答える
0

残念ながら、C ではビットを渡すことができません。詳細については、この FAQ を参照してください: http://www.xargs.com/pic/c-faq.html#pinarray

したがって、回避策は、最下位レベルで switch または if-else をトリガーするフラグを I/O 関数に渡すことです。

void send_bit (char device,char value) {
    switch (device) {
        case DEVICE_1:
            // output bit value to correct port
            break;
        case DEVICE_2:
            // output bit value to correct port
            break;
    }
}

その醜さが邪魔にならないので、その上にもっときれいなコードを構築できます。

// The following is just a generic example, change bit order etc
// to fit the protocol you're using.

void send_byte (char device, char value) {
    char i;
    for (i=0;i<8;i++) {
        send_bit(device,(value >> i)&0x01);
    }
}

void send_message (char device, char address, char *buffer, char length) {
    char i;
    send_byte(device,address);
    for (i=0;i<length;i++) {
        send_byte(device,buffer[i]);
    }
}

重要なのは、最低レベルの I/O 関数という 1 つの場所だけに醜さを含めることです。次に、その上に、よりクリーンな抽象化を構築します。


その他の考慮事項:

双方向シグナリングを使用している場合は、出力ビットを 1 に設定しないでください。これを行うと、高い値が衝突した場合に、PIC の出力バッファーまたは他のデバイスの出力バッファーのいずれかが損傷する可能性があります。

代わりに、双方向信号は通常、プルアップ抵抗が接続されたオープン コレクタ回路として実装されます。このようにして、デバイスは電圧を下げることで 0 を送信し、出力をハイインピーダンスに設定することで 1 を送信します。したがって、1-Wire デバイスと通信する正しい方法は、出力ピンを 0 にハード コードし、TRIS ビットを出力モード (0 を送信) と入力モード (1 を送信) の間で切り替えることです。

一部のデバイスでは、少数の I/O ピンに弱いプルアップが組み込まれている場合があります。外部プルアップ抵抗を使用したくない場合は有効にすることができますが、私の経験では、特に 2 つのチップ間の距離が長い場合 (4.7k よりも長い場合)、小さな (4.7k?) 外部プルアップを使用することをお勧めします。 0.5センチ?)

考慮すべきもう1つのことは、正しいアドレスを持つデバイスのみがPICに応答するため、両方のデバイスと通信するために1つのピンのみを使用することでうまくいく可能性があることです. 唯一の問題は、ほとんどの 1-Wire デバイスがハード コードされたアドレスを持っていることです。そのため、2 つの同一のデバイスと通信しようとしている場合は、実行時にピンを切り替えるために上記のトリックを使用する必要があります。

于 2013-10-30T15:57:48.610 に答える
0

クロックとデータを 1 つの双方向ラインに統合するペリフェラルを使用している場合、このページに microchip.com の例はありません: http://www.microchip.com/CodeExamplesByFunc.aspx

しかし、Web を検索すると、おそらく多くの例を見つけることができます。

I/O コードを一度だけ書きたい場合は、ハードウェアから抽象化する必要があります。ピンを変更、設定、またはクリアするあらゆる場所で、話しているデバイスを説明する正式な引数を使用してメソッドを呼び出すことができます。次に、その方法で、操作する PIN をハードコーディングします。select/caseステートメントのようなもので多くのピンをハードコーディングしたいようです。

擬似コードに具体的に対処するには... TRISA0 がどのように定義されているかを調べる必要があると思います (この特定のコード セグメントは p24HJ128GP204.h ファイルからのものです - 使用している PIC に応じて、これが由来する可能性のある他の多くのファイルがあります) ):

extern volatile unsigned int  TRISA __attribute__((__sfr__));
typedef struct tagTRISABITS {
  unsigned TRISA0:1;
  unsigned TRISA1:1;
  unsigned TRISA2:1;
  unsigned TRISA3:1;
  unsigned TRISA4:1;
  unsigned :2;
  unsigned TRISA7:1;
  unsigned TRISA8:1;
  unsigned TRISA9:1;
  unsigned TRISA10:1;
} TRISABITS;

TRISA0 が構造の一部であるように見えます。変数に割り当てることができる値だけではありません。そして、同じファイルの次の行から表示されます。

#define _TRISA0 TRISAbits.TRISA0

ピンを「TRISA0」ではなく「_TRISA0」と呼ぶ必要があります。

于 2013-10-30T15:36:05.933 に答える
0

LAT レジスタへの揮発性ポインターの配列をセットアップし、設定するビットの情報を含む配列を維持できます。私はこれを 16 ビット PIC コントローラで書き上げました。

http://www.microchip.com/forums/m794597.aspxを参照してください。

これは TRIS レジスタにも適用できます。

于 2014-04-30T18:52:37.793 に答える