Autor Tema: De Nuevo I2C para leer al maestro  (Leído 4021 veces)

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

Desconectado davidjminky

  • PIC10
  • *
  • Mensajes: 8
De Nuevo I2C para leer al maestro
« en: 20 de Noviembre de 2009, 06:22:01 »
haa, por error de Sesion tuve que escribir el mensaje original,

Tengo un problema para implementar la comunicacion i2c, y antes de implementar la SPI, que en el foro parece ser mas viable que i2c. me gustaria saber si alguien me podria ayudar para que el maestro lea un esclavo.

Detalles, ya sea ha logrado la comunicacion, de maestro - esclavo ( el siempre inicia la comunicacion y un esclavo espera por tal y si la direccino le corresponde atiende la peticion).. con ello implemente el codigo del lado del maestro de la siguiente manera:

Funcion del Maestro para leer un dato del esclavo:
void receive_i2c(int8 dir1)
{
   i2c_start();
   i2c_write(dir1); //Direccion del unico pic esclavo definida por sofware, direccion 0XB8
   valore = i2c_read(); //aqui solicito un dato
   i2c_stop();
   delay_ms(2);
}

Funcion del Esclavo
#int_SSP
VOID SSP_isr()
{
   estado=i2c_isr_state();
   if((estado>0)&&(estado<0x80))
   {
         dato=i2c_read();
         datot=dato;
   }
   if(estado == 0x80)                     //Master is requesting data
   {
         i2c_write(0X01);
   }
}

Todo anda muy bien cuando el maestro eenvio su dato al esclavo, lo visualizo en el puerto del del esclavo asi como del maestro, pero el detalle cuando pido un dato al esclavo, pareciera ser que si coje algun dato obvio no el 0x01 QUE LE envio, pesca en si 191, despues de eso todo se cuelga, ya no puedo enviarle un dato al sclavo solo reseteando la comunicacion vuelve a funcionar en el sentido maestro esclavo.

Ya hice mi busqueda de i2c en este foro me arrojo 44 paginas que en promedio son 10 temas por pagina,  :shock: llegue a la pagina 4 y encontre que hay que usar la funcion i2c poll pero solo lo muestra para el esclavo. Ya he leido literatura de ic2 y tengo por alli teoria, que podria servirle a quien apenas empieza, ya que este tema se apila en primer instancia, y quien como yo esta empezando en esto de los pics, que la verad son apacionantes son las horas de dormir 4am apox y aqui sigo, y que tengo examen de redes, pero aca ando asi que pues si algun persona con la experiencia de esto me ayude. (nota se que tengo que leer el pdf de el pic, y trabajar con los registros si hay necesidad de ello pero no se como hacerlo en el compilador, como darles la direcciones de cada registro).

Saludos y Gracias
Notas: CCS 4.002, PIC18F4550
maestro
#FUSES XT,NOWDT
#use delay(clock=8000000)
#use i2c(Master,Fast,sda=PIN_B2,scl=PIN_B3,force_hw)

esclavo
#use delay(clock=8000000)
#use i2c(Slave,Fast,sda=PIN_B0,scl=PIN_B1,force_hw,address=0xB8)
« Última modificación: 20 de Noviembre de 2009, 06:44:12 por davidjminky »

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: De Nuevo I2C para leer al maestro
« Respuesta #1 en: 20 de Noviembre de 2009, 09:15:22 »
Creo que el único problema es que al leer el dato y si es el último debes enviar un NAck y después el bit stop, osea de la siguiente manera:

Código: C
  1. i2c_start();
  2.    i2c_write(dir1); //Direccion del unico pic esclavo definida por sofware, direccion 0XB8
  3.    valore = i2c_read(0); //aqui solicito un dato
  4.    i2c_stop();



Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado davidjminky

  • PIC10
  • *
  • Mensajes: 8
