質問
私はあなたの資格のある助けが必要です!私はC ++でプログラムしており、PIC 18F87J50を使用して、H0ポートでDS18B20を接続しようとしています。
私の基礎となるプログラミングは正しいと思うので、....私が持っている問題(私が持っていると思う)は、ROMコマンドを実行するとき、64ビットROMコードを探しています。
最初のバイトは、コンポーネントがどのファミリーに属しているかを教えてください(28H)。次の48ビットは、そのコンポーネントのためにUNIQシリアルを提供するはずです。最後のものはCRCに使用されます。
このようにするとき、私は正しく考えていますか:
void Device_ID( uint8_t command ){
uint8_t ROM_CODE[8]; // 1 byte CRC, 6 bytes SERIAL, 1 byte Family code
uint8_t loop;
static char container[8];
OW_reset_pulse();
OW_write_byte( command );
for(loop = 0; loop < 8; loop++) // 1 byte in per time = 64-bits
{
ROM_CODE[loop] = OW_read_byte();
}
HexToStrWithZeros(ROM_CODE[0], container);
Display_Cls();
Display_StringAt ("Family Code: ",5,6);
Display_Buffer (container);
}
rom_code [1-6]でコードを要求した場合、uniq番号を取得する必要がありますか?私はすべきですか?
敬具!
解決
さて、シリアル番号にアクセスする最良の方法は、おそらくそれを使用して別のバッファにコピーすることです strncpy.
#include <string.h>
...
char family;
char serial[7]; // Extra byte for null terminator
char checksum;
...
family = ROM_CODE[0];
strncpy(serial, &ROM_CODE[1], 6);
serial[6] = '\0';
checksum = ROM_CODE[7];
...
&ROM_CODE[1]
2番目の要素のアドレスを取得するためにありますか ROM_CODE
. ROM_CODE+1
動作するかもしれませんが、私のCはタッチさびです。
Cが使用すると、null( ' 0')が最後に追加されます ヌル終端文字列. 。これにより、Cライブラリルーチンと一般的に使用されるCイディオムと互換性があることを確認します。
アレイから直接アクセスすることもできます。しかし、それはあなたと仕事をするのが難しく、あなたがいない限り価値がありそうにないでしょう 本当 その6バイトのメモリが必要です。
アプリがどれだけ洗練されているかに応じて、クラスでこれをラップすることをお勧めします。 8文字バッファをコンストラクターに渡し、次に次のような方法を使用します getFamily()
/ getSerial()
必要な情報を取得します。
しかし、非常にシンプルなアプリの場合、それはすでに非常に管理しやすいものを簡素化するための多くの追加のコードです。
他のヒント
デバイスIDを読み取ることができるコードを次に示します。ここであなたのコードが断食するように実行されていたと思います。これは、DS18B20とのインターフェースに使用したコードです。
/****************************************************************************
* temperature.h
****************************************************************************/
#ifndef TEMP_H
#define TEMP_H
extern double read_temp ( void );
extern void start_temp( void );
extern void Device_ID ( void );
#endif
/****************************************************************************
* temperature.c
****************************************************************************/
void reset_ow(void);
void write_ow(uint8_t b);
uint8_t read_ow (void);
#define OW_TEMP_SIG LATHbits.LATH0
#define OW_TEMP_TRIS TRISHbits.TRISH0
#define OW_TEMP_SIG_IN PORTHbits.RH0
#define DIR_OUT 0
#define DIR_IN 1
void Device_ID( void )
{
uint8_t loop;
uint8_t family;
uint8_t checksum;
uint8_t ROM_CODE[8]; // 1 byte CRC, 6 bytes SERIAL, 1 byte Family code
reset_ow();
write_ow(0x33); // READ ROM COMMAND DS18B20
for(loop = 0; loop < 8; loop++) // 1 byte in per time = 64-bits
{
ROM_CODE[loop] = read_ow();
}
family = ROM_CODE[0];
checksum = ROM_CODE[7];
// add extra code to handle code
}
void start_temp(void)
{
uint8_t i;
OW_TEMP_SIG=1;
OW_TEMP_TRIS=DIR_OUT;
for ( i=0;i<100;i++)
{
Delay_us(100);
}
reset_ow();
write_ow(0xcc); // skip rom
write_ow(0x44); // start t conv
}
double read_temp(void)
{
double temp=0;
S16 itemp;
reset_ow();
write_ow(0xcc); // skip rom
write_ow(0xbe); // read scratch pad
itemp=read_ow();
itemp|=(S16)read_ow()<<8;
temp = itemp*(0.0625);
OW_TEMP_TRIS=DIR_IN;
OW_TEMP_SIG=1;
return temp;
}
void reset_ow(void)
{
OW_TEMP_TRIS=DIR_OUT;
OW_TEMP_SIG=0;
Delay_us(250);
Delay_us(250);
OW_TEMP_TRIS=DIR_IN;
OW_TEMP_SIG=1;
Delay_us(250);
Delay_us(250);
}
void write_ow(uint8_t b)
{
uint8_t i;
OW_TEMP_SIG=1;
OW_TEMP_TRIS=DIR_OUT;
for ( i=0;i<8;i++)
{
OW_TEMP_SIG=0;
if ( b & 0x01 )
{
Delay_us(10);
OW_TEMP_SIG=1;
}
Delay_us(70);
OW_TEMP_SIG=1;
Delay_us(10);
b >>= 1;
}
OW_TEMP_TRIS=DIR_IN;
OW_TEMP_SIG=1;
}
uint8_t read_ow(void)
{
uint8_t b=0;
uint8_t m;
uint8_t i;
m=1;
for ( i=0;i<8;i++)
{
OW_TEMP_SIG=1;
OW_TEMP_TRIS=DIR_OUT;
OW_TEMP_SIG=0;
Delay_us(8);
OW_TEMP_TRIS=DIR_IN;
OW_TEMP_SIG=1;
Delay_us(15);
if ( 1 == OW_TEMP_SIG_IN )
{
b |= m;
}
m <<=1;
Delay_us(60);
}
OW_TEMP_TRIS=DIR_IN;
OW_TEMP_SIG=1;
return b;
}