Autor Tema: BUS I2C EN HITECH  (Leído 9181 veces)

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

Desconectado LAFUMAT

  • PIC16
  • ***
  • Mensajes: 148
Re: BUS I2C EN HITECH
« Respuesta #15 en: 22 de Junio de 2012, 12:15:01 »
VALE:

HE podido con esta libreria usar el puerto de expansion de 8 bits, el conversor A/D de 12 bits y la eeprom. !!genial!!

pero el sensor MCP9804 se me resiste.

me lee, pero la conversion hago algo mal o el data sheet tiene algun error.

me lee siempre el mismo dato y no cuadra.

yo sigo la secuencia, pero nada de nada.


el sensor de la demo esta en la direccio 0x90 y para leer en la 0x91.

posteo la parte del codigo a ver si se ve algun fallo:

Código: [Seleccionar]
ClearLcd();
GotoxyLcd (1,1);
WriteStrLcd ("sensor mcp9804");
 __delay_ms(10);


start_i2c();
 respuesta = write_i2c (0b10010010);
 if (respuesta == ACK)
   {
     write_i2c (0x01);                   
    write_i2c (0x00);                   
     write_i2c (0x00);                   
  }
   stop_i2c();
__delay_ms(10);

while(1)
{
start_i2c();
 respuesta = write_i2c (0b10010010);
if (respuesta == ACK)
   {
     write_i2c (0x05);                   
 
  }

//rstart_i2c();                       
start_i2c();
     respuesta = write_i2c (0b10010011); 
     if (respuesta == ACK)
     {
// write_i2c (0x00);
MSB = read_i2c (ACK);           
// dato = read_i2c (NOACK);           
LSB = read_i2c (NOACK); 
       
     }
stop_i2c();

//convertir

MSB = MSB & 0x1F;
if ((MSB & 0x10)== 0x10)
{
MSB = MSB & 0x0F;
TEMP = 256 - (MSB*16 + LSB /16);
}
else
{
TEMP = (MSB*16 + LSB /16);
}



ClearLcd();
GotoxyLcd (1,1);
WriteStrLcd ("TEMP= ");
itoa(text,TEMP,10);
GotoxyLcd (7,1);
WriteStrLcd(text);
__delay_ms(100);
}



Tambien me queda la terea sobre lo que me comentas angelgris, verificar que la libreria incluida en hitech no funciona por algun cambio de nombre de algun registro.

de todas formas tu libreria funciona de maravilla,, y me pregunto si valdria para usarse en multimaster. ¿se podria usar para comunicar varias placas en multimaster ademas de tener algun slave?

saludos

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: BUS I2C EN HITECH
« Respuesta #16 en: 22 de Junio de 2012, 16:27:24 »
  Hola.

  En el primer intente de comunicación estás poniendo

Código: C
  1. respuesta = write_i2c(0b10010010);

  pero ese valor en hexa es 0x92 y no 0x90 como mencionas que es la dirección del MCP9804.

  Dentro del while ocurre lo mismo en la primer llamada y en la segundo le estás mandando 0x93 como dirección de lectura.
Para escritura creo que la dirección sería 0b10010000 y para lectura 0b10010001 que son 0x90 y 0x91 respectivamente.


  En cuanto a utilizar la librería en multimaster, no lo sé porque no lo simulé nunca pero no creo ya que no implemento nada como para saber si hay colisión en el BUS
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado LAFUMAT

  • PIC16
  • ***
  • Mensajes: 148
Re: BUS I2C EN HITECH
« Respuesta #17 en: 25 de Junio de 2012, 05:06:25 »
hola:

he revisado, y no, resulta que mi placa demo, el mcp9804 esta en la direccion 0x92H para la escritura y entonces la lectura estará en la 0x93h.

el caso es que segun el datasheet, el registro de la temperatura esta en el 0x05h, pero siempre me devuelve el mismo valor y cuando pongo el puntero en la 0x00h , me da valores pero no los se pasar a temperatura pero ese registro el datasheet dice que es para cosas futuras.

asi que estoy estancado en ese punto.

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: BUS I2C EN HITECH
« Respuesta #18 en: 25 de Junio de 2012, 12:31:41 »
  Estoy mirando un poco el datasheet del sensor... aparentemente para leer el dispositivo no es necesario configurar nada, aunque sí lo es apuntar el registro 0x05 que es donde se almacena el valor de temperatura. Por lo tanto debería funcionar el siguiente código.

Código: C
  1. start_i2c();
  2. respuesta = write_i2c(0x92);
  3. if (respuesta == ACK)
  4. {
  5.   write_i2c(0x05);
  6.   rstart_i2c();
  7.   write_i2c(0x93);
  8.   bytealto = read_i2c(ACK);
  9.   bytebajo = rear_i2c(NOACK);
  10. }
  11. stop_i2c();

  Que prestándole más atención es lo que hace tu código dentro del while.

  Otra posibilidad es que haya un error en cuanto a la información de la dirección del MCP en tu placa...
  También se podría activar algún led si es que al respuesta del MCP, como para asegurarse que la dirección es la correcta.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado LAFUMAT

  • PIC16
  • ***
  • Mensajes: 148
Re: BUS I2C EN HITECH
« Respuesta #19 en: 25 de Junio de 2012, 12:41:38 »
PUES yo leyendo una vez mas el datasheet, me he fijado que este sensor funciona en modo standart (100kHz) ¿puede ser esa la causa?

¿tu libreria a que velocidad transmite? ¿cuales son los parametros de tiempos que hebria que tocar.??

