質問
私は以下のこれらの関数を定義している、と私は例のためにDEVICE_ID機能を要求したとき ファミリコードは、私は、acctually私は両方のファミリコード、48ビットのシリアル、およびCRC 8ビットはすべて「1」であることを取得する(28である必要があります)FFを取得します。それは私がスレーブを接続した場合、彼は私がここにいるのを言う、と....それが必要として動作し、スレーブデバイスを検出する機能のように思える私はそれを離れて取る場合...デバイスが存在しなかっ。私はまたの1-Wireで5kohmプルアップを持っています。
そして、私はそう私の質問はそれを動作doesntの理由で、私のDEVICE_IDはいけない仕事なぜ手掛かりを持っていけません! uが(PIC 18F87J50と1 DS18B20を使用してIM)を、このコード内で何かを見ることができます:
メインの私の文ます:
OSCTUNEbits.PLLEN = 1;
Init_Registers();
Init_Settings();
Init_Ports();
Init_Glcd();
Detect_Slave_Device();
Device_ID( 0x33 );
中古の機能ます:
void Detect_Slave_Device(void){
uint8_t value;
OW_reset_pulse();
if (OW_reset_pulse())
{
Display_Cls();
Display_StringAt("No Device Present!",5,6);
Delay_1sec();
Delay_1sec();
} else {
Display_Cls();
Display_StringAt("Device Present!",5,6);
Delay_1sec();
Delay_1sec(); }}
<時間>
uint8_t OW_reset_pulse(void){
uint8_t presence_detect;
drive_OW_low(); // Drive the bus low
Delay_us(200); // Delay at least 480 microsecond (us)
Delay_us(200);
Delay_us(85);
drive_OW_high (); // Release the bus
// Here should the client drive low
Delay_us(50); // Delay 50 microsecond (us)
presence_detect = read_OW(); // Sample for presence pulse from slave
Delay_us(200); // Delay 435 microsecond (us)
Delay_us(200);
Delay_us(35);
drive_OW_high (); // Release the bus
return presence_detect;}
<時間>
void drive_OW_low (void){
LATHbits.LATH0 = 0;
TRISHbits.TRISH0 = 0; }// Output
<時間>
void drive_OW_high (void){
LATHbits.LATH0 = 0;
TRISHbits.TRISH0 = 1;} // Input
<時間>
uint8_t read_OW (void){
unsigned char read_data=0;
TRISHbits.TRISH0 = 1;
if (1 == PORTHbits.RH0)
read_data = 1;
else
read_data = 0;
return read_data;}
そして今、いくつかの重要なDEVICE_ID oftheます:
void Device_ID( uint8_t command ){
uint8_t loop, family, checksum, ROM_CODE[8]; // 1 byte CRC, 6 bytes SERIAL, 1 byte Family code
static char container[1];
OW_reset_pulse();
OW_write_byte( 0x33 ); // READ ROM COMMAND DS18B20
for(loop = 0; loop < 9; loop++) // 1 byte in per time = 64-bits
{
ROM_CODE[loop] = OW_read_byte();
}
family = ROM_CODE[1];
checksum = ROM_CODE[8];
And so on = Print MY VALUES ->
<時間>
void OW_write_byte (uint8_t write_data){
uint8_t loop;
for (loop = 0; loop < 8; loop++)
{
OW_write_bit(write_data & 0x01); //Sending LS-bit first
write_data >>= 1; // shift the data byte for the next bit to send
} }
<時間>
void OW_write_bit (uint8_t write_bit){
if (write_bit) // Write 1 time slot
{
Brakepoint(); // 1 us
//writing a bit '1'
drive_OW_low(); // Drive the bus low
Delay_us(6); // Delay 6 microsecond (us)
drive_OW_high (); // Release the bus
Delay_us(64);; // Delay 64 microsecond (us)
}
else // Write 0 time slot
{
Brakepoint(); // 1 us
//writing a bit '0'
drive_OW_low(); // Drive the bus low
Delay_us(65); // Delay 65 microsecond (us)
drive_OW_high (); // Release the bus
Delay_us(10); // Delay 10 microsecond for recovery (us)
}}
<時間>
uint8_t OW_read_byte (void)
uint8_t loop, result=0;
for (loop = 0; loop < 8; loop++)
{
result >>= 1; // shift the result to get it ready for the next bit to receive
if (OW_read_bit())
result |= 0x80; // if result is one, then set MS-bit
}
return result; }
<時間>
uint8_t OW_read_bit (void){
uint8_t read_data; // Reading a bit
Brakepoint(); // 1 us
drive_OW_low(); // Drive the bus low
Delay_us(6); // delay 6 microsecond (us)
drive_OW_high (); // Release the bus
Delay_us(9); // delay 9 microsecond (us)
read_data = read_OW(); //Read the status of OW_PIN
Delay_us(55); // delay 55 microsecond (us)
return read_data;}
解決 2
障害がコードそれ自身ではなかった、私は、RCフィルタ、10nFの小さな導体と1Kオームの抵抗を有するデジタルポートに接続しようとした。
私は後になるまでこのことを知りませんでした。レスポンスのおかげで、それは参考になりました。
他のヒント
ここで私はDS18B20を読むためのPIC18のために書いたいくつかのコードです。
/****************************************************************************
* temperature.h
****************************************************************************/
#ifndef TEMP_H
#define TEMP_H
extern double read_temp(void) ;
extern void start_temp(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 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;
}
所属していません StackOverflow