TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Enigma en 02 de Septiembre de 2009, 21:09:45

Título: Un ejemplo con SPI por favor.
Publicado por: Enigma en 02 de Septiembre de 2009, 21:09:45
Hola, que tal muchachos?? Será que uno de ustedes me puede prestar un ejemplo en C con el uso del SPI y sus lineas, SDI, SDO y SCK?? es que nunca he trabajado con este tipo de comunicación... y Bueno no se usar sus instrucciones en C, he leído el datasheet del micro (16f88) y bueno me he informado de eso un poco, pero no logro saber como usar las instrucciones a la hora de programarlo, ya que pretendo hacer una comunicación con un conversor digital/analógico y bueno funciona con este protocolo!!!!

Le agradezco su aporte!

Atte: Enigma... La llanerita de Guayana :D
Título: Re: Un ejemplo con SPI por favor.
Publicado por: MGLSOFT en 02 de Septiembre de 2009, 21:12:56
Cual conversor A/D usas??
Has visto los ejemplos del compilador??
Título: Re: Un ejemplo con SPI por favor.
Publicado por: Enigma en 03 de Septiembre de 2009, 00:20:58
Estoy usando el TLC5615.... y si los he visto, pero no he encontrado uno que e adapte a mis necesidades!!!! Alguno con el que me pueda guiar!

Atte: Enigma... La llanerita de Guayana :D
Título: Re: Un ejemplo con SPI por favor.
Publicado por: MGLSOFT en 03 de Septiembre de 2009, 08:43:14
Creo que deberías desarrollar una librería, asi te queda hecha y despues la compartes, je..je..

Aquí el PDF del conversor:  http://focus.ti.com/lit/ds/symlink/tlc5615.pdf (http://focus.ti.com/lit/ds/symlink/tlc5615.pdf)

Y aquí tienes el diagrama de bloques.