gracias

Desconectado LAFUMAT

  • PIC16
  • ***
  • Mensajes: 148
Re: BUS I2C EN HITECH
« Respuesta #20 en: 25 de Junio de 2012, 13:33:21 »
el caso es que siempre me devuelve el mismo valor, que pasados a la lcd con itoa me quedan:

MSB= 84
LSB = 1

y no cambia nunca.

si cambio a otra direccion de dispositivo, me devuelve 255 y 255, puesto que no lee nada (imagino), pero he vuelto a comprobar y la direccion esta bien 0x92.

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: BUS I2C EN HITECH
« Respuesta #21 en: 25 de Junio de 2012, 13:34:27 »
  La librería calcula la velocidad en base a PIC_CLK e I2C_BAUD.

  El primero de los dos, sería la velocidad a la cual queda trabajando el núcleo del PIC. Es decir que si el PIC tiene puesto un cristal de 8Mhz pero en la configuración tiene activado el PLL del oscilador, la frecuencia a la que trabaja el PIC es de 32Mhz.

  El segundo nos indica a que velocidad tiene que trabajar el I2C.

  Volviendo al ejemplo del cristal de 8MHz con el PLL activado... hay que poner las siguientes líneas en el programa antes de incluir la librería

Código: C
  1. #define PIC_CLK 32000000            // esta usa la libreria
  2. #define _XTAL_FREQ 32000000         // esto es de HiTech para los delays
  3. #define I2C_BAUD 100000             // I2C en 100KHz
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado LAFUMAT

  • PIC16
  • ***
  • Mensajes: 148
Re: BUS I2C EN HITECH
« Respuesta #22 en: 26 de Junio de 2012, 05:06:18 »
pues lo tengo igual que me dices, con la diferencia de que en vez de a 32MHZ lo tengo a 16MHz.

Código: [Seleccionar]
#define PIC_CLK   16000000   // cristal 10MHz para lib de i2c
#define _XTAL_FREQ 16000000 //para los delays
#define I2C_BAUD  100000     // velocidad 100 KHz       
       


Desconectado LAFUMAT

  • PIC16
  • ***
  • Mensajes: 148
Re: BUS I2C EN HITECH
« Respuesta #23 en: 26 de Junio de 2012, 06:48:37 »
VALE, YA LO VOY TENIENDO, VAYA TELA:

En la placa tengo un MCP9801 y me empecine en que era un mcp9804.

ya leo pero no termino de entender como hacer la conversion a decimal. me coge datos de MSB Y LAB y se supone que unos bit son los de despues del punto y otro los enteros y que estan en complemento a dos, pero bueno, dandole a ver que saco

Desconectado LAFUMAT

  • PIC16
  • ***
  • Mensajes: 148
Re: BUS I2C EN HITECH
« Respuesta #24 en: 26 de Junio de 2012, 07:34:42 »
YA LEO Y LO QUE NOTO ES QUE LA MEDIDA ES MUY VARIABLE, DE 20 A 30 Y ASI CONTINUAMENTE.

no veo una conversion corecta, por ejemplo al poner un dedo en el chip ver como sube la temperatura o cosas asi...

Desconectado LAFUMAT

  • PIC16
  • ***
  • Mensajes: 148
Re: BUS I2C EN HITECH
« Respuesta #25 en: 03 de Julio de 2012, 05:36:13 »
BUENO, CONSEGUIDO.

YA LO LEO, CADA MCP98xx LEE DE UNA FORMA Y EN EL MCP9801 DEPENDIENDO DE LA RESOLUCION HAY QUE TRATAR DE UNA FORMA, COMO LO TENGO A 0.5 DE RESOLUCION ME IMAGINO QUE LOS SALTOS SE DEBEN A LA POCA PRECISION.

GRACIAS DE NUEVO ANGELGRIS, VOY A SEGUIR DANDOLE AL I2C Y PRACTICAR MAS. YA IRE CONTANDO

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: BUS I2C EN HITECH
« Respuesta #26 en: 03 de Julio de 2012, 09:03:11 »
  Que bueno que lo hayas conseguido  :-/ :-/

  Es un dolor de cabeza cuando hacen integrados con prestaciones similares y sin embargo son tan diferentes en su manejo  :5] Y pero aún eso que comentas que según la resolución lo tengas que leer de una forma u otra... que molesto por favor!!!!!!!!  :x
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado LAFUMAT

  • PIC16
  • ***
  • Mensajes: 148
Re: BUS I2C EN HITECH
« Respuesta #27 en: 03 de Julio de 2012, 09:38:38 »
ASI ES AMIGO,

y aun asi, tengo que practicar, pues me lee entre 19 y 22 grados dando saltos, y ya no es problema de leer, sino que son los valores que devuelve, a ver que saco en claro

jaja

Desconectado Rseliman

  • PIC16
  • ***
  • Mensajes: 239
Re: BUS I2C EN HITECH
« Respuesta #28 en: 28 de Mayo de 2013, 14:27:38 »
Hola Amigos , estoy tratando de usar esta libreria en xc8 con un pic 16f819...mirando un poco me encuentro que el chip que uso AngelGris ..pic16f876 tiene los registros muy parecidos ...por ejemplo el SSPSTAT Y EL SSPCON son identicos , mi problema viene con el SSPCON2 QUE NO ESTA EN EL PIC819 ...ALGUEIN ME DA UNA MANO POR FAVOR

Muchas gracias
Las Grandes Obras las sueñan los grandes locos , mientras los inutiles las critican !!