Autor Tema: "Cosas" que no hace CCS  (Leído 4003 veces)

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

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
"Cosas" que no hace CCS
« en: 05 de Abril de 2009, 17:45:29 »
Inauguro este hilo que espero sea de utilidad a los programadores de CCS.

En el mismo podremos poner aquellas funciones, trucos o procedimientos que se necesitan cuando se trabaja con un PIC y que no están incorporados en ninguna función del compilador.

Y para comenzar,

CONTROL DEL BIT DE OVERFLOW EN UNA COMUNICACIÓN I2C SLAVE
Cuando construimos un dispositivo esclavo de un bus I2C con un PIC, es muy útil utilizar la función #use I2C configurándola adecuadamente. Esta función en modo SLAVE sólo funciona sobre los pines dedicados del micro, y no puede ser emulada por software en pines diferentes.

Me ha ocurrido que mi dispositivo SLAVE funcionaba perfectamente cuando la comunicación I2C no era muy exigente, pero se quedaba colgado cuando el volumen de datos del bus era muy alto.

Por más que he mirado en la ayuda de CCS no he sido capaz de encontrar la solución.
Y como siempre, la solución estaba en: la datasheet.

SSPOV: Receive Overflow Indicator bit
SPI Slave mode:
1 = A new byte is received while the SSPBUF register is still holding the previous data. In case
of overflow, the data in SSPSR is lost. Overflow can only occur in Slave mode. The user
must read the SSPBUF, even if only transmitting data, to avoid setting overflow (must be
cleared in software).
0 = No overflow
Note: In Master mode, the overflow bit is not set since each new reception (and
transmission) is initiated by writing to the SSPBUF register.


Para mi sorpresa, el bit de Overflow no existe en las funciones I2C de CCS, así que me tocó gestionarlo a pelo:

SOLUCIÓN
#byte SSPCON1=0xFC6
#bit  SSPOV=SSPCON1.6

Y dentro de la interrupción #int_ssp

if (SSPOV){ // Bit de overflow
         SSPOV=0;
         ...proceso...
      }

Desconectado ALE1973

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 229
Re: "Cosas" que no hace CCS
« Respuesta #1 en: 12 de Mayo de 2009, 00:09:00 »
Hola, interesante aporte, arme hace tiempo un prototipo en el que uso una comunicacion SPI con un 16f873, con los siguientes pines para la comunicacion.

SDI=RC4
SDO=RC5
SCK=RC3
Esta rutina anda perfectamente, en el CCS (que es el que estoy usando), puse #use spi(FORCE_SW, BITS=8) para configurar la comunicacion, como dije antes anda excelente, ahora resulta que el micro me quedo chico, y me mude a un 18f2550, que es de la misma cantidad de pines, cambie el pin RC3 del clock, por el RC2, y configure el spi de la siguiente forma #use spi(FORCE_SW, BITS=8,DI=pin_c4,DO=pin_c5,CLK=pin_c2),
pero no hay forma de que funcione, los pines RC4 y RC5 son los que se usan para USB, es posible que no funcione el SPI por software debido a esto?

Gracias.
Saludos.

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: "Cosas" que no hace CCS
« Respuesta #2 en: 12 de Mayo de 2009, 01:47:51 »
El SPI por software sólo funciona en modo master, no furula en modo slave.

Desconectado jeremylf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1341
Re: "Cosas" que no hace CCS
« Respuesta #3 en: 12 de Mayo de 2009, 02:21:31 »
No sabia que no se podia usar I2C o SPI en modo slave por software. Gracias por la info, la tendre muy encuenta para futuros proyectos, aunq pienso que en alguna version nueva arreglaran eso, digo no? =D

Por otro lado, que yo sepa, los pines C4 y C5 del 18f2550, si los quieres usar como IO's, solo funcionan como entradas digitales. Aparte, has de cambiar algun fusible, si no me equivoco, para deshabilitar el usb.

Salu2.