Re: De Nuevo I2C para leer al maestro
« Respuesta #2 en: 26 de Noviembre de 2009, 04:39:38 »
Gracias Suky, si leei un poco mas y en ccs para terminar la lectura hay que agregar un cero en la funcion -->, valore=i2c_read(0);, haa eso no viene en la ayuda, tu sabes en que parte vienen esas funciones del compilador , bueno no pregunto mas me pondre a investigar  :o, Gracias de nuevo no lo he probado pero ojala esa sea la solucion gracias por guiarme. Lo voy a probar y checar mi codigo mas afondo, Gracias!!!''

nota. perdon por la tardanza djee un poco esto por los benditos examenes, pero ya acaban este viernes, jeje pero bueno seguire.

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: De Nuevo I2C para leer al maestro
« Respuesta #3 en: 26 de Noviembre de 2009, 10:15:02 »
Para terminar la lectura de un dispositivo en I2C el último byte se debe responder con un NAck y es bit STOP, es la razón del 0.

Después a que funciones del compilador te refieres?


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado davidjminky

  • PIC10
  • *
  • Mensajes: 8
Re: De Nuevo I2C para leer al maestro
« Respuesta #4 en: 29 de Noviembre de 2009, 05:02:46 »
las funciones a que me referia por ejemplo, cuando creas un proyecto haces un include del pic al cual estas utilizando, en ese archivo picxxxxx.h se depositan los define para cada micro y su arquitectura, creo asi lo entiendo yo, como .lkr de mplap, pero por ejemplo en mplap tenias que agregar un .h para usar los delays, un .h para los puertos, .h para las funciones i2c. etc. en ccs no es necesario entonces a esas funciones y como las contruyeron eso quisiera ver, por ejemplo en la carpeta de DEvices del ccs veo que estan las del lcd, usb, entre otras, pero no hayo las de los delays ,i2c, spi etc. espero no haberte confundido..

 volviendo con el tema ya me empiezo a volver loco,  :shock: no logro que el maestro me lea un dato del esclavo subo el programa para ver  si me puedes ayudar.

El sistema trata de que por usart, reciba una valor X, los valores que tengo caracterisados son los siguientes:
el valor 30 es para mandar a dormir al micro esclavo - lo hace correctamente
el valor 40 es para que el esclavo haga una vuelta con un motor a pasos - lo hace correctamente
el valor 50 es para que el maestro lea un dato del esclavo - cualquiera para hacer prueba; le puse un uno, pero despues de eso se cuelga la comunicacion tanto i2c como usart

saludos, te dejo el codigo para ver si me puedes encontrar un error (cuando tu puedas suky), no tengo simulacion, y gracias por todo.

nota. crees que la usart afecte la comunicacion, deberia quitar el codigo de la usart? y hacer primero la prueba sensilla con solamente i2c, y con push boton y simulacion, ? creo que me contesto a mi mismo si.. jeje, te digo que ya me ando volviendo loco: saludos y gracias

Desconectado davidjminky

  • PIC10
  • *
  • Mensajes: 8
Re: De Nuevo I2C para leer al maestro
« Respuesta #5 en: 29 de Noviembre de 2009, 05:20:08 »
perdon antes de pasar, a hacer mi simulacion, mi vairbale que recibe el micro maestro la declare como int16 sabiendo que la comunicacion serial es de 8bits, ya la correji pero sigue igual :(, era como detalle, saludos

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: De Nuevo I2C para leer al maestro
« Respuesta #6 en: 29 de Noviembre de 2009, 10:37:52 »
En CCS no es necesario agregar ningún include para las demoras, RS232, I2C, ect. Agregando el #use RS232, #use i2c, ya están habilitadas las funciones para usar por hardware o software como se haya definido. Y nos vas a poder ver como están realizadas las rutinas  :?

Respecto al código, vas a realizar una lectura sobre el slave, así que el comando debería de ser 0xA1 y no 0xA0, para que en la rutina del slave i2c_isr_state() sea igual a 0x80.

Otro detalle, para que sea mas "prolijo" el código puedes usar la estructura switch{}:

Código: C
  1. switch(valor){
  2.      case 0x30:
  3.           .....
  4.      break;
  5.      case 0x40:
  6.          ...
  7.      break;
  8. }

Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado davidjminky

  • PIC10
  • *
  • Mensajes: 8
Re: De Nuevo I2C para leer al maestro
« Respuesta #7 en: 30 de Noviembre de 2009, 04:49:24 »
Saludos Suky,

Primero gracias, por poner tu tiempo y atencion en resonder a mis dudas,,

Listo!, ya he logrado lo que preguntaba, al inicio, sa ha leido correctamente al esclavo.  :)

Gracias!!

nota1. Oye no sabes si han hecho aqui un proyecto de manejo de alta impedancia para hacer una matriz de leds aqui, busque eso pero no lo vi, entonces ese es uno de los proyectos que me gustaria aportar, pero si ya estan pues, solo a comentar. 

nota2. por cualquier otro tropiezo ojala me puedas orientar.

not3. si hice mi codigo mas prolijo, la verdad si tenia una desorden y ese else if, gastaba tiempo al compilador como al uc en procesar,  :shock: gracias por ese tip.


Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: De Nuevo I2C para leer al maestro
« Respuesta #8 en: 30 de Noviembre de 2009, 10:22:12 »
Saludos Suky,

Primero gracias, por poner tu tiempo y atencion en resonder a mis dudas,,

Listo!, ya he logrado lo que preguntaba, al inicio, sa ha leido correctamente al esclavo.  :)

Gracias!!

nota1. Oye no sabes si han hecho aqui un proyecto de manejo de alta impedancia para hacer una matriz de leds aqui, busque eso pero no lo vi, entonces ese es uno de los proyectos que me gustaria aportar, pero si ya estan pues, solo a comentar. 

nota2. por cualquier otro tropiezo ojala me puedas orientar.

not3. si hice mi codigo mas prolijo, la verdad si tenia una desorden y ese else if, gastaba tiempo al compilador como al uc en procesar,  :shock: gracias por ese tip.


De nada! Con respecto al tema de manejo de alta impedancia quede medio perdido  :mrgreen: Como sería? Igual sin entender me animo a decir que el aporte siempre es bueno para la comunidad  ;-)

Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado davidjminky

  • PIC10
  • *
  • Mensajes: 8
Re: De Nuevo I2C para leer al maestro
« Respuesta #9 en: 30 de Noviembre de 2009, 23:23:03 »
es un programa que utilize en mi curso de uc, el detalle es que esta para c18, dejame migrarlo para ccs, y lo subo, tratare de detallar la parte teorica y el programa como tal.

gracias!

estamos en contacto. sigo con examenes, ya es diciembre ajua!

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: De Nuevo I2C para leer al maestro
« Respuesta #10 en: 01 de Diciembre de 2009, 00:55:26 »
En C18 también, el que lo necesite que lo estudie y lo migre al código que maneje ;-) Estamos en las misma, a fin de año te escrachan  :8}  :D


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado WODZAROD

  • PIC10
  • *
  • Mensajes: 1
I2C entre dos PIC18F4550
« Respuesta #11 en: 26 de Julio de 2010, 01:22:50 »
Hola, disculpa por las moletias, estoy realizando un proyecto llamado Cashless (pago sin monedas, con tarjetas Smart Cards), usando el protocolo de comunicación I2C entre la tarjeta y el PIC18F4550. Primero, como a modo de prueba, estoy realizando un programa que realice la comunicación I2C entre 2 PICs 18F4550 (Maestro-Esclavo) pero no me funciona. No encuentro el error en mi programa. El programa lo realizo en CCS. Espero que alguien me ayude, se lo agradeceré mucho.

Detalles:
-Pruebo enviando dato 0x35 del Maestro al Esclavo y se debe visualizar en el puerto D del esclavo el valor 0x35, al implementarlo se visualiza 0x42, no encuentro el error.
-Uso cristal de 20MHz cada uno.

Adjunto mis programas I2C (Maestro-Esclavo) y su respectiva simulación en Proteus.
Saludos.


 

anything