Autor Tema: TC77 SPI  (Leído 6664 veces)

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

Desconectado aitorsp

  • PIC18
  • ****
  • Mensajes: 296
TC77 SPI
« en: 09 de Agosto de 2010, 11:31:50 »
Hola:

adjunto el código que estoy usando para simular en proteus el funcionamiento del sensor TC77 mediante SPI. No consigo que lea bien la temperatura. Adjunto tambien el esquema de proteus.
Un saludo
Aitor

Código: [Seleccionar]

#include <16f876.h>
#fuses XT,NOWDT
#use fast_io(c)
#use fast_io(b)
#use delay(clock=4000000)
#include "lcd.c"
#define CS PIN_C0
float valor;
void main(){
set_tris_b(0xFF);
set_tris_c(0b00010000);
setup_spi(spi_master|spi_h_to_l|spi_ss_disabled);
output_low(CS);
lcd_init();
while(1){
lcd_gotoxy(1,1);
while(!spi_data_is_in());
valor=spi_read();
printf(lcd_putc,"Temp=%f grados",valor);
}
}

« Última modificación: 09 de Agosto de 2010, 12:30:26 por aitorsp »

Desconectado pablomanieri

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 639
Re: TC77 SPI
« Respuesta #1 en: 09 de Agosto de 2010, 13:43:38 »
Hola, no has adjuntado el diseño de proteus.

Para que el sensor te comience a dar una lectura continua de datos hay una secuencia de inicialización que le debes enviar mediante el SPI. En la hoja de datos aparece la secuencia, como un ejemplo ,de una adquisición continua de datos (página 10).

Creo que cuando intentas leer el SPI con (spi_read()), en los parámetros le debes poner algo para que genere el reloj, sino no lo genera (por ejemplo spi_read(0)).

Ten en cuenta que el sensor no te entrega los datos en decimal, sino que te los entrega en un formato hex de 16Bit

Desconectado aitorsp

  • PIC18
  • ****
  • Mensajes: 296
Re: TC77 SPI
« Respuesta #2 en: 09 de Agosto de 2010, 14:08:47 »
Hola, no has adjuntado el diseño de proteus.

Para que el sensor te comience a dar una lectura continua de datos hay una secuencia de inicialización que le debes enviar mediante el SPI. En la hoja de datos aparece la secuencia, como un ejemplo ,de una adquisición continua de datos (página 10).

Creo que cuando intentas leer el SPI con (spi_read()), en los parámetros le debes poner algo para que genere el reloj, sino no lo genera (por ejemplo spi_read(0)).

Ten en cuenta que el sensor no te entrega los datos en decimal, sino que te los entrega en un formato hex de 16Bit

Hola:

si que he adjuntado el archivo. es un rar. Lo adjunto de nuevo por si ha habido algun problema.

gracias

aitor

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: TC77 SPI
« Respuesta #3 en: 09 de Agosto de 2010, 15:10:30 »
Si adjuntas los archivos fuente o el hex del programa, hasta podriamos ayudarte a depurarlo...
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado aitorsp

  • PIC18
  • ****
  • Mensajes: 296
Re: TC77 SPI
« Respuesta #4 en: 09 de Agosto de 2010, 15:13:16 »
Si adjuntas los archivos fuente o el hex del programa, hasta podriamos ayudarte a depurarlo...

Hola:

adjunto codigo fuente. Entiendo que el esquema de proteus no tiene ningun error verdad?

un saludo

aitor

Desconectado pablomanieri

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 639
Re: TC77 SPI
« Respuesta #5 en: 09 de Agosto de 2010, 16:36:37 »
En el código, le falta la inicialización del sensor para que comienze a hacer capturas continuamente, como te comenté antes. La sentencia spi_data_is_in(), solo se usa en modo esclavo, y no en modo maestro, pues es el maestro el que envía  la señal de reloj.
Con el tema del formato de los datos, el sensor no los da en formato decimal sino que cuando lees el registro de temperatura te da 13 bits que son los que tenés que usar para pasarlos a grados. En realida el CCS por hardware solo permite realizar una lectura de a 8 bits, por lo tanto leyendo 2 veces y guardando los datos en dos registros de 8 bits, obtenemos 16 bits leidos del sensor. Éste solo da 13bits válidos y los otros 3 bits restantes no forman parte de la temperatura medida