Desconectado ALE1973

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 229
Re: "Cosas" que no hace CCS
« Respuesta #4 en: 12 de Mayo de 2009, 08:05:19 »
Asi es Manolo, en modo master quiero utilizarlo, jeremylf voy a leer nuevamente la datasheet, no recuerdo haber leido que RC5y RC4 eran solo entradas analogicas..

Gracias.
Saludos.
Alejandro.

Desconectado PICPOWER

  • PIC10
  • *
  • Mensajes: 17
Re: "Cosas" que no hace CCS
« Respuesta #5 en: 14 de Julio de 2009, 15:55:10 »
Mmmhhh... otra cosa que tampoco he encontrado en el CCS es la inversión en el edge de CLK en el modo MASTER de comunicación serial síncrona a 9 bits. Pero el Datasheet muestra que esto existe. Estoy a punto de probar una inserción al código que haría esta modificación. Debo decir que esto lo necesito para un DAC de 18 bits. Ah, y agregar que es para un 16F886, ya que por ahí vi que alguien usa un "INVERT" para invertir el edge en algún otro microcontrolador.

Si alguien sabe cómo hacer esto desde el compilador de manera automática, se los agradeceré.

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: "Cosas" que no hace CCS
« Respuesta #6 en: 14 de Julio de 2009, 16:15:45 »
¿No te sirven estos parámetros del comando #use SPI?

MODE=n
 The mode to put the SPI bus.
 
The MODE option is more or less a quick way to specify how the stream is going to sample data. MODE=0 sets IDLE=0 and SAMPLE_RISE. MODE=1 sets IDLE=0 and SAMPLE_FALL. MODE=2 sets IDLE=1 and SAMPLE_FALL. MODE=3 sets IDLE=1 and SAMPLE_RISE. There are only these 4 MODEs.

SAMPLE_RISE
 Sample on rising edge.
 
SAMPLE_FALL
 Sample on falling edge (default).

 

Desconectado PICPOWER

  • PIC10
  • *
  • Mensajes: 17
Re: "Cosas" que no hace CCS
« Respuesta #7 en: 14 de Julio de 2009, 20:56:28 »
Hola Nocturno. Gracias por la ayuda. Pero eso es para SPI, yo estoy usando la UART en modo: Master, síncrono, sin paridad, a 9 bits y quisiera usarla a "Rising Edge", en vez de "Falling Edge", que es como el CCS saca la comunicación.

Y ya que tengo tu atención, permíteme abusar de tus conocimientos (jeje) y preguntarte por qué en la siguiente línea

#use rs232(baud=100k,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=9,sync_master)

(...) si quito rcv=PIN_C7 me marca error. Si ni siquiera usaré rcv, de hecho rcv se vuelve CLK del serial síncrono. Volviendo al problema inicial, probé usando "INVERT", de la siguiente manera:

#use rs232(baud=100k,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=9,sync_master, INVERT)

... y el error obtenido es:

*** Error 100 "Modulo18bitsI2c.c" Line 10(5,110): USE parameter value is out of range   H/W USART can not invert
*** Error 132 "Modulo18bitsI2c.c" Line 62(13,17): STDOUT not defined (may be missing #USE RS232)  ::
*** Error 132 "Modulo18bitsI2c.c" Line 65(13,17): STDOUT not defined (may be missing #USE RS232)  ::

Así que, según el manual, puedo obtener la inversión del edge, mediante las definiciones e instrucción:

#define   SCKP   4
#byte   BAUDCTL=0x187
bit_set(BAUDCTL,SCKP);

Si alguien quiere constatar que esto que intento, existe; está en el datasheet del PIC16F886 "Figure 12-10 Synchronous Transmission" página "DS41291E - page 172"

Saludos!!!

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: "Cosas" que no hace CCS
« Respuesta #8 en: 15 de Julio de 2009, 01:22:08 »
Pues parece que tienes razón y no está implementado ningún comando que te active ese bit.