(http://img134.imageshack.us/img134/4550/tlc5615diagram.jpg)

El esquema de tiempos para la comunicación SPI...

(http://img136.imageshack.us/img136/8463/tlc5615timingdiagram.jpg)

Y que se debe tener en cuenta para realizarla...

(http://img405.imageshack.us/img405/8210/tlc5615spiinterfase.jpg)

Por ultimo, la única referencia encontrada sobre DACs en el foro de CCS... :mrgreen:

http://www.ccsinfo.com/forum/viewtopic.php?t=26055&highlight=tlc5615 (http://www.ccsinfo.com/forum/viewtopic.php?t=26055&highlight=tlc5615)

Ya vi que Proteus lo trae, si vas poniendo aqui tus avances, es muy posible que pudiéramos ayudarte a desarrollarlo...

Saludos!! :mrgreen:
Título: Re: Un ejemplo con SPI por favor.
Publicado por: Enigma en 03 de Septiembre de 2009, 16:26:07
Si ya me he leído eso, pero lo que me frega son las instrucciones en C... Una pregunta, Las instrucciones del SPI son la mismas que el I2C??, solo que n vez de usar I2C, coloco el SPI...??

Atte: Enigma... La llanerita de Guayana  :D
Título: Re: Un ejemplo con SPI por favor.
Publicado por: MGLSOFT en 03 de Septiembre de 2009, 17:10:45
Hay una ventaja en SPI, puedes hacerlo por software y adaptarlo a tu velocidad, si no tienes los pines de hardware libres, o si el dato es mayor a 8 bits te conviene esa forma.

Sugiero que mires la libreria del MCP3208 y su hoja de datos, alli veras seguramente la luz... :mrgreen:
Título: Re: Un ejemplo con SPI por favor.
Publicado por: Suky en 03 de Septiembre de 2009, 17:45:10
Para saber que funciones debes utilizar revisa la ayuda de CCS <F12>  :mrgreen:

Por ejemplo para configurar los pines, modo, si es por software, etc... se utiliza #USE SPI:

Ejemplo:
Código: C
  1. #use spi(MASTER,CLK=PIN_C3, DO=PIN_C5, DI=PIN_C4, BITS=8, MODE=3, FORCE_HW, stream=BUSSPI)

Para fijar la velocidad:
Código: C
  1. setup_spi(SPI_CLK_DIV_64);

Para recibir y enviar dato:

Código: C
  1. Dato_recibido=spi_xfer(BUSSPI,Dato_Enviar);

Saludos!
Título: Re: Un ejemplo con SPI por favor.
Publicado por: Enigma en 03 de Septiembre de 2009, 18:18:18
Si esa libreria la estuve revisando y berro me enrolle un poquito!!!!! Gracias Sucky por las instrucciones ahora me estoy orientando un poco!!!! y si lo voy a hacer por hardware MGLSOFT... Bueno voy a empezar con mi travesía a lo largo del mundo del SPI en C, vamos a ver que tal me va... Voy a ir posteando avances!!!

Atte: Enigma... La llanerita de Guayana :D
Título: Re: Un ejemplo con SPI por favor.
Publicado por: MGLSOFT en 03 de Septiembre de 2009, 18:55:18
En lo de hardware yo no tengo tanta experiencia, igual SPI no tiene comparación con I2C, es mucho mas flexible y rustico, con menos problemas.
Voy a seguir el tema a ver como crece, eso si deberías llevarnos informados a los curiosos!!! :D :D :D
Título: Re: Un ejemplo con SPI por favor.
Publicado por: Enigma en 03 de Septiembre de 2009, 20:59:58
Perdón me he equivocado es por software que lo voy a hacer....

Atte: Enigma... La llanerita de Guayana ;-)
Título: Re: Un ejemplo con SPI por favor.
Publicado por: Enigma en 03 de Septiembre de 2009, 21:36:52
Bueno he colocado estás instrucciones:

setup_spi(SPI_MASTER | SPI_L_TO_H | SPI_CLK_DIV_4);

#use spi(MASTER,CLK=PIN_B4, DO=PIN_B2, DI=PIN_B1, BITS=8, MODE=3, FORCE_HW, stream=BUSSPI)

y para enviar el dato al conversor he usado está instrucción...

spi_write( dato );

Donde dato es la variable que recojo del conversor analógico digital del pic, es decir:

dato=(ADC*5)/255;                  // Convierto a analógico

Ahora no estoy un poco clara con la conexión del TLC5615 con el pic...

Según el datasheet del conversor, pues

DIN    Es la entrada serial
SCLK Es la entrada serial del reloj
CS es el Chip select y se activa en bajo
DOUT es el dato de salida en serial para encadenar con otro chip
AGND La tierra analógica
REFIN Es la entrada de referncia
OUT Salida analogica de voltaje del DAC
VDD y el VCC

O.k, no se si mi conexión al pic está bien, como dije nunca he usado este protocolo.... Pero lo tengo conectado de está manera:

SCLK del conversor, al CLK del pic.
 CS  del conversor a tierra.
DIN  a SDO del pic....

Ahora el SDI del pic no se conecta=???

Bueno lo tengo así y pues mido la salida del conversor (OUT), que deberia estar en analógica, y pues no sale nada de nada!!!!! está en cero!

El REFIN lo tengo a tierra!!

Que cosa estoy haciendo mal o que burrada estoy haciendo???

Atte: Enigma... La llanerita de Guayana  ;-)

Título: Re: Un ejemplo con SPI por favor.
Publicado por: MLO__ en 03 de Septiembre de 2009, 23:04:52
Hola.

Si usas el SPI por software, no debes configurarlo con la función setup_spi(), ya que ésta última es para configurar el módulo SPI siempre y cuando el PIC  lo posea.

El pin del PIC que mencionas, si no lo configuras y  no lo necesitas, pues, no lo conectas. Yo he usado ese pin para habiltar o deshabilitar el dispositivo.

Saludos
Título: Re: Un ejemplo con SPI por favor.
Publicado por: Suky en 03 de Septiembre de 2009, 23:05:59
Sube un esquemático para ver como estas haciendo bien las conexiones, pero seria así:

PIC                Conversor

SCL                SCL
SDI                SDO
SDO               SDI
PIN_CS          CS


Después, si colocas stream=BUSSPI usa spi_xfer para enviar y recibir el dato  ;-)
Título: Re: Un ejemplo con SPI por favor.
Publicado por: Enigma en 03 de Septiembre de 2009, 23:24:17
Ahhh o.k, gracias por la aclaración MLO_ no sabia que el pin SDI funcionaba dandole valor de estado!!!!

 Lo que pasa Sucky es que enl conversor no tiene ni SDI ni SDO, por eso estoy confundida!!!!

Aquí está el diagrama!

(http://img40.imageshack.us/img40/6477/dibujoyo.jpg)



Ya va sucky disculpame el no entender esto, de verdad, es que he leido tantas cosas que ya estoy que se me cruzan todas las instrucciones... el stream=BUSSPI usa spi_xfer para enviar y recibir el dato , es decir, uso esto en ves del write_spi(dato);


Atte: Enigma... La llanerita de Guayana ;-)
Título: Re: Un ejemplo con SPI por favor.
Publicado por: MLO__ en 04 de Septiembre de 2009, 00:18:05
Hola.

Mira, por ejemplo, la conexión de un LTC con el PIC via SPI:

(http://img231.imageshack.us/img231/7591/spiltc.png)

Con esos tres pines se configura toda la comunicación SPI del dispositivo.

Saludos
Título: Re: Un ejemplo con SPI por favor.
Publicado por: Enigma en 04 de Septiembre de 2009, 00:35:13
Ummm bueno así lo tengo conectado!!!! pero igual no me funciona!

PIC                Conversor
SCK               SCLK
SDI                Sin conectar
SDO                DIN

Atte: Enigma... La llanerita de Guayana  ;-)
Título: Re: Un ejemplo con SPI por favor.
Publicado por: cerebro en 04 de Septiembre de 2009, 00:47:52
 :shock: es por software o por hardware??

