残念ながら、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 つの同一のデバイスと通信しようとしている場合は、実行時にピンを切り替えるために上記のトリックを使用する必要があります。