TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Thulsa Doom en 14 de Marzo de 2015, 19:49:24

Título: [SOLUCIONADO]Dudas con 2 módulos MSSP en el mismo micro con C18
Publicado por: Thulsa Doom en 14 de Marzo de 2015, 19:49:24
Hola a todos, pues tengo un PIC18F67J50 que tiene dos módulos MSSP y quiero que por el MSSP1 esté el protocolo SPI y por el MSSP2 esté el protocolo I2C al mismo tiempo, tengo entendido que no habría conflictos entre ellos.

Estoy utilizando la libreía i2c.h y spi.h, ¿que tendría que hacer para que cada protocolo trabaje con módulo diferente?

por lógica sería para el SPI utilizar las funciones de este modo ReadSPI1() y para el I2C ReadI2C2(), ¿sería de este modo?

Una de las dudas que tengo es que cuando implemento la librería de I2C por ejemplo, me configura las patillas SDA y SCL tanto la del módulo 1 como la del 2 y eso me confunde un poco ya que en el módulo 1 ya tengo definido las patillas del protocolo SPI.

¿Qué opinan?
Título: Re: Dudas con 2 módulos MSSP en el mismo micro con C18
Publicado por: Thulsa Doom en 16 de Marzo de 2015, 09:10:15
Hola a todos, ¿nadie me puede orientar sobre el tema?.

he estado haciendo pruebas y me he dado cuenta de cosas que suceden.

Si implemento un módulo solo, por ejemplo el MSSP2 para I2C todo va perfecto, pero desde que implemente el módulo 1 (MSSP1) con el protocolo SPI pues ahí la cosa cambia.

haciendo debugger del proyecto, me he dado cuenta que en registro SSP2CON2bits.RCEN que hay que ponerlo a 1 para que empiece el protocolo I2C a funcionar no lo cambia. el programa llega hasta esta sentencia pasa por encima pero no cambia en el registro del micro, ¿alguien tiene alguna idea de por qué?
Título: Re: Dudas con 2 módulos MSSP en el mismo micro con C18
Publicado por: KILLERJC en 16 de Marzo de 2015, 14:05:24
Si no, inicializalos a mano, cambiando los registros y luego lo manejas con las librerias.
Título: Re: Dudas con 2 módulos MSSP en el mismo micro con C18
Publicado por: Thulsa Doom en 16 de Marzo de 2015, 16:12:14
Pues he hecho lo que me dices y nada, cuando llega a esta sentencia

Código: [Seleccionar]
SSP2CON2bits.RCEN = 1;           // enable master for 1 byte reception
para por encima y no cambia el bit en el registro y luego se queda en esta esperando

 
Código: [Seleccionar]
while ( !SSP2STATbits.BF );      // wait until byte received
No sé si será un bug del c18 pero ya me está rayando no se que hacer para solucinarlo
Título: Re: Dudas con 2 módulos MSSP en el mismo micro con C18
Publicado por: KILLERJC en 16 de Marzo de 2015, 22:24:13
Disculpa se me complica al no ver toda la configuracion de ambos, aunque no creo que ayude en mucho, pero esto dice sobre el RCEN

If the I2C module is active, these bits may not be set (no spooling) and the SSPxBUF may not be written (or writes to the SSPxBUF are disabled).

Podrias usar para pollear el flag de interrupcion.
PIR3 SSP2IF: Master Synchronous Serial Port 2 Interrupt Flag bit
1 = The transmission/reception is complete (must be cleared in software)


El PORTC tiene el MSSP1
y PORTD el MSSP2

Estuve revisando y si usas de la libreria:

OpenSPI1(unsigned char sync_mode, unsigned char bus_mode, unsigned char smp_phase) y OpenI2C2(unsigned char sync_mode, unsigned char slew)

No te activa ambos ? y te olvidas de andar configurandolos por vos mismo?
Y otra de las cosas, mira el codigo de leer el registro usando en la funcion ReadSPI1, se basa en el flag:

Código: C
  1. unsigned char ReadSPI1( void )
  2. {
  3.   unsigned char TempVar;
  4.   TempVar = SSP1BUF;       //Clear BF
  5.   PIR1bits.SSP1IF = 0;     //Clear interrupt flag
  6.   SSP1BUF = 0x00;          // initiate bus cycle
  7.   //while ( !SSP1STATbits.BF );                // wait until cycle complete
  8.   while(!PIR1bits.SSP1IF); //wait until cycle complete
  9.   return ( SSP1BUF );      // return with byte read
  10. }