Para la inicialización haría lo siguiente (según el ejemplo que trae en la hoja de datos):
Código: C
  1. output_low(CS);
  2.  
  3. spi_read(0);//leemos byte alto de temperatura, pero no lo usamos
  4. spi_read(0);//leemos byte bajo de temperatura, pero no lo usamos
  5. spi_write(0x00);
  6. spi_write(0xFF); Escribimos 0xXXFF para ponerlo en shutdown, en el registro de configuración
  7. spi_read(0);//leemos byte alto
  8. spi_read(0);//leemos byte bajo obtenemos el Manufacturer's ID register(C15:C8), aunque no lo usamos para nada
  9. spi_write(0x00);
  10. spi_write(0x00);//escribimos 0x0000 para ponerlo en sensado continuo, en el registro de configuración
  11. output_high(CS);


Cómo se pasa de los registros leidos a grados?, esto está en la hoja de datos, pero te comento más mo menos como lo haría yo
Haciendo

Código: C
  1. output_low(CS);
  2. TempH=spi_read(0); //leo el byte mas significativo de temperatura
  3. TempL=spi_read(0); //leo el byte menos significativo de temperatura
  4. output_high(CS);
  5. Temp16Bits=make16(TempH,TempL); //Con esto obtengo el registro de 16 bits con los datos de la temperatura actual
  6. //Como el sensor nos da el valor en complemento a dos para los números negativos:
  7. if (Temp16Bits<0){
  8. banderanegativo=1;//asignamos una bandera para saber si el número es negativo
  9. Temp16Bits=~Temp16Bits+9;}//si es negativo lo complementamos a 2 y le sumamos 8
  10. else{
  11. banderanegativo =0;}
  12. Temp16Bits=Temp16Bits>>3; //descartamos los 3 bits menos significativos
  13. decimales=(float)(Temp16Bits&0b0000000001111)*0.0625;//damos formato a los decimales, segun la resolucion de 0.0625grados/bit(hoja de datos)
  14. enteros=(float)(Temp16Bits>>4); //damos formato a los enteros, solo descartando los decimales
  15. if (banderanegativo){
  16. Temperatura=-1*(enteros+decimales)
  17. }
  18. else{
  19. Temperatura=(enteros+decimales)
  20. }
  21. gotoxy(1,1);
  22. printf(lcd_putc,"Temp=%3.4f  \n",Temperatura);

las variables enteros, decimales y Temperatura son float,
Templ, Temph son int
Temp16bits es signed int16


El esquema de proteus está correcto, solo que en las propiedades del TC77, donde dice Temperature step colocaría 0.0625 que es la resolución del sensor.
« Última modificación: 09 de Agosto de 2010, 16:48:53 por pablomanieri »

Desconectado aitorsp

  • PIC18
  • ****
  • Mensajes: 296
Re: TC77 SPI
« Respuesta #6 en: 09 de Agosto de 2010, 17:17:29 »
En el código, le falta la inicialización del sensor para que comienze a hacer capturas continuamente, como te comenté antes. La sentencia spi_data_is_in(), solo se usa en modo esclavo, y no en modo maestro, pues es el maestro el que envía  la señal de reloj.
Con el tema del formato de los datos, el sensor no los da en formato decimal sino que cuando lees el registro de temperatura te da 13 bits que son los que tenés que usar para pasarlos a grados. En realida el CCS por hardware solo permite realizar una lectura de a 8 bits, por lo tanto leyendo 2 veces y guardando los datos en dos registros de 8 bits, obtenemos 16 bits leidos del sensor. Éste solo da 13bits válidos y los otros 3 bits restantes no forman parte de la temperatura medida

Hola:

No acaba de funcionar bien. Te adjunto el codigo completo por si me ha escapado algo.

Código: [Seleccionar]

