Question
J'ai besoin de votre aide qualifié! Je suis en C ++ programmation, en utilisant un PIC 18F87J50 et d'essayer de se connecter à mon DS18B20 H0 Port!
Je pense que ma programmation sous-jacente est correcte si le problème .... je (crois que je l'ai), est lors de l'exécution d'une commande de ROM, je recherche du code ROM 64 bits.
Le premier octet doit me dire quelle famille appartient à la composante (28h). Les 48 bits suivants devraient me donner une série uniq pour tout ce composant. Le dernier est utilisé pour un CRC.
Suis-je penser à droite quand faire comme ceci:
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);
}
Si je demande le code ROM_CODE [1-6] Je devrais obtenir le numéro de uniq ?? should'nt I ??
Cordialement!
La solution
Eh bien, la meilleure façon d'accéder au numéro de série est probablement de le copier dans un tampon séparé en utilisant 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];
...
Le &ROM_CODE[1]
est là pour chercher l'adresse du 2ème élément ROM_CODE
. ROM_CODE+1
peut également fonctionner, mais mon C est une touche rouillée.
Le nul ( '\ 0') est ajoutée à la fin comme utilise C chaînes à zéro terminal . Cela fera en sorte qu'il est compatible avec les routines de la bibliothèque C et couramment utilisés idiomes C.
Vous pouvez également y accéder directement à partir du tableau. Mais ce sera plus difficile de travailler avec et peu susceptibles d'être la peine à moins que vous vraiment ont besoin que 6 octets de mémoire.
Selon le degré de sophistication de votre application est, vous pouvez envelopper cela dans une classe. Passez le tampon de 8 caractères au constructeur et ensuite utiliser des méthodes telles que getFamily()
/ getSerial()
pour récupérer les informations que vous souhaitez.
Pour une application très simple si, c'est beaucoup de code supplémentaire pour simplifier quelque chose qui est déjà très facile à gérer.
Autres conseils
Voici le code qui devrait vous permettre de lire l'ID du périphérique. Je pense que votre code est en cours d'exécution à jeûner est un code ici que je l'habitude d'interface avec le 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;
}