Sign in

username:

password:



Not a member?

Search piclist



Search tips

Subscribe to piclist



piclist by Keywords

12F675 | 16F628 | 16F84 | 16f877 | 16F877A | 16F88 | 18F458 | ADC | AVR | Bootloader | CAN | CCS | CRC | EAGLE | EEPROM | ICD | ICSP | IDE | JDM | LED | Macros | Microchip | MPLAB | PCB-CAD | PIC10F | Pic12f675 | PIC16F84 | PIC16F84A | PIC16F877 | PIC18 | PIC18F452 | PicBasic | PICC | PICSTART | PWM | RS-485 | RS232 | SMT | SPI | UART | USART | USB | Wireless | Wisp628 | Xilinx

Discussion Groups

Discussion Groups | Piclist | RE: I-button Dallas

A discussion group for the PICMicro microcontroller. Also called the Microchip PIC, this list is dedicated to the use and abuse of this fine, simple, microcontroller. Close to topic posts are welcome, ie. general electronics.

I-button Dallas - bob_lasar - Dec 22 12:44:00 2003


Hy,
anyone have C-code for read i-button?
this device have one Pin and ground.

thanks

Mario





(You need to be a member of piclist -- send a blank email to piclist-subscribe@yahoogroups.com )

RE: I-button Dallas - Mauricio Jancic - Dec 22 12:49:00 2003



Here you have....

ENJOY

void Write_Dallas(unsigned char bit_1)
{
// Pone un CERO a la salida
// (pulso de comienzo).
Dallas_Pin = 0;
DelayUs(10);

Dallas_Tris = 0; // Pone el puerto como salida.
DelayUs(17); // Espera 15us min
if(bit_1)
{
// si llega aqui debe transmitir un UNO
Dallas_Tris = 1; // Configura puerto como entrada para que
// suba en tensión automáticamente.
DelayUs(50); // Espera 50us (este tiempo debe completar
// los 60us como mínimo).
}
else
{
DelayUs(100); // Espera el tiempo que es como máximo 120us
Dallas_Tris = 1; // Pone el puerto como entrada.
}
DelayUs(10); // Espera 1us (tREC) en el return
}

//Transmite un Byte al dispositivo
void WriteByte_Dallas(unsigned char Data)
{
unsigned char n;

for(n=0; n<8; n++)
{
if (Data & 0x01)
{
// Pone un CERO a la salida
// (pulso de comienzo).
Dallas_Pin = 0;

DelayUs(10);
Dallas_Tris = 0; // Pone un cero a la salida
DelayUs(10);
Dallas_Tris = 1; // Pone un cero a la salida

DelayUs(103); // Espera 103us (este tiempo debe completar
// los 120us como mínimo).
}
else
{
Dallas_Pin = 0; // Pone un CERO a la salida
DelayUs(10);
Dallas_Tris = 0; // Pone el puerto como salida.

DelayUs(100); // Espera 100us
Dallas_Tris = 1; // Configura puerto como entrada para que
DelayUs(10);
// suba en tensión automáticamente.
}
Data >>= 1;
}
}

// Lee un bit de la memoria Dallas.
unsigned char ReadBit_Dallas(void)
{
unsigned char Lectura;

// Pone un CERO a la salida
// (pulso de comienzo).
Dallas_Pin = 0;

DelayUs(2);
Dallas_Tris = 0;
DelayUs(2);
Dallas_Tris = 1;

DelayUs(5); // Espera para leer
Lectura = 0;
DelayUs(2);
if(Dallas_Pin)
Lectura = 1;
DelayUs(42); // Espera para completar los 120us max
return Lectura; // Lee el pin
}

// Envia el pulso de Reset al bus 1-Wire, y devuelve
// true si recibe el pulso de presencia
unsigned char Reset_Dallas(void)
{
// Pone un CERO a la salida
// (pulso de RESET).
Dallas_Pin = 0;
DelayUs(10);

Dallas_Tris = 0; // Pone el puerto en salida.
DelayUs(255); // Espero 480us mínimo.
DelayUs(225);
Dallas_Tris = 1; // Pone el puerto como entrada y
// espera a que la DS1990A ponga un cero.
DelayUs(75); // Espera un mínimo de 15us+60us.

if ( Dallas_Pin ) // Si lee un UNO es que no hay memoria colgada del
return 0; // bus.

DelayUs(165); // Espera para completar los 480us (peor caso)
DelayUs(240);

return 1;
}

// Calcula el CRC8 acumulado
unsigned char CRC8_Dallas(unsigned char Data)
{
unsigned char i, f;

for (i = 0; i < 8; i++)
{
f = 1 & (Data ^ CRC_Dallas);
CRC_Dallas >>= 1;
Data >>= 1;
if (f) CRC_Dallas ^= 0x8c; // b10001100 es la palabra del CRC (x8 +
x5 + x4 + 1)
// 7..43..0 junto con el 1 aplicado a f.
}
return CRC_Dallas;
}

//Chequea el CRC de los datos recibidos
unsigned char CheckCRC(void)
{
unsigned char k;

CRC_Dallas = 0;
for (k = 0; k < 8; k++)
CRC8_Dallas(SN_Dallas[k]);
return !CRC_Dallas;
}

// Lee un byte desde el dispositivo
unsigned char ReadByte_Dallas(void)
{
unsigned char n, Byte_Dallas;

for (n=0; n<8; n++)
{
Byte_Dallas >>= 1;
DelayUs(2);
if ( ReadBit_Dallas() )
Byte_Dallas |= 0x80; // LSB first!
}
return Byte_Dallas;

}
//Lee el código de la memoria y lo guarda en la variable
//global SN_Dallas
unsigned char ReadSN_Dallas(void)
{
//Escribe el comando de lectura de ROM (Read ROM = 0x33)
WriteByte_Dallas(0x33); // 0x33 - Read ROM
DelayUs(2);

for(CRC_Dallas = 0; CRC_Dallas < 8; CRC_Dallas++)
SN_Dallas[CRC_Dallas] = ReadByte_Dallas();
return CheckCRC();
}

// Inicializa todo lo necesario
// para manejar las llaves Dallas
// (pines, interrupciones)
void Init_Dallas( void )
{
//Inicializacion del HW del uC.
Dallas_Tris = 1;

}

Mauricio D. Jancic
Janso Desarrollos - Microchip Consultant
www.janso.com.ar

(54) - 11 - 4542 - 3519
Lugones 3238 "B" - C1430ECN
Capital Federal
Republica Argentina
(54) - 11 - 4542 - 3519
MSN:

>>-----Original Message-----
>>From: bob_lasar [mailto:]
>>Sent: Lunes, 22 de Diciembre de 2003 14:45
>>To:
>>Subject: [piclist] I-button Dallas
>>
>>Hy,
>>anyone have C-code for read i-button?
>>this device have one Pin and ground.
>>
>>thanks
>>
>>Mario
>>
>>
>>to unsubscribe, go to http://www.yahoogroups.com and follow
>>the instructions
>>
>>
>>
>>
>>
>>--
>>Incoming mail is certified Virus Free.
>>Checked by AVG Anti-Virus (http://www.grisoft.com).
>>Version: 7.0.209 / Virus Database: 261.5.2 - Release Date: 20/12/2003
>>
>>

--
Outgoing mail is certified Virus Free.
Checked by AVG Anti-Virus (http://www.grisoft.com).
Version: 7.0.209 / Virus Database: 261.5.2 - Release Date: 20/12/2003




(You need to be a member of piclist -- send a blank email to piclist-subscribe@yahoogroups.com )