#include <16f876.h>
#fuses XT,NOWDT
#use fast_io(c)
#use fast_io(b)
#use delay(clock=4000000)
#include "lcd.c"
#define CS PIN_C0
float valorh;
float valorl;
float valorregistroh;
float valorregistrol;
float decimales;
float temperatura;
float enteros;
int TempL;
int TempH;
int16 Temp16bits;
int banderanegativo;
void main(){
set_tris_b(0xFF);
set_tris_c(0b00010000);
setup_spi(spi_master|spi_h_to_l|spi_ss_disabled);
lcd_init();
while(1){
output_low(CS);
valorh=spi_read(0); //lectura byte alto
valorl=spi_read(0);//lectura byte bajo
spi_write(0x00);
spi_write(0xFF);
valorregistroh=spi_read(0);
valorregistrol=spi_read(0);
spi_write(0x00);
spi_write(0x00);
output_high(CS);
TempL=spi_read(0); //leo el byte menos significativo de temperatura
TempH=spi_read(0); //leo el byte mas significativo de temperatura
Temp16Bits=make16(TempL,TempH); //Con esto obtengo el registro de 16 bits con los datos de la temperatura actual
//Como el sensor nos da el valor en complemento a dos para los números negativos:
if (Temp16Bits<0){
banderanegativo=1;//asignamos una bandera para saber si el número es negativo
Temp16Bits=~Temp16Bits+9;}//si es negativo lo complementamos a 2 y le sumamos 8
else{
banderanegativo =0;}
Temp16Bits=Temp16Bits>>3; //descartamos los 3 bits menos significativos
decimales=(float)(Temp16Bits&0b0000000001111)*0.0625;//damos formato a los decimales, segun la resolucion de 0.0625grados/bit(hoja de datos)
enteros=(float)(Temp16Bits>>4); //damos formato a los enteros, solo descartando los decimales
if (banderanegativo){
Temperatura=-1*(enteros+decimales);
}
else{
Temperatura=(enteros+decimales);
}
lcd_gotoxy(1,1);
printf(lcd_putc,"Temp=%3.4f  \n",Temperatura);

}
}


Un saludo

Aitor

Desconectado pablomanieri

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 639
Re: TC77 SPI
« Respuesta #7 en: 09 de Agosto de 2010, 18:39:27 »
La idea la captaste, pero tienes alguno problemas en el código, acá va una correción, pero todavía hay un error con los decimales, pero no se si es error el el programa o en la resolución del sensor en el proteus. Por lo pronto vas a tener que estudiar la hoja de datos y ver si entiendes lo que hice con el código y encontrar a ver si estábien o hay algún error.
Te eadjunto la dirección de una nota de aplicación del sensor y que explica un poco mejor el tema del formato de los datos.
http://www.micropicplus.com/ApplicationNotes/AN913/DS-00913a.pdf
Código: C
  1. #include <16f876.h>
  2. #fuses XT,NOWDT
  3. #use fast_io(c)
  4. #use fast_io(b)
  5. #use delay(clock=4000000)
  6. #include "lcd.c"
  7. #define CS PIN_C0
  8. int Templ=0;
  9. int Temph=0;
  10. signed int16 Temp16Bits=0;
  11. float decimales=0;
  12. float enteros=0;
  13. int1 banderanegativo=0;
  14. float Temperatura;
  15. void main(){
  16. set_tris_b(0xFF);
  17. set_tris_c(0b00010000);
  18. setup_spi(spi_master|spi_l_to_h| spi_ss_disabled);
  19.  
  20. lcd_init();
  21.  
  22. //configuracion del sensor en modo continuo
  23. output_low(CS);
  24. spi_read(0);//leemos byte alto
  25. spi_read(0);//leemos byte bajo
  26. spi_write(0x00);
  27. spi_write(0xFF);
  28. spi_read(0);//leemos byte alto
  29. spi_read(0);//leemos byte bajo
  30. spi_write(0x00);
  31. spi_write(0x00);
  32. output_high(CS);
  33.  
  34. while(1){
  35. lcd_gotoxy(1,1);
  36. output_low(CS);
  37. Temph=spi_read(0);//obtenemos el Temp alto del registro de temperatura
  38. Templ=spi_read(0);//obtenemos el Temp bajo del registro de temperatura
  39. output_high(CS);
  40. Temp16Bits=make16(Temph,Templ);//convertimos a un registro de 16Bits
  41. banderanegativo=0;
  42. if (Temp16Bits<0){
  43. banderanegativo=1;
  44. Temp16Bits=~Temp16Bits+9;
  45. }//si es negativo lo complementamos a 2 y le sumamos 8
  46. Temp16Bits=Temp16Bits>>3;//descartamos los 3 bits menos significativos
  47. decimales=(float)(Temp16Bits&0b0000000000001111)*0.0625;//damos formato a los decimales
  48. enteros=(float)(Temp16Bits>>4); //damos formato a los enteros, solo descartando los decimales
  49. if (banderanegativo){
  50. Temperatura=-1*(enteros+decimales);
  51. }
  52. else{
  53. Temperatura=(enteros+decimales);
  54. }
  55. lcd_gotoxy(1,1);
  56. printf(lcd_putc,"Temp=%3.4f   \n",Temperatura);
  57.  
  58. delay_ms(100);
  59. }
  60. }