si es por soft lo que esta marcado con rojo esta de más...

#use spi(MASTER,CLK=PIN_B4, DO=PIN_B2, DI=PIN_B1, BITS=8, MODE=3, FORCE_HW, stream=BUSSPI)

y si es por hard

creo que no es necesario ese

#use spi

y utilizar el

setup_spi

Título: Re: Un ejemplo con SPI por favor.
Publicado por: MGLSOFT en 04 de Septiembre de 2009, 08:12:20
Citar
y para enviar el dato al conversor he usado está instrucción...

spi_write( dato );

Donde dato es la variable que recojo del conversor analógico digital del pic, es decir:

dato=(ADC*5)/255;                  // Convierto a analógico

Creo que hay un error aquí...

Si yo no entiendo mal, ese es un conversor D/A.
Por lo tanto deberías primero convertir tu valor en la palabra dato y recién después enviarla.
Por lo que entiendo ese conversor no se lee, solo se escribe por SPI.
Título: Re: Un ejemplo con SPI por favor.
Publicado por: Suky en 04 de Septiembre de 2009, 10:03:09
:shock: es por software o por hardware??

si es por soft lo que esta marcado con rojo esta de más...

#use spi(MASTER,CLK=PIN_B4, DO=PIN_B2, DI=PIN_B1, BITS=8, MODE=3, FORCE_HW, stream=BUSSPI)

y si es por hard

creo que no es necesario ese

#use spi

y utilizar el

setup_spi


No, indica que debe ser por software, en ese caso debe cambiarlo por FORCE_SW
Título: Re: Un ejemplo con SPI por favor.
Publicado por: Enigma en 04 de Septiembre de 2009, 14:57:42
Ya va pero s lo hago por hardware, porque no es necesario la instrucción:

#use spi(MASTER,CLK=PIN_B4, DO=PIN_B2, DI=PIN_B1, BITS=8, MODE=3, FORCE_HW, stream=BUSSPI)

Con está instrucción no debo definir los pines que me van a hacer la comunicación...??? Ayyy estoy confundida.... :?


Si MGLSOFT tienes razón.... debo convertirlo!!!!

Y bueno ya hice eso y nada....  :(

Será que este conversor no se simula en proteus??... Porque creo que la conexión del dispositivo está bien...

Ahora he visto algo, el CLK siempre se mantiene en bajo.... este no ebria oscilar entre bajo y alto??? Y SDO siempre está en alto!!!!

Atte: Enigma... La llanerita de Guayana   ;-)
Título: Re: Un ejemplo con SPI por favor.
Publicado por: cerebro en 04 de Septiembre de 2009, 16:16:53
 :?
 vamos desde el principio y recurrimos a la fuente de sabiduría infinita (la hoja de datos del micro  :lol:)

copio y pego tal cual la pagina 89

Código: [Seleccionar]
SPI mode allows 8 bits of data to be synchronously
transmitted and received simultaneously. To
accomplish communication, typically three pins are
used:
• Serial Data Out (SDO) RB2/SDO/RX/DT
• Serial Data In (SDI) RB1/SDI/SDA
• Serial Clock (SCK) RB4/SCK/SCL
Additionally, a fourth pin may be used when in a Slave
mode of operation:
• Slave Select (SS) RB5/SS/TX/CK


When initializing the SPI, several options need to be
specified. This is done by programming the appropriate
control bits in the SSPCON register (SSPCON<5:0>)
and the SSPSTAT register (SSPSTAT<7:6>). These
control bits allow the following to be specified:
• Master mode (SCK is the clock output)
• Slave mode (SCK is the clock input)
• Clock Polarity (Idle state of SCK)
• Clock Edge (output data on rising/falling
edge of SCK)
• Clock Rate (Master mode only)
• Slave Select mode (Slave mode only)

Hablemos del hardware, el micro posee un puerto serial sincrónico (SSP) que puede ser utilizado tanto en modo  SPI o en modo I2C, los pines del puerto ya están preestablecidos en su arquitectura y los detalla la hoja 89. Para utilizar el modulo faltaría configurar el puerto afectando los registros (SSPCON y SSPSTAT) eso lo hacemos en asembler o utilizamos la función setup_spi(). Las funciones que vamos a utilizar seria spi_write y spi_read.

Ahora CCS a partir de las últimas versiones ha implementado SPI por software (si vas a una versión más viejita ni siquiera existía #use spi), de manera que #use spi se utiliza para comunicación por soft osea CCS ocupa recursos e implementa la comunicación a lo bestia dentro del micro. Por eso es necesario explicarle que pines queremos nosotros que sean el clock, la entrada de datos y la salida de datos.

 También podemos usar #use spi para configurar la comunicación y forzarlo a que sea por hardware como indica el ejemplo del CCS
 
Código: [Seleccionar]
#use spi(FORCE_HW, BITS=16, stream=SPI_STREAM)

// uses hardware SPI and gives this stream the name SPI_STREAM
Aca podemos utilizar la funcion spi_xfer.

Fijate la diferencia entre SPI_READ ( o SPI_WRITE) y SPI_XFER

SPI_READ
Availability:
 This function is only available on devices with SPI hardware.

SPI_XFER
Availability:
 All devices with SPI support.

 
Pero de ninguna manera fozarlo por hard y pasarle los pines que queramos como entradas o salidas, se entiende?  :).

Saludos!!  :mrgreen:

Título: Re: Un ejemplo con SPI por favor.
Publicado por: Enigma en 04 de Septiembre de 2009, 17:22:29
Si esa parte del Datasheet me la había leído ya!!! y como tres veces cuando las instrucciones no me empezaron a funcionar en el CCS, ahora lo que tu me tratas de decir es que no es necesario que declare los pines del SPI cuando lo mando a trabajar por hardware???.... Bueno esa instrucción ya la había probado antes y pues no me funcionó en realidad no se que estoy haciendo mal en el programa vale!!!!!


Atte: Enigma... La llanerita de Guayana ;-)
Título: Re: Un ejemplo con SPI por favor.
Publicado por: Gonzalo_BlackHawk en 04 de Septiembre de 2009, 19:11:46
Preguntas para alguien que halla utilizado el SPI por SW:

¿Que velocidades de transmisión se pueden alcanzar ?
¿Requiere mucha memoria para su utilización ?
¿Cual es el límites de bytes que se pueden transmitir en un mismo envio?

El SPI por hardware es bastante rápido si se programa bien, he logrado conseguir 5 Mbps en transmisión full duplex para una frecuencia de oscilador de 20 MHz con un polling de 10 us entre bytes (Que estoy seguro que se puede bajar más). El problema del SPI por HW es que el compilador CCS lo tiene mal implementado en sus librerías , que el buffer de transmisión es de solo 1 byte y que además obviamente uno esta atado a utilizar los pines preestablecidos. Sin embargo si se tienen los pines disponibles y si se tiene ganas de crear un libreria desde cero para controlar el modulo SSP, entonces el jugo vale la exprimida.

Saludos.

Título: Re: Un ejemplo con SPI por favor.
Publicado por: Enigma en 04 de Septiembre de 2009, 21:12:27
Estás preguntando??? No entiendo!!!

Atte: Enigma... La llanerita de Guayana ;-)
Título: Re: Un ejemplo con SPI por favor.
Publicado por: MGLSOFT en 04 de Septiembre de 2009, 22:14:26
Citar
#USE SPI

--------------------------------------------------------------------------------

 

Syntax:
 #use spi  (options)

 
 
Elements:
 Options are separated by commas and may be:

MASTER
 Set the device as the master. (default)
 
SLAVE
 Set the device as the slave.
 
BAUD=n
 Target bits per second, default is as fast as possible.
 
CLOCK_HIGH=n
 High time of clock in us (not needed if BAUD= is used). (default=0)
 
CLOCK_LOW=n
 Low time of clock in us (not needed if BAUD= is used). (default=0)
 
DI=pin
 Optional pin for incoming data.
 
DO=pin
 Optional pin for outgoing data.
 
CLK=pin
 Clock pin.
 
MODE=n
 The mode to put the SPI bus.
 
ENABLE=pin
 Optional pin to be active during data transfer.
 
LOAD=pin
 Optional pin to be pulsed active after data is transferred.
 
DIAGNOSTIC=pin
 Optional pin to the set high when data is sampled.
 
SAMPLE_RISE
 Sample on rising edge.
 
SAMPLE_FALL
 Sample on falling edge (default).
 
BITS=n
 Max number of bits in a transfer. (default=32)
 
SAMPLE_COUNT=n
 Number of samples to take (uses majority vote). (default=1
 
LOAD_ACTIVE=n
 Active state for LOAD pin (0, 1).
 
ENABLE_ACTIVE=n
 Active state for ENABLE pin (0, 1). (default=0)
 
IDLE=n
 Inactive state for CLK pin (0, 1). (default=0)
 
ENABLE_DELAY=n
 Time in us to delay after ENABLE is activated. (default=0)
 
DATA_HOLD=n
 Time between data change and clock change
 
LSB_FIRST
 LSB is sent first.
 
MSB_FIRST
 MSB is sent first. (default)
 
STREAM=id
 Specify a stream name for this protocol.
 
SPI1
 Use the hardware pins for SPI Port 1
 
SPI2
 Use the hardware pins for SPI Port 2
 
FORCE_HW
 Use the pic hardware SPI.
 

 
 
Purpose:
 The SPI library contains functions to implement an SPI bus.  After setting all of the proper parameters in #use spi, the spi_xfer() function can be used to both transfer and receive data on the SPI bus.

 

The SPI1 and SPI2 options will use the SPI hardware onboard the PIC. The most common pins present on hardware SPI are: DI, DO, and CLK. These pins don’t need to be assigned values through the options; the compiler will automatically assign hardware-specific values to these pins. Consult your PIC’s data sheet as to where the pins for hardware SPI are. If hardware SPI is not used, then software SPI will be used. Software SPI is much slower than hardware SPI, but software SPI can use any pins to transfer and receive data other than just the pins tied to the PIC’s hardware SPI pins.

 

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.

 

SPI cannot use the same pins for DI and DO.  If needed, specify two streams: one to send data and another to receive data.

 

The pins must be specified with DI, DO, CLK or SPIx, all other options are defaulted as indicated above.
 
Examples:
 #use spi(DI=PIN_B1, DO=PIN_B0, CLK=PIN_B2, ENABLE=PIN_B4, BITS=16)

// uses software SPI

 

#use spi(FORCE_HW, BITS=16, stream=SPI_STREAM)

// uses hardware SPI and gives this stream the name SPI_STREAM

 
/quote]

Esta es la definicion de Use_SPI
Saquen sus conclusiones... :mrgreen:
Título: Re: Un ejemplo con SPI por favor.
Publicado por: Gonzalo_BlackHawk en 05 de Septiembre de 2009, 12:28:51
Estás preguntando??? No entiendo!!!

Atte: Enigma... La llanerita de Guayana ;-)

Si, mis dudas son acerca del SPI por SW, yo solo opino de mi experiencia con el SPI por HW.
Título: Re: Un ejemplo con SPI por favor.
Publicado por: Enigma en 05 de Septiembre de 2009, 13:04:04
Rayos he pasado toda la noche, cambiando instrucciones, leyendo tutoriales, definiciones, cambiando el programa y nada!!! He vuelto a lo mismo!!! :8} Será el proteus que no simula...? :( :8}


Atte: Enigma... La llanerita de Guayana ;-)
Título: Re: Un ejemplo con SPI por favor.
Publicado por: MLO__ en 05 de Septiembre de 2009, 22:55:11
El proteus tiene un SPI Debugger
Título: Re: Un ejemplo con SPI por favor.
Publicado por: Enigma en 06 de Septiembre de 2009, 00:28:38
Si lo se, ya lo ejecute.... y miren lo estados que me salen....

(http://img248.imageshack.us/img248/4099/dibujo1mz.jpg)


Atte: Enigma... La llanerita de Guayana ;-)
Título: Re: Un ejemplo con SPI por favor.
Publicado por: MLO__ en 06 de Septiembre de 2009, 11:34:01
Ese warn del logic contentions, refiere a los pines del SPI?
Título: Re: Un ejemplo con SPI por favor.
Publicado por: Enigma en 06 de Septiembre de 2009, 12:32:51
Ummm nop, creo que tiene que ver con la conexión de la LCD porque me dice que esa advertencia se produce cuano uno o más contenidos lógicos han ocurrido en una red especifica....

(http://img405.imageshack.us/img405/741/dibujo3ls.jpg)

Y cuando clickeo la dirección me aparece uno de los bits en donde está conectada la LCD..

(http://img197.imageshack.us/img197/6350/dibujo4s.jpg)


Atte: Enigma... La llanerita de Guayana :?
Título: Re: Un ejemplo con SPI por favor.
Publicado por: MLO__ en 06 de Septiembre de 2009, 12:40:51
Ok.

La idea del debugg del SPI sería visualizar los bytes necesarios para la configuración del dispositivo que tienes.

Por ejemplo, para una aplicación con un AD9833, necesitaba enviar los siguientes bytes de configuración: 21E8, 20E8 y C000. Estos bytes se deducen del datasheet. La idea es que lo visualizado en el SPI debugger sea igual:

(http://img142.imageshack.us/img142/8097/spiconf.png)

Del datasheet también hay que sacar ciertos parámetros para configurar el debugger:
(http://img246.imageshack.us/img246/1462/spiconf2.png)


Saludos
Título: Re: Un ejemplo con SPI por favor.
Publicado por: sycho en 06 de Septiembre de 2009, 16:14:17
Preguntas para alguien que halla utilizado el SPI por SW:

¿Que velocidades de transmisión se pueden alcanzar ?

Yo he programado rutinas de bit banging para SPI por software en C18.
La velocidad máxima que he conseguido es de unos 200kbps en un PIC18F2520 corriendo a 20MHz, pero al final he terminado utilizando velocidades de 40kbps introduciendo delays en varios puntos (hasta ahora no he tenido que programar nada crítico en cuanto a tasa binaria)
Título: Re: Un ejemplo con SPI por favor.
Publicado por: Enigma en 06 de Septiembre de 2009, 23:51:41
Pero esos bytes los enviabas por el programa, es decir, en el C le dabas instrucciones de mandar esos bytes antes de enviar los datos que querías???


Atte: Enigma... La llanerita de Guayana :?
Título: Re: Un ejemplo con SPI por favor.
Publicado por: sycho en 07 de Septiembre de 2009, 05:15:43
Pero esos bytes los enviabas por el programa, es decir, en el C le dabas instrucciones de mandar esos bytes antes de enviar los datos que querías???

No entiendo tu pregunta.

Yo hice una función que envía un máximo de 16bits seguidos, por ejemplo:
sendSPI(datos,longitud);
Título: Re: Un ejemplo con SPI por favor.
Publicado por: MLO__ en 07 de Septiembre de 2009, 13:24:40
Pero esos bytes los enviabas por el programa, es decir, en el C le dabas instrucciones de mandar esos bytes antes de enviar los datos que querías???

Si claro, los enviaba con las funciones de transmisión del SPI, esos datos eran para configurar el dispositivo.

Saludos
Título: Re: Un ejemplo con SPI por favor.
Publicado por: Enigma en 07 de Septiembre de 2009, 16:32:57
Ummm o.k.... rayos!!!!

Atte: Enigma... La llanerita de Guayana :(
Título: Re: Un ejemplo con SPI por favor.
Publicado por: Enigma en 15 de Septiembre de 2009, 18:31:35
Hola muchachos, bueno he estado trabajando en lo del SPI a ver si logro solucionar algo,
pero la verdad es que no me funciona... Ya tengo las ideas agotadas... Yo pienso que las instrucciones
del programa están bien... Por lo menos ahora estoy usando está función para enviar los datos al DAC,
pero igual no consigo enviar nada!

unsigned char SPI_Envia ( unsigned char m);

unsigned char SPI_Envia ( unsigned char m)
 {
    SSPBUF = m;    // Envia dato
    while (! BF ); // Espera a que se transmita
    return SSPBUF ;
 }


y para enviar le dato hago esto:

           set_adc_channel(0);                // Lee el canal AN0 (Señal del sensor 1)
                     delay_us(10);                      // Demora para capturar bien el dato
                     ADC=read_adc();                    // ADC=dato digital del ADC
                     dato=((float)ADC*5)/255;           // Convierto a analógico
                     //spi_write(ADC);
                     m=ADC;
                     SPI_Envia ( m );             // Envía dato
                     delay_us(200);

Me he leido el dataheet del dac a ver si hay que enviar una palabra o una dirección para habilitar el dispositivo o algo,
pero nada no me dice nada...

Coloque el SPI Debugger en el proteus y me sale la imagen que tengo en Zip...

Atte: Enigma... La llanerita de Guayana ;-)
Título: Re: Un ejemplo con SPI por favor.
Publicado por: MLO__ en 15 de Septiembre de 2009, 22:17:04
Hola.

Pues, comparándolo con el gráfico que yo postee, podría concluir que el micro no esta enviando ningún dato, solo se ven ?? ??. Pense que estabas usando la función spi_write();.

Hay que verificar también la habilitación y deshabilitación de la transmisión.

Saludos
Título: Re: Un ejemplo con SPI por favor.
Publicado por: Enigma en 16 de Septiembre de 2009, 00:21:12
Si estaba usando esa pero en vista de que no funcionaba pues empece a realizar rutinas a ver si conseguia enviar algún datico aunque sea un bitsito pero nada vale!!! :( Bueno con resecto a la habilitación de la transmisión, si está habilitada (valga la redundancia) porque el bit SSPEN del registro SSPCON, es decir el bit de habilitación lo tengo en uno (habilitado), y en proteus echo un vistazo a ese registro y en efecto me aparece habilitado... Si te das cuenta en la imagen que subi a una esquina en la parte inferior izquierda de la imagen se notan los registros en la simulación es decir a SSPSTAT y SSPCON, bueno en el segundo ese único bit activo le pertenece a SSPEN...

Atte: Enigma... La llenrita de Guayana :?
Título: Re: Un ejemplo con SPI por favor.
Publicado por: MLO__ en 16 de Septiembre de 2009, 00:50:16
Hola.

Me refiero a habilitarla por medio del pin respectivo del dispositivo SS. La rutina de envío que yo uso habilita primero la linea SS, luego uso la función spi_write(); para enviar el dato y al final, deshabilito la linea SS.

Según el datasheet, se debe configurar el IDLE en alto o bajo.

Saludos
Título: Re: Un ejemplo con SPI por favor.
Publicado por: Enigma en 16 de Septiembre de 2009, 01:15:51
Ahhh o.k entiendo tu me dices el pin de habilitación del DAC?? Bueno, ese se habilita con un cero... y bueno lo puse a tierra, es decir, habilitado siempre, como es el único dispositivo que tengo por el SPI no hay problema con una colisión... Además que los pines del micro se me agotaron...

Es eso a lo que te refieres?

Atte: Enigma... La llenrita de Guayana :?
Título: Re: Un ejemplo con SPI por favor.
Publicado por: Suky en 16 de Septiembre de 2009, 01:28:33
El siguiente ejemplo por ejemplo saca por Vout 1Volt, con REFIN = 1.5V:

Código: C
  1. #define DA_SCL PIN_B0
  2. #define DA_SDO PIN_B1
  3. #define DA_SDI PIN_B2
  4. #define DA_CS PIN_B3
  5.  
  6. #use spi(MASTER,CLK=DA_SCL, DO=DA_SDO, DI=DA_SDI, BITS=16, MODE=3, MSB_FIRST, stream=DA_spi, FORCE_SW)
  7.  
  8. void main()
  9. {
  10.    output_low(DA_CS);
  11.    spi_xfer(DA_spi,0x0554);/* |4 bits dummy|10bits DA|2 bits x */
  12.    output_high(DA_CS);
  13. }

(http://www.todopic.com.ar/foros/index.php?action=dlattach;topic=27422.0;attach=10130)
Título: Re: Un ejemplo con SPI por favor.
Publicado por: Enigma en 16 de Septiembre de 2009, 03:49:02
Hola chicos, aquí presento avances:

Bueno con el aporte del señor Suky, pues he logrado que el SPI se me encienda como se ve en la figura!!!
Pero aún sigue sin dar voltaje de salida... que raro no? (Tono Ironico) :?

Ahora, yo asumi que la dirección que mandabas en tu programa Suky es una dirección para decirle al DAC que va a recibir un dato!! o me equivoco?

En la figura anexada en .rar pueden apreciar lo que ha sucedido...

Que código use??, pues hice unos cuantos cambios y con todos probe y lo único que pude lograr fue que el SPI encendiera:

Cabecera:

#use spi(MASTER,CLK=PIN_B4, DO=PIN_B2, DI=PIN_B1, BITS=16, MODE=3, MSB_FIRST, FORCE_SW, stream= BUSSPI)

int16 ADC;
float dato;

Con está instrucción me prendio en SPI sin mostrar datos a la salida:


           set_adc_channel(0);                // Lee el canal AN0 (Señal de la RTD)
                     delay_us(10);                      // Demora para capturar bien el dato
                     ADC=read_adc();                    // ADC=dato digital del ADC
                     dato=((float)ADC*5)/255;           // Convierto a analógico
                     spi_write(0x0554);
                     while (! BF ); // Espera a que se transmita
                     spi_write(ADC);
                     while (! BF ); // Espera a que se transmita
                     delay_us(200);

Con está hacía lo mismo, pero en proteus se me venian todos estos mensajes... (Los que se observan en dibujo1)... Me ignoraba la data enviada... :?

           set_adc_channel(0);                // Lee el canal AN0 (Señal de la RTD)
                     delay_us(10);                      // Demora para capturar bien el dato
                     ADC=read_adc();                    // ADC=dato digital del ADC
                     dato=((float)ADC*5)/255;           // Convierto a analógico
                     c=ADC;
                     SPI_Envia (c,0x0554 );             // Envía dato
                     delay_us(200);

Donde:

unsigned char SPI_Envia ( unsigned char c,unsigned int dir);

unsigned char SPI_Envia ( unsigned char c,unsigned int dir)
 {
    SSPBUF = 0x0554;    // Envia dato
    while (! BF ); // Espera a que se transmita
    SSPBUF =c;
    while (! BF ); // Espera a que se transmita
    return SSPBUF ;
 }

Con está me dió un error de compilación...

           set_adc_channel(0);                // Lee el canal AN0 (Señal de la RTD)
                     delay_us(10);                      // Demora para capturar bien el dato
                     ADC=read_adc();                    // ADC=dato digital del ADC
                     dato=((float)ADC*5)/255;           // Convierto a analógico
                     SPI_XFER(c,0X0554);
                     delay_us(200);

ERROR: STREAM MUST BE A CONSTANT IN THE VALID RANGE...


Por cierto una pregunta, es necesario activar y desactivar el DAC, no se puede dejar activado todo el tiempo, así como lo tengo en mi diagrama, es decir, con el CS puesto a tierra?

Por cierto el voltaje de referncia es de 2V...

Y bueno disculpen tanta molestia e insistencia con este tema, pero es que no me quiero quedar tranquila hasta saber que está transmisión haya funcionado... Ya se me convirtio en una meta jejeje :mrgreen:


Atte: Enigma... La llenrita de Guayana  :?
Título: Re: Un ejemplo con SPI por favor.
Publicado por: Suky en 16 de Septiembre de 2009, 09:30:59
Lo que te esta faltando es la acción sobre el pin CS del conversor. Este pin en condiciones normales debe estar en high, cuando se carga un valor se lo coloca en low, y luego se lo reestablece, en ese momento comienza la conversión y se muestra el valor.


Saludos!
Título: Re: Un ejemplo con SPI por favor.
Publicado por: MLO__ en 16 de Septiembre de 2009, 10:43:05
Me refiero a habilitarla por medio del pin respectivo del dispositivo SS. La rutina de envío que yo uso habilita primero la linea SS, luego uso la función spi_write(); para enviar el dato y al final, deshabilito la linea SS.

Según el datasheet, se debe configurar el IDLE en alto o bajo.

Título: Re: Un ejemplo con SPI por favor.
Publicado por: septiembre_negro en 16 de Septiembre de 2009, 18:03:15
Hola
Mira por lo que e leído en el hilo, lo que  tratan de decirte es que tu error es tener
Permanentemente el pin cs a tierra, ya que para el correcto funcionamiento del dispositivo requiere una transición por ese pin de high a low o  de low a high  según indique la data.
Suerte  ;-)
Título: Re: Un ejemplo con SPI por favor.
Publicado por: Enigma en 16 de Septiembre de 2009, 22:45:21
Hola chicos he aquí los avances..... :g)

Bueno gracias a su gentil ayuda y a mi perseverancia y preguntadera...tantatatatannn...
HE LOGRADO COMUNICARME VIA SPI!!! :mrgreen: Yuuuupi!!! jejejeje :-/

Pero lo he logrado usando la función que les escribi en e otros post, la de SPI_Envia (c)...
y miren los resultados... (Imagen 1, llamada Dibujo2) ;-)

#use spi(MASTER,CLK=PIN_B4, DO=PIN_B2, DI=PIN_B1, BITS=16, MODE=3, MSB_FIRST, FORCE_SW, stream= BUSSPI)

Hago esto:
                     set_adc_channel(0);                // Lee el canal AN0 (Señal de la RTD)
                     delay_us(10);                      // Demora para capturar bien el dato
                     ADC=read_adc();                    // ADC=dato digital del ADC
                     dato=((float)ADC*5)/255;           // Convierto a analógico 
                     RA5=0;                             // Habilito dispositivo DAC
                     c=ADC;
                     SPI_Envia (c);                     // Envia dato
                     RA5=1;                             // Deshabilito dispositivo DAC
                     delay_us(200);
                     .
                     .
                     .

Y así va, lee el ADC luego en envia por el SPI, eso es lo que hace esa rutina...


Ahora, intente hacerlo con el SPI_Write, y pues solo me escribe el dato en la primera
vuelta, ya cuando el programa hace la segunda vuelta pues, solo activa y desactiva el DAC, pero
no envia datos!!! ummmm....(Imagen 2, llamada Dibujo3)


#use spi(MASTER,CLK=PIN_B4, DO=PIN_B2, DI=PIN_B1, BITS=16, MODE=3, MSB_FIRST, FORCE_SW, stream= BUSSPI)

Hice esto:
                       set_adc_channel(0);                // Lee el canal AN0 (Señal de la RTD)
                     delay_us(10);                      // Demora para capturar bien el dato
                     ADC=read_adc();                    // ADC=dato digital del ADC
                     dato=((float)ADC*5)/255;           // Convierto a analógico
                     RA5=0;
                     spi_write(ADC);
                     delay_us(200);
           .
                     .
                     .

Con el SPI_XFER(); pues ni siquiera envia el dato, solo habilita y deshabilita el dispositivo,
no se si es que estoy haciendo alguna mala acción con estas instrucciones....

#use spi(MASTER,CLK=PIN_B4, DO=PIN_B2, DI=PIN_B1, BITS=16, MODE=3, MSB_FIRST, FORCE_SW, stream= BUSSPI)

Hice esto:

set_adc_channel(0);                // Lee el canal AN0 (Señal de la RTD)
                     delay_us(10);                      // Demora para capturar bien el dato
                     ADC=read_adc();                    // ADC=dato digital del ADC
                     dato=((float)ADC*5)/255;           // Convierto a analógico
                     RA5=0;
                     spi_XFER(ADC);
                     delay_us(200);
           .
                     .
                     .

Y bueno creo que desde que me empezo a comunicar el SPI, pues creo que todo mi problema se centraba en que siempre dejaba encendico el DAC..
Y bueno gracias a ustedes salí de ese hueco.. Ahora lo que me toca es saber porque el DAC me saca ta poquito voltaje a su salida
cuando le estoy metiendo 5V a la entrada... :?

Atte: Enigma... La llanerita de Guayana ;-)
Título: Re: Un ejemplo con SPI por favor.
Publicado por: Suky en 22 de Septiembre de 2009, 09:11:51
Disculpa por la demora en contestar. Me alegro que hayas logrado hacer funcionar el código pero deben quedarte las cosas claras. La función SPI_Envia lo realiza mediante hardware pero en #use spi indicas que es por software, ten cuidado en eso.

Luego si escribes solo spi_XFER(ADC); no te va a enviar nada! Fíjate como lo utilizo:

Código: C
  1. spi_xfer(DA_spi,0x0554);/* |4 bits dummy|10bits DA|2 bits x */

Saludos!