Pero el de I2C en el bit BF :/
Título: Re: Dudas con 2 módulos MSSP en el mismo micro con C18
Publicado por: Thulsa Doom en 17 de Marzo de 2015, 12:07:23
Hola, esas sentencias que has puesto no son las mismas de mi driver i2c que viene por defecto el el c18 v3.47

la que tengo yo es esta:

Código: [Seleccionar]
#if defined (I2C_V3) || defined (I2C_V6) || defined (I2C_V6_1)
unsigned char ReadI2C2( void )
{

if( ((SSP2CON1&0x0F)==0x08) || ((SSP2CON1&0x0F)==0x0B) ) //master mode only
  SSP2CON2bits.RCEN = 1;           // enable master for 1 byte reception
  while ( !SSP2STATbits.BF );      // wait until byte received 
  return ( SSP2BUF );              // return with read byte
}
#endif
No sé de donde has sacado esa función, de todas maneras la he probado y me da error de compilación

Estoy implementado en el MSSP1 el protocolo SPI y en el MSSP2 el protocolo I2C.

Estoy utilizando las librerías TCP/IP de microchip y quiero meterle un termómetro digital en el MSSP2 ya que el 1 está la memoria 25LC1024 y el EMC28J60

Una de las cosas que he hecho es montar un proyecto nuevo con solo estos dos protocolos implementados tal como dije y que lea el termómetro y lea la memoria y después de unos enganches ahora ya funciona.

Paso esas mismas librerías del proyecto de prueba al proyecto TCP/IP y al principio no funcionaba.

(esto es un poco lioso voy a procurar ser lo más claro posible)

mientras corría el proyecto en modo debugger para ver los valores de los registros y de los puertos, observé que cuando llegaba a la sentencia de estarti2c2, no activaba el bit SSP2CON2bits.SEN = 1;, así como restart12c2 (SSP2CON2bits.RSEN = 1; ), ReadI2C2 (SSP2CON2bits.RCEN = 1;) y StopI2C2(SSP2CON2bits.PEN = 1;) , la flecha verde pasaba por encima pero el bit no cambiaba en el registro, lo que hice fue saque esa sentencia de la función y la puse directamente en el driver del dispositivo y empezó a funcionar pero no del todo bien, (ahora lo explico).

una vez que empezó a funcionar le saque esas sentencias y les dejé las originales de la librería y para mi sorpresa seguía trabajando bien.

ahora lo que hace es que no lee el dato del termómetro, el dato que sale es todo 1, ósea 1111111, mirando los registros del puerto D el bit SLC2 (D6) si cambia de estado pero el SDA2 (D5) no cambia, está siempre a 1 cosa que en el proyecto de prueba que hice anteriormente si cambia y lee bien el valor.

Por todo ello pienso que este compilador tiene algún bug relacionado con esto porque no se comporta de un modo lógico si no errático y ahí ya no sé como lo puedo solucionar
Título: Re: Dudas con 2 módulos MSSP en el mismo micro con C18
Publicado por: KILLERJC en 17 de Marzo de 2015, 17:23:40
Perdon la funcion es del SPI, La del I2C es la misma que pasaste vos

Citar
mientras corría el proyecto en modo debugger para ver los valores de los registros y de los puertos, observé que cuando llegaba a la sentencia de estarti2c2, no activaba el bit SSP2CON2bits.SEN = 1;, así como restart12c2 (SSP2CON2bits.RSEN = 1; ), ReadI2C2 (SSP2CON2bits.RCEN = 1;) y StopI2C2(SSP2CON2bits.PEN = 1;) , la flecha verde pasaba por encima pero el bit no cambiaba en el registro, lo que hice fue saque esa sentencia de la función y la puse directamente en el driver del dispositivo y empezó a funcionar pero no del todo bien, (ahora lo explico).

El Start/Stop bit se limpia por HW, asi que imagino que cuando manda el bit de start es tan rapido que el mismo HW lo pone a 0.

RCEN: Receive Enable bit (Master Receive mode only)(2)
1 = Enables Receive mode for I2C
0 = Receive Idle

PEN: Stop Condition Enable bit(2)
1 = Initiates Stop condition on SDAx and SCLx pins. Automatically cleared by hardware.
0 = Stop condition Idle

Y el otro es igual.

(2): If the I2C module is active, these bits may not be set (no spooling) and the SSPxBUF may not be written (or writes to the SSPxBUF are disabled).

No se a que se refiere con activo. imagino que debe ser si esta mandando algo, y ante eso no cambiaria
Título: Re: Dudas con 2 módulos MSSP en el mismo micro con C18
Publicado por: Thulsa Doom en 17 de Marzo de 2015, 19:35:41
Aaaa vale, perdón por no fijarme  :oops:

Todas esas pruebas las hago en modo debugger con un ICD3 que puedo para el proceso en el momento que quiera por muy rápido que sea el micro.
he comparado los estados de los registros en el proyecto que si que funciona y en el que no funciona, y en el que funciona los registros se ponen a 1 y a 0 según como dice el protocolo de comunicación y cómo dice el datasheet.

por eso comento que cuando el programa llega a la parte donde el registro se pone a 1 no sé que pasa que no hace caso a la orden y no lo pone, como dije antes lo comparo con el  proyecto que si que funciona y ahí si que cambia de estado como debería de ser.

por eso comento que no sé si será un bug del compilador o algo.

a lo que me con activo, es cuando el registro por ejemplo el SSP2CON2bits.RSEN está a 0 y pasa a 1

esto me está agotando la paciencia llevo ya como una semana con esto y lo que no quiero es tener que implementarlo por software cuando tengo un micro que es una bestia con dos módulos MSSP y que solo puedo utilizar uno porque hay algo que me impide implementarlo.

el mismo datasheet del fabricante dice que son módulos independientes... la verdad es que no lo entiendo  :8} :8} :huh:
Título: Re: Dudas con 2 módulos MSSP en el mismo micro con C18
Publicado por: KILLERJC en 17 de Marzo de 2015, 21:03:10
Si son modulos independientes, lo unico que puedo llegar a notar distinto si es que lo configuraste a mano ( es decir modificando los registros ) y no con el API, es que lo estes configurando mal o se te escape algun bit.

Por eso mismo te decia que probes iniciando los modulos con la API

OpenSPI1(unsigned char sync_mode, unsigned char bus_mode, unsigned char smp_phase)
y
OpenI2C2(unsigned char sync_mode, unsigned char slew)

En ese caso la primer funcion hace uso del Puerto C y la segunda del puerto D, a su ves utiliza los registros 1 y 2 , es lo unico que cambia entre en 1 y 2 ... nada mas.
Título: Re: Dudas con 2 módulos MSSP en el mismo micro con C18
Publicado por: Thulsa Doom en 18 de Marzo de 2015, 04:56:30
Si lo he configurado con el API y a mano y el resultado es el mismo, la configuración no es el problema, se configura bien con cualquiera de los dos métodos, el problema es a la hora de la ejecución del protocolo que no cambian el valor del registro de por ejemplo el star, al no cambiar ese registro pues la comunicación no se inicia y se pilla.

si quieren puedo subir unas capturas de pantalla tanto del proyecto que funciona como del que no para que vean a lo que me refiero.

¿en serio que nadie ha tenido problemas con esto?, a que voy ha ser el único  :5]  :8} :8} :8}
Título: Re: Dudas con 2 módulos MSSP en el mismo micro con C18
Publicado por: KILLERJC en 18 de Marzo de 2015, 05:55:29
Lo raro es que en un proyecto te funciona y en el otro no e.e,, no se que decirte ya :/
Título: Re: Dudas con 2 módulos MSSP en el mismo micro con C18
Publicado por: Thulsa Doom en 18 de Marzo de 2015, 06:46:08
Ya, esto me recuerda mucho a cuando intentas implementar el protocolo I2C por software y con el MPLAB IDE, aunque le digas al compilador que quieres utilizar unos pines determinados el va a lo suyo y no los cambia, pilla los de por defecto siempre hasta que de buenas a primera va y los pilla.

Cambias de ID y utilizas el MPLABX y pilla los pines que has cambiado a la primera  :shock:

El problema es que no veo una salida ha esto ya que si es problema del compilador + IDE ahí ya no puede uno hacer nada.

por eso preguntaba por si al utilizar los dos módulos en protocolos diferentes habría que hacer alguna tontería más o algo pero como leo en el datasheet que son independientes ya no sé que más puedo hacer
Título: Re: Dudas con 2 módulos MSSP en el mismo micro con C18
Publicado por: KILLERJC en 18 de Marzo de 2015, 07:19:33
El datasheet dice que son independientes, la unica solucion que quedaria es ver el ASM generado, e intentar el ejemplo mas simple de todos
Título: Re: Dudas con 2 módulos MSSP en el mismo micro con C18
Publicado por: Thulsa Doom en 18 de Marzo de 2015, 08:19:10
Ufff ahí ya me pierdo en ASM no estoy muy puesto  :oops:
Título: Re: Dudas con 2 módulos MSSP en el mismo micro con C18
Publicado por: Thulsa Doom en 20 de Marzo de 2015, 16:09:10
Hola de nuevo a todos.....

Pues no me pregunten ni por qué ni cómo pero ya está funcionando el protocolo I2C tanto por hardware como por software.

al igual será porque agregué el .lkr al proyecto, no lo tenía, los proyectos demos que viene con la librería no lo trae, lo añadí al proyecto y a la cola de archivos de el MPLAB y ya funciona.  :-/ :-/ :-/ :-/ :-/

La verdad que me quedo así  :shock:
Título: Re: Dudas con 2 módulos MSSP en el mismo micro con C18
Publicado por: Thulsa Doom en 26 de Marzo de 2015, 06:47:34
Pues no está solucionado  :5]

Ya sé de donde viene el problema pero no sé como solucionarlo.

El problema está en el microcontrolador en los pines D5 (SDA2) y D6 (SCL2), resulta que están como muy sensibles y le afecta cualquier cosa que le pongas, ya sea un osciloscópio o un analizador lógico, he probado a cambiarle las resistencias de 10K a 4,7K y a 100K y con las mejores que funciona, cuando funciona es con las de 10K.

He probado colocando unos condensadores de 0,1uf de filtros y no van bien.

He probado a alimentar la sonda con 5v y poner resistencias de pull up de 10k en los pines con el micro, según el datasheet esta entradas son digitales y toleran hasta 5.5v y nada.

Estoy pensando que hay algún parámetro que se me escapa en la configuración del micro porque no puede ser que sean tan sensibles esos pines, nunca me ha pasado eso en otros micros.

He probado con dos 18F67J50 diferentes con el mismo resultado
Título: Re: Dudas con 2 módulos MSSP en el mismo micro con C18
Publicado por: KILLERJC en 26 de Marzo de 2015, 07:20:19
Problemas del micro ?

http://ww1.microchip.com/downloads/en/DeviceDoc/80000481B.pdf
Título: Re: Dudas con 2 módulos MSSP en el mismo micro con C18
Publicado por: Thulsa Doom en 26 de Marzo de 2015, 08:28:53
Pues creo que por ahí van los tiros.

Esto es lo que me pone el MPLAB en la ventada del ICD2 según dice el documento que haga

Código: [Seleccionar]
Connecting to MPLAB ICD 2
...Connected
Setting Vdd source to target
Target Device PIC18F67J50 found, revision = Rev 0x3
...Reading ICD Product ID
Running ICD Self Test
...Passed
MPLAB ICD 2 ready for next operation

Según pone el documento el ID 3h es uno de los implicados y según la ventana pone esa versión.

Ahora la manera de resolverlo no lo entiendo muy bien, ¿me echas una mano?, lo que estoy usando es el protocolo SPI en el MSSP1 y el protocolo I2C en el MSSP2
Título: Re: Dudas con 2 módulos MSSP en el mismo micro con C18
Publicado por: KILLERJC en 26 de Marzo de 2015, 09:41:10
En fin no veo que pueda ser xD

Sobre I2C(master):

Dice que si el esclavo llega a mantener la señal de clock en bajo por X motivo (clock streching) , el primer pulso que salga del micro puede ser muy angosto y perder un ciclo el esclavo.
Solucion: ninguna xD, solo rogar que el esclavo no realize eso.

De todas formas esto seria el caso de que no recibiera bien las cosas el esclavo.

Y nada mas sobre I2C (en modo maestro), los demas problemas son de SPI y que deberian afectar a ese modulo nomas
Y si lo tenes como esclavo es habilitar el clock streching (SSPxCON2.SEN) antes de recibir algo y leer rapidamente el buffer antes que llegue otro dato.

Asi que volvemos a donde empezaste, es decir Hardware.
Título: Re: Dudas con 2 módulos MSSP en el mismo micro con C18
Publicado por: Thulsa Doom en 26 de Marzo de 2015, 10:55:17
Pues creo que voy a tener que cambiar de micro, este me hace cosas raras hasta el i2c por software, voy a utilizar un 18F97J60, a ver que tal, vaya con esto me lleva ya casi un mes con esto  :8}
Título: Re: Dudas con 2 módulos MSSP en el mismo micro con C18
Publicado por: Thulsa Doom en 31 de Marzo de 2015, 05:19:18
Sigo teniendo dudas, resulta que me he pillado un Logic Sniffer de Dangerous Prototypes y la verdad he de decir que va genial.
Pues con este analizador lógico lo que veo es que tanto por software como por hardware la primera lectura que hace la hace bien pero las siguientes la frecuencia se dispara y ya se sale del rango de trabajo del protocolo, no tengo ni idea de como solucinarlo  :oops:
Título: Re: Dudas con 2 módulos MSSP en el mismo micro con C18
Publicado por: KILLERJC en 31 de Marzo de 2015, 07:08:11
Probaste con otra cosa dispositivo i2C o fuera del lugar donde esta?

Sino de ultima es postear en el foro de microchip
Título: Re: Dudas con 2 módulos MSSP en el mismo micro con C18
Publicado por: Thulsa Doom en 31 de Marzo de 2015, 10:31:42
Lo pregunté pero nadie sabe, a ver si con estas fotos al igual lo ven más claro


Esta captura es de la configuración del dispositivo cuando arranca el prototipo, al parecer está bien, i2C está implementado por hardware
(http://www.todopic.com.ar/foros/imgtiny/35cgyup.png)

(http://www.todopic.com.ar/foros/imgtiny/acv58p.png)

Esta captura es de cuando ya está en marcha el prototipo y va ha hacer una lectura de la temperatura, se queda pillado nada más empezar porque la velociada es demasiado alta y se sale fuera de la velocidad estándar del protocolo
(http://www.todopic.com.ar/foros/imgtiny/10xzds4.png)

(http://www.todopic.com.ar/foros/imgtiny/213eqfm.png)
Título: Re: Dudas con 2 módulos MSSP en el mismo micro con C18
Publicado por: Thulsa Doom en 01 de Abril de 2015, 09:42:54
Bueno pues creo que ya lo he solucionado.
es configurando el registro SSP2ADD, según el microcontrolador hay unos valores para el BAUD RATE yo le he puesto 0x18 y parece que va, no me está midiendo pero por lo menos no me da errores el bus

Al iniciar el dispositivo.
(http://www.todopic.com.ar/foros/imgtiny/a0i97p.png)

Protocolo
(http://www.todopic.com.ar/foros/imgtiny/rwm3y9.png)

Captura con el dispositivo funcionando a pleno rendimiento
(http://www.todopic.com.ar/foros/imgtiny/orma2o.png)

Protocolo
(http://www.todopic.com.ar/foros/imgtiny/2j104uq.png)

Se ve que la frecuencia se eleva mucho más que al inicio pero como el registro SSP2ADD está configurado para 400KHz pues no se eleva como antes
Título: Re: Dudas con 2 módulos MSSP en el mismo micro con C18
Publicado por: KILLERJC en 01 de Abril de 2015, 10:01:38
Bueno por fin lo encontraste, lo raro que no recuerdo haber visto ningun registro con ese nombre xD
Título: Re: Dudas con 2 módulos MSSP en el mismo micro con C18
Publicado por: MGLSOFT en 01 de Abril de 2015, 10:03:27
Que herramienta es la que muestras en los gráficos??
Título: Re: Dudas con 2 módulos MSSP en el mismo micro con C18
Publicado por: Thulsa Doom en 01 de Abril de 2015, 10:50:49
Es un logis sniffer de Dangerous Prototypes, este es el enlace

http://dangerousprototypes.com/docs/Hardware_design_overview

yo lo compré en alixpress.

Es open sources y actualizan el producto a menudo, trabaja con muchos protocolos como uart, i2c, spi, DMX512, JTAG, etc etc....

va genial, sin esto no habría descubierto el problema, he de decir que también me dieron la idea en los foros de microchip  :)

No voy a poner en el anuncio del post que está resuelto hasta que no esté seguro de que ese era el problema
Título: Re: Dudas con 2 módulos MSSP en el mismo micro con C18
Publicado por: Thulsa Doom en 06 de Abril de 2015, 04:49:09
Pues doy por concluido el tema, modificando el registro SSP2ADD se soluciona el problema, gracias a todos por la ayuda  :-/ :-/ :-/