Desconectado aitorsp

  • PIC18
  • ****
  • Mensajes: 296
Re: TC77 SPI
« Respuesta #8 en: 10 de Agosto de 2010, 02:47:09 »
La idea la captaste, pero tienes alguno problemas en el código, acá va una correción, pero todavía hay un error con los decimales, pero no se si es error el el programa o en la resolución del sensor en el proteus. Por lo pronto vas a tener que estudiar la hoja de datos y ver si entiendes lo que hice con el código y encontrar a ver si estábien o hay algún error.

Hola:

he estado haciendo algunas pruebas y con este codigo me funciona la simulacion en proteus. He cambiado tu codigo en la linea 45 donde ponias +9 por +8 (proteus no daba los valores exactos de temperatura) y tambien he modificado la configuracion inicial en modo continuo. Proteus simula la lectura del sensor sin dicha configuracion.

Un saludo

Aitor

Código: [Seleccionar]

#include <16f876.h>
#fuses XT,NOWDT
#use fast_io(c)
#use fast_io(b)
#use delay(clock=4000000)
#include "mylcd.c"
#define CS PIN_C0
int Templ=0;
int Temph=0;
signed int16 Temp16Bits=0;
float decimales=0;
float enteros=0;
int1 banderanegativo=0;
float Temperatura;
void main(){
set_tris_b(0xFF);
set_tris_c(0b00010000);
setup_spi(spi_master|spi_l_to_h| spi_ss_disabled);
 
lcd_init();
 
//configuracion del sensor en modo continuo
//output_low(CS);
//spi_read(0);//leemos byte alto
//spi_read(0);//leemos byte bajo
//spi_write(0x00);
//spi_write(0xFF);
//spi_read(0);//leemos byte alto
//spi_read(0);//leemos byte bajo
//spi_write(0x00);
//spi_write(0x00);
//output_high(CS);
while(1){
lcd_gotoxy(1,1);
output_low(CS);
Temph=spi_read(0);//obtenemos el Temp alto del registro de temperatura
Templ=spi_read(0);//obtenemos el Temp bajo del registro de temperatura
output_high(CS);
Temp16Bits=make16(Temph,Templ);//convertimos a un registro de 16Bits
banderanegativo=0;
if (Temp16Bits<0){
banderanegativo=1;
Temp16Bits=~Temp16Bits+8;
}//si es negativo lo complementamos a 2 y le sumamos 8
Temp16Bits=Temp16Bits>>3;//descartamos los 3 bits menos significativos
decimales=(float)(Temp16Bits&0b0000000000001111)*0.0625;//damos formato a los decimales
enteros=(float)(Temp16Bits>>4); //damos formato a los enteros, solo descartando los decimales
if (banderanegativo){
Temperatura=-1*(enteros+decimales);
}
else{
Temperatura=(enteros+decimales);
}
lcd_gotoxy(1,1);
printf(lcd_putc,"Temp=%3.4f   \n",Temperatura);
 
delay_ms(100);
}
}

« Última modificación: 10 de Agosto de 2010, 05:07:18 por aitorsp »

Desconectado pablomanieri

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 639
Re: TC77 SPI
« Respuesta #9 en: 10 de Agosto de 2010, 13:10:36 »
Me alegro que te haya funcionado.

Desconectado aitorsp

  • PIC18
  • ****
  • Mensajes: 296
Re: TC77 SPI
« Respuesta #10 en: 10 de Septiembre de 2010, 10:56:38 »
Me alegro que te haya funcionado.

Hola:

Pues si, me ha funcionado en proteus pero acabo de implementarlo en una PCB y el sensor me lee lo siguente:

Temp= 0.000
pasa un tiempo...
Temp= -0.0625

y asi todo el tiempo. Es un error de la configuracion spi?.

Un saludo

Aitor

Desconectado jeremylf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1341
Re: TC77 SPI
« Respuesta #11 en: 29 de Octubre de 2011, 15:51:13 »
Hola muchachos. Hay algo que no me queda del todo muy claro. Verán, este TC77 tiene implementado la interface SPI pero para los datos los hace en un solo pin (SI/O). Mientras que el hardware SPI de mi 18F4550 tiene su SDI y SDO independientes (RB0 y RC7, respectivamente). Asi que, no entiendo muy bien como el pic logra una comunicacion con el sensor habiendo esta limitacion, o es que estoy obiando alguna posibilidad que hay en el hardware spi del pic que permite hacer esto?


Gracias.

Desconectado pablomanieri

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 639
Re: TC77 SPI
« Respuesta #12 en: 29 de Octubre de 2011, 18:30:16 »
Uhhh había un problema de conceptos. Perdón, no me acuerdo mucho pero parece que daba por sentado que había comunicación bidireccional.
Tal como está el circuito y el programa el pic sólo lee los datos provenientes del TC77, y no es capaz de configurarle nada. :oops:

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: TC77 SPI
« Respuesta #13 en: 29 de Octubre de 2011, 18:37:29 »
Hola muchachos. Hay algo que no me queda del todo muy claro. Verán, este TC77 tiene implementado la interface SPI pero para los datos los hace en un solo pin (SI/O). Mientras que el hardware SPI de mi 18F4550 tiene su SDI y SDO independientes (RB0 y RC7, respectivamente). Asi que, no entiendo muy bien como el pic logra una comunicacion con el sensor habiendo esta limitacion, o es que estoy obiando alguna posibilidad que hay en el hardware spi del pic que permite hacer esto?


Gracias.

Yo vi en algun lado una configuracion de SPI donde con una resistencia (creo que entre SPI SO y SPI SI ), hacian comunicacion bidireccional contra un solo pin.
Debe haber una nota de aplicacion de Microchip al respecto.
Sino esta en el manual de aplicaciones simples pasa raspando...
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado jeremylf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1341
Re: TC77 SPI
« Respuesta #14 en: 01 de Noviembre de 2011, 05:21:11 »
Al parecer, solo es cuestion de leer y nada mas; pues, en el que trae el PICDEM FS USB que tengo, viendo el codigo proporcionado en C18, el 18F4550 solo lee y lee y lee el TC77 y nunca le configura nada.

Por otro lado, lo que me causa algo de duda es que el pin SDO del SPI de ese PIC es compartido con el RX del USART. Entonces, no habria algun conflicto si habilito ambos hardware's? No se puede usar 232 y SPI al mismo tiempo? es eso?

Citar
Yo vi en algun lado una configuracion de SPI donde con una resistencia (creo que entre SPI SO y SPI SI ), hacian comunicacion bidireccional contra un solo pin.
Que interesante MGLSOFT, nunca se me habría ocurrido asi :o
« Última modificación: 01 de Noviembre de 2011, 05:36:45 por jeremylf »


 

anything