Autor Tema: Recibir datos por USART con pic12f675  (Leído 3029 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado esperanzachat

  • PIC10
  • *
  • Mensajes: 39
Recibir datos por USART con pic12f675
« en: 28 de Febrero de 2019, 14:34:23 »
Hola a todos, gracias por su atencion. Estoy queriendo hacer un dataloger de temperatura con un PIC12F675, para ello conecto el pic por el puerto usb usando un adaptador, el pic me manda la temperatura, pero quisiera poder mandarle al pic caracteres o palabras por el puerto y que el pic efectue operaciones. Estoy usando la usart por software, hay alguna froma de que el pic reciba datos por el puerto usando solo software?.Gracias por sus respuestas

Desconectado elreypic2

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1297
Re:Recibir datos por USART con pic12f675
« Respuesta #1 en: 28 de Febrero de 2019, 23:05:55 »
que tal esperanzachat,

Definitivamente si hay muchas formas. Pero más que formas, más bien depende del lenguaje de programamción que estés usando: ASM, C (CCS, XC8, CC5x, mikroC, SDCC, etc), BASIC (PICBasic Pro, PROTON, Great Cow Basic, MikroBasic, etc) e inclusive pascal (MikroPascal). En fin depende del lenguaje de progamación que uses.
Sería de ayuda que colocaras lo que estas haciendo (incluyendo el código por supuesto) para poderte ayudar mejor.

elreypic.

Desconectado esperanzachat

  • PIC10
  • *
  • Mensajes: 39
Re:Recibir datos por USART con pic12f675
« Respuesta #2 en: 01 de Marzo de 2019, 17:52:32 »
Estoy programando en ccs
este es el codigo del programa
Código: [Seleccionar]
#include <12F675.h>

#FUSES NOWDT                    // No Watch Dog Timer
#FUSES INTRC_IO                 // >>> Oscilador interno, no CLKOUT
#FUSES PUT                      // Power Up Timer
#FUSES NOMCLR                   // Master Clear pin used for I/O
#FUSES BROWNOUT                 // Reset when brownout detected
#FUSES PROTECT                // Code not protected from reading
#FUSES NOCPD                    // No EE protection
int8 TempBin=0;
#use delay(int=4000000) // Especifica al compilador que hace uso del OSC interno
#use rs232(baud=9600, xmit=PIN_A1,rcv=PIN_A2,bits=8, parity=N))
#byte GPIO=0x05
#include <1wire2.c>
#include <DS1820.c>
#int_TIMER1
void  TIMER1_isr(void)//Función de interrupción por desbordamiento TMR1 
{

}
void main()
{
   setup_comparator(NC_NC);   // Todo digital
   set_tris_a(0x04); 
   disable_interrupts(global);
   DS1820_Read(0);
   delay_ms(500);
   while(TRUE){
   TempBin=(int)DS1820_Read(0);
   printf("@"); // send alive message
   printf("%d",TempBin);
   printf("@"); // send alive message
              }
}
librerias
Código: [Seleccionar]

Float DS1820_Read(Int1 Sensor)
   {
Int8 Busy=0,Temp1,Temp2;
Signed Int16 Temp3;
Float Result;

   OneWire_Reset(Sensor);
   OneWire_Write(0xCC,Sensor);
   OneWire_Write(0x44,Sensor);

   While (Busy == 0)
   Busy = OneWire_Read(Sensor);

   OneWire_Reset(Sensor);
   OneWire_Write(0xCC,Sensor);
   OneWire_Write(0xBE,Sensor);

   Temp1 = OneWire_Read(Sensor);
   Temp2 = OneWire_Read(Sensor);
   Temp3 = Make16(Temp2,Temp1);
 
// Result = (Float) Temp3 / 2.0;   // Formula para el DS18S20 con 0.5 grados C de resolución
   Result = (Float) Temp3 / 16.0;  // Formula para el DS18B20 con 0.1 grados C de resolución
   //Delay_Ms(200);
   Return(Result);
}
Código: [Seleccionar]
/*************************** Librería 1Wire2.c *********************************
* Descripción: Esta librería controla la comunicación
* entre el microcontrolador y dos sensores 1-Wire DS18B20
*******************************************************************************/

/****************** Definición de pines para los sensores *********************/
#Define One_Wire_Pin1 PIN_A0
#Define One_Wire_Pin2 PIN_A4

/********************* Funciones de comunicación 1-Wire ***********************/

/****************************** OneWire_Reset **********************************
* Esta función Inicializa el bus 1-Wire
*
*Parámetros:
* 1 Bit(Sensor) El sensor 0 ó 1 Conectado al Pin RA4 ó RA5
*Retorno:
*******************************************************************************/

Void OneWire_Reset(Int1 Sensor)
   {
   If(Sensor==0)
   {
   Output_Low(One_Wire_Pin1);                      // Llevar a 0 el Pin RA4
   Delay_Us(500);                                  // Esperar 500uS
   Output_Float(One_Wire_Pin1);                    // Hacer entrada el Pin RA4 (Quedará en alto por Pull up)
   Delay_Us(500);                                  // Esperar a que se inicialice el dispositivo.
   }
   Else
/* Hacer lo mismo con el otro sensor */   
   Output_Low(One_Wire_Pin2);
   Delay_Us(500);
   Output_Float(One_Wire_Pin2);
   Delay_Us(500);
   }

/***************************** OneWire_Write ***********************************
* Esta función escribe un byte en el sensor.
*
* Parámetros:
* 1 Byte(Data) El Byte a ser escrito en el sensor.
* 1 Bit(Sensor) El sensor 0 ó 1 Conectado al Pin RA4 ó RA5
* Retorno:
*******************************************************************************/

Void OneWire_Write(Int8 Data,Int1 Sensor)
{
Int Count;

   If(Sensor==0)
   {
   For (Count=0; Count<8; ++Count)
   {
   Output_Low(One_Wire_Pin1);                         // Llevar a 0 el Pin RA4
   Delay_Us(2);                                       // Esperar 2uS
   Output_Bit(One_Wire_Pin1,Shift_Right(&Data,1,0));  // Mandar el Bit al sensor 1-Wire
   Delay_Us(60);                                      // Esperar hasta que se escriba el Bit.
   Output_Float(One_Wire_Pin1);                       // Hacer entrada el Pin RA4 (Quedará en alto por Pull up)
   Delay_Us(2);                                       // Esperar mínimo 1uS.
   }
}
   Else
/* Hacer lo mismo con el otro sensor */
   For (Count=0; Count<8; ++Count)
   {
   Output_Low(One_Wire_Pin2);
   Delay_us(2);
   Output_Bit(One_Wire_Pin2,Shift_Right(&Data,1,0));
   Delay_Us(60);
   Output_Float(One_Wire_Pin2);
   Delay_Us(2);
   }
}

/*********************** OneWire_Read *********************************
* Esta función lee los 8 bits de datos del sensor 1-Wire
* Parámetros: Número del sensor (Int1 Sensor)= 0 ó 1
* Retorno: 8Bits (1 Byte) de datos del sensor
*********************************************************************/

Int OneWire_Read(Int1 Sensor)
{
Int Count,Data;

   If(Sensor==0)
   {
   For (Count=0; Count<8; ++Count)
   {
   Output_Low(One_Wire_Pin1);                   // Llevar a 0 el Pin RA4
   Delay_Us(2);                                 // Esperar 2uS
   Output_Float(One_Wire_Pin1);                 // Hacer entrada el Pin RA4 (Quedará en alto por Pull up)
   Delay_Us(8);                                 // Esperar a que se estabilice el dispositivo,
   Shift_Right(&Data,1,Input(One_Wire_Pin1));   // Cargar el resultado
   Delay_Us(120);                               // Esperar hasta que se lea el fin del bloque.
   }
}
   Else
/* Hacer lo mismo con el otro sensor */ 
    For (Count=0; Count<8; ++Count)
   {
   Output_Low(One_Wire_Pin2);
   Delay_Us(2);
   Output_Float(One_Wire_Pin2);
   Delay_Us(8);
   Shift_Right(&Data,1,Input(One_Wire_Pin2));
   Delay_Us(120);
   }
   Return(Data);
}


La idea seria poder conectar el pic 12f675 y mandarle comandos y que me muestre los datos de temperatura que tomo, si es que los puedo guardar en la eeprom del micro. Pero no se como hacer para implementarlo. Por ejemplo le podria mandar la palabra "download" y que me tire una lista de los datos de temperatura que tiene almacenados. La adajunto un programa hecho por mi, que permite con el codigo que di medir la temperatura.

aqui el programa que lee hecho en free pascal: https://www.dropbox.com/s/oy70u8vffeyv27b/todopic.rar?dl=0

Desconectado elreypic2

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1297
Re:Recibir datos por USART con pic12f675
« Respuesta #3 en: 03 de Marzo de 2019, 00:05:35 »
Que tal esperanzachat,

Bueno pues para empezar creo que ese microcontrolador se queda corto para tu aplicación, ya que si quieres guardar datos en la eeprom interna, esta es muy pequeña; solo contiene 128bytes. Lo cual solo te permitiría guardar 64 mediciones de temperatura, pero digamos que para fines didácticos está bien. El otro problema que veo es que el código tal como lo usas ocupa un buen de la memoria de programa así que todavía implementar comandos de operación será un tanto difícil. Pero en fin, una forma de implementar un código sencillo de por ejemplo, que cada vez que le mande la letra 'r' al microcontrolador realice la lectura de temperatura y me la envíe via serial sería de esta manera (solo colocaré la parte del main, lo demás que ya tienes no cambia):

Código: [Seleccionar]
char  cmd;      //Variable para recibir comando via serial

void main()
{
   setup_comparator(NC_NC);   // Todo digital
   set_tris_a(0x04); 
   disable_interrupts(global);
   DS1820_Read(0);
   delay_ms(500);
   while(TRUE)
   {
      cmd = 0;    //Inicializa valor de comando igual a 0
      if (kbhit())   //Se ha recibido caracter via puerto serial?
      {
         cmd = getc();    //Sí, entonces lee el caracter recibido
      }
      if (cmd == 'r')   //El caracter recibido es el comando de lectura ('r')?
      {
         TempBin=(int8)DS1820_Read(0);   //Sí, entonces realiza lectura de temperatura
         printf("@"); // send alive message
         printf("%d\n\r",TempBin);   //Envia valor de la temperatura via serial
      }
   }

}

No te recomiendo que envíes paralabras completas como "download" o algo así, esto porque el programa usará mas memoria ROM y es más fácil comparar un simple caracter que una palabra completa.
Espero esto te sirva y te de una guía para implementar lo que necesitas.

elreypic.

« Última modificación: 03 de Marzo de 2019, 01:15:32 por elreypic2 »

Desconectado elreypic2

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1297
Re:Recibir datos por USART con pic12f675
« Respuesta #4 en: 03 de Marzo de 2019, 01:25:23 »
Otra vez yo.

También puedes bajar la resolución de la medición de temperatura a 1°C y ello te permitirá grabar hasta 128 mediciones de temperatura (limitado por los 128 bytes de EEPROM disponibles en el microcontrolador). Para ello necesitas modificar la librería DS1820.c, la cual quedaría de la siguiente manera:

Código: [Seleccionar]
signed int8 DS1820_Read(Int1 Sensor)
 {
   Int8 Busy=0,Temp1,Temp2;
   Signed Int16 Temp3;
   Int8 Result;

   OneWire_Reset(Sensor);
   OneWire_Write(0xCC,Sensor);
   OneWire_Write(0x44,Sensor);

   While (Busy == 0)
   Busy = OneWire_Read(Sensor);

   OneWire_Reset(Sensor);
   OneWire_Write(0xCC,Sensor);
   OneWire_Write(0xBE,Sensor);

   Temp1 = OneWire_Read(Sensor);
   Temp2 = OneWire_Read(Sensor);
   Temp3 = Make16(Temp2,Temp1);
   
   Result = (int8)(Temp3>>4); //Fórmula para el DS18S20 con 1 grados C de resolución
   Return(Result);
}

En el siguiente código te hago un ejemplo para que cuando recibas el caracter "r", entonces el micro realiza una lectura de temperatura. Si recibe el caracter "l" entonces realiza 128 mediciones de temperatura y las guarda en la memoria eeprom.
Si recibe el caracter "d", entonces se descargan los datos de la eeprom hacia la PC (solo te pongo el main):

Código: [Seleccionar]
char  cmd;
unsigned int8 i;

void main()
{
   setup_comparator(NC_NC);   // Todo digital
   set_tris_a(0x04); 
   disable_interrupts(global);
   DS1820_Read(0);
   //delay_ms(500);
   while(TRUE)
   {
      cmd = 0;
      if (kbhit())
      {
         cmd = getc();
      }
      if (cmd == 'r')
      {
         //TempBin=(int8)DS1820_Read(0);
         TempBin=DS1820_read(0);
         printf("@"); // send alive message
         printf("%d\n\r",TempBin);
      }
      if (cmd=='l')
      {
         printf("read temp...");
         for (i=0; i<=127; i++)
         {
            TempBin=DS1820_read(0); //Read temperature
            write_eeprom(i,TempBin);
         }
         printf ("done\n\r");
      }
      if (cmd=='d')
      {
         printf("read data...\n\r");
         for (i=0; i<=127; i++)
         {
            TempBin=read_eeprom(i);
            printf("%d\n\r",TempBin);
         }
         printf("done\n\r");
      }
     
   }
}

Saludos

elreypic.


Desconectado esperanzachat

  • PIC10
  • *
  • Mensajes: 39
Re:Recibir datos por USART con pic12f675
« Respuesta #5 en: 03 de Marzo de 2019, 17:58:58 »
Gracias por responder elreypic2 este codigo me sera de gran ayuda. Saludos a todos.

Desconectado esperanzachat

  • PIC10
  • *
  • Mensajes: 39
Re:Recibir datos por USART con pic12f675
« Respuesta #6 en: 10 de Marzo de 2019, 22:56:22 »
elreypic2, mi  duda es si la libreria que me dejaste sirve para leer temperaturas negativas?, porque seria intersante poder usarlo para camaras frigorificas. Mi idea es usar solo siete bits para la parte entera y el bit siete que sea el bit de signo, 0 para temperaturas positivas y 1 para las negativas. Ustedes que saben mas me diran si es que estoy  equivocado, gracias de nuevo.

Desconectado elreypic2

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1297
Re:Recibir datos por USART con pic12f675
« Respuesta #7 en: 11 de Marzo de 2019, 00:53:23 »
Que tal esperanzachat,

Ambas librerías sirven para medir temperaturas negativas. Ya que el tipo de variable que se usa puede manejar valores negativos y positivos.
En la librería que te hice la variable puede tomar valores desde -127 a 128 por eso es ideal, de esta manera solo usas un byte que fue lo que usé.
Puedes simularlo en proteus y verás que funciona perfectamente.

Saludos.

elreypic.

Desconectado esperanzachat

  • PIC10
  • *
  • Mensajes: 39
Re:Recibir datos por USART con pic12f675
« Respuesta #8 en: 11 de Marzo de 2019, 19:24:25 »
Gracias nuevamente por responder! Saludos