please dont rip this site

PIC DS1990 C code

Enzo Gomez [enzo.gomez at ieee.org] says:

I have this code to connect with DS1990A, an electronic key (its just a ROM device). It was originally written for PIC 16F84

The code is C code, compiled great with C2C compiler, from Pavel Baranov.
http//www.geocities.com/SiliconValley/Network/3656/c2c/c.html a shareware compiler.

// Interfaz con dispositivos DALLAS
#ifndef true
#define true 1
#endif
#ifndef false
#define false 0
#endif

#define Dallas_Port PORTB       // Define el puerto de datos de DS1990A
#define Dallas_Tris TRISB       // Define el puerto de configuración
#define Dallas_Pin  7           // para acceder a la memoria DS1990A.

asm {
DALLAS_PORT  EQU  PORTB
DALLAS_PIN   EQU  7
    }

char SN_Dallas[8];              // Para guardar el Serial Number de Dalas
                                // 0x01 + SN[6] + CRC[1]
char CRC_Dallas;        // Para el chequeo del CRC.

//Configura el puerto como salida
void SetOut_Dallas(void)
{
    set_bit( STATUS, RP0 );   //Selecciona el banco de registros 1
    clear_bit(Dallas_Tris, Dallas_Pin);
    clear_bit( STATUS, RP0 ); //Selecciona el banco de registros 0
}

//Configura el puerto como entrada
void SetIn_Dallas(void)
{
    set_bit( STATUS, RP0 );   //Selecciona el banco de registros 1
    set_bit(Dallas_Tris, Dallas_Pin);
    clear_bit( STATUS, RP0 ); //Selecciona el banco de registros 0
}

//Pone un cero a la salida del pin DS1990A
void Set0_Dallas(void)
{
    clear_bit( Dallas_Port, Dallas_Pin);
}

// Transmite un bit a DS1990A.
void Write_Dallas(char bit)
{
     // Pone un CERO a la salida 
     // (pulso de comienzo).
     clear_bit( Dallas_Port, Dallas_Pin);

     SetOut_Dallas();       // Pone el puerto como salida.
     delay_us(17);          // Espera 15us min
     if (bit)
     {
     // si llega aqui debe transmitir un UNO
     SetIn_Dallas();        // Configura puerto como entrada para que
                            // suba en tensión automáticamente.
     delay_us(50);          // Espera 50us (este tiempo debe completar 
                            // los 60us como mínimo).
     }                            
     else
     {
     delay_us(100);         // Espera el tiempo que es como máximo 120us
     SetIn_Dallas();        // Pone el puerto como entrada.
     }
                            // Espera 1us (tREC) en el return
}
//Transmite un Byte al dispositivo
void WriteByte_Dallas(char Data)
{
char n;
   for(n=0; n<8; n++)
   {
      if (Data & 0x01)
      {
         // Pone un CERO a la salida 
         // (pulso de comienzo).
         clear_bit( Dallas_Port, Dallas_Pin);

         set_bit( STATUS, RP0 );   //Selecciona el banco de registros 1
         clear_bit(Dallas_Tris, Dallas_Pin); // Pone un cero a la salida
         set_bit(Dallas_Tris, Dallas_Pin);   // Pone el puerto en entrada
         clear_bit( STATUS, RP0 ); //Selecciona el banco de registros 0
         delay_us(103);         // Espera 103us (este tiempo debe completar 
                                // los 120us como mínimo).
      }
      else
      {
         SetOut_Dallas();       // Pone el puerto como salida.
         clear_bit( Dallas_Port, Dallas_Pin);// Pone un CERO a la salida 

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

//Lee el puerto de Dallas.
char ReadIn_Dallas(void)
{
asm {
     clrw
     btfsc DALLAS_PORT, DALLAS_PIN
     movlw D'1'
     return
    }
}

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

     // Pone un CERO a la salida 
     // (pulso de comienzo).
     clear_bit( Dallas_Port, Dallas_Pin);

     set_bit( STATUS, RP0 );   //Selecciona el banco de registros 1

     clear_bit(Dallas_Tris, Dallas_Pin); // Configura como salida  \
     nop();                              // espera...               > Pulso de inicio
     set_bit(Dallas_Tris, Dallas_Pin);   // Configura como entrada /

     clear_bit( STATUS, RP0 ); //Selecciona el banco de registros 0

     nop();                 // Espera para leer
     nop();
     nop();
     nop();
     nop();
     Lectura = ReadIn_Dallas();
     delay_us(60-18);          // 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
char Reset_Dallas(void)
{
    // Pone un CERO a la salida 
    // (pulso de RESET).
    clear_bit( Dallas_Port, Dallas_Pin);

    SetOut_Dallas();        // Pone el puerto en salida.

    delay_us(255);          // Espero 480us mínimo.
    delay_us(225);
    SetIn_Dallas();         // Pone el puerto como entrada y 
                            // espera a que la DS1990A ponga un cero.
    delay_us(75);           // Espera un mínimo de 15us+60us.
    
    if ( ReadIn_Dallas() )  // Si lee un UNO es que no hay memoria colgada del 
         return false;      // bus.
            
    delay_us(165);          // Espera para completar los 480us (peor caso)
    delay_us(240);   

    return true;
}

// Calcula el CRC8 acumulado
char CRC8_Dallas(char Data)
{
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
char CheckCRC()
{
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
char ReadByte_Dallas()
{
char n, Byte_Dallas;

   for (n=0; n<8; n++)
   {
      Byte_Dallas >>= 1;
      if ( ReadBit_Dallas() ) Byte_Dallas |= 0x80; // LSB first!
      nop();
   }
   return Byte_Dallas;
}
//Lee el código de la memoria y lo guarda en la variable 
//global SN_Dallas
char ReadSN_Dallas(void)
{
   //Escribe el comando de lectura de ROM (Read ROM = 0x33) 
   WriteByte_Dallas(0x33);    //  0x33 - Read ROM
   
   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.
    set_bit( STATUS, RP0 ); //Seleccciona el banco de registros 1.
    set_bit( Dallas_Tris, Dallas_Pin ); // Configura el pin para entrada.
    set_bit( OPTION_REG, 7 ); //Deshabilita las pull-up del puerto B.

    clear_bit( STATUS, RP0 ); //Seleccciona el banco de registros 0.
    set_bit( INTCON, 3 );  // Habilita las interrupciones por cambios en puerto B.

}
////////////////////////////////////////////////////////////////////////
/* 
main()
{
  Init_Dallas();
  Reset_Dallas();
  ReadSN_Dallas();
}   /*  */

Questions:


file: /Techref/microchip/language/C/io/sx1990a.htm, 7KB, , updated: 2007/11/4 03:25, local time: 2024/3/28 09:15,
TOP NEW HELP FIND: 
44.197.114.92:LOG IN

 ©2024 These pages are served without commercial sponsorship. (No popup ads, etc...).Bandwidth abuse increases hosting cost forcing sponsorship or shutdown. This server aggressively defends against automated copying for any reason including offline viewing, duplication, etc... Please respect this requirement and DO NOT RIP THIS SITE. Questions?
Please DO link to this page! Digg it! / MAKE!

<A HREF="http://massmind.org/Techref/microchip/language/C/io/sx1990a.htm"> PIC DS1990 C code</A>

After you find an appropriate page, you are invited to your to this massmind site! (posts will be visible only to you before review) Just type a nice message (short messages are blocked as spam) in the box and press the Post button. (HTML welcomed, but not the <A tag: Instead, use the link box to link to another page. A tutorial is available Members can login to post directly, become page editors, and be credited for their posts.


Link? Put it here: 
if you want a response, please enter your email address: 
Attn spammers: All posts are reviewed before being made visible to anyone other than the poster.
Did you find what you needed?

 

Welcome to massmind.org!

 

Welcome to massmind.org!

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  .