Autor Tema: Ayuda para capturar una cadena de datos  (Leído 3069 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado Thulsa Doom

  • PIC24F
  • *****
  • Mensajes: 771
    • https://electronicadicto.wordpress.com/
Ayuda para capturar una cadena de datos
« en: 02 de Febrero de 2011, 20:13:24 »
Hola a todos, hace tiempo que no entro, por cuestiones laborales no he tenido tiempo, pero ahora ya estoy disponible y quiero ir a la carga de nuevo.

He de decir que estoy empezando con el C, estoy utilizando el CCS C y la verdad que estoy verde en esto, pero lo sigo intentando.

Bueno resulta que estoy desarrollando un proyecto que consiste en capturar una cadena de datos de 16bits, suministrada por un dispositivo, el puerto que utilizo para capturar el dato es el C7 y tengo implementado el sr232()

He conseguido que el pic suministre los pulsos de reloj necesarios para que el dispositivo actúe y emita el dato de 16bits.

Hasta ahí todo correcto, pero ahora tengo un problema, resulta que no sé como capturar ese dato y por más que leo, más lio me hago.

Yo he estado utilizando
#int_RDA
y con
variable=getc();

Pero creo que este comando solo lee un bit, no sé si estoy equivocado
La razón de por qué afirmo esto, es porque a continuación le pongo un

putc(valor)

y por la patilla C6 creo que me sale solo un bit.

He leído algo de un buffer pero no tengo muy claro de cómo hacerlo, a mi entender es la marea correcta de hacerlo, meter la cadena de 16bits en un buffer y luego trabajar sobre ella.

A ver si alguien me orienta un saludo y gracias
Más códigos y desarrollos en https://electronicadicto.wordpress.com/ date una vuelta y curiosea un rato...

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Ayuda para capturar una cadena de datos
« Respuesta #1 en: 03 de Febrero de 2011, 09:34:06 »
  La función getc() sirve para leer un byte. a la vez.
  Si definís una array de dos caracteres podrías capturar los 16 bits tranquilamente. Algo así podría servir....

Código: C
  1. char cadena[3]; //el ultimo espacio es para el caracter nulo, en caso de querer tratar a la variable como un string
  2.  
  3. // ya en la funcion podrias poner
  4.  
  5. cadena[0] = getc();
  6. cadena[1] = getc();
  7.  
  8. // con eso ya tendrias capturado los 2 bytes, es decir los 16 bits
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado Thulsa Doom

  • PIC24F
  • *****
  • Mensajes: 771
    • https://electronicadicto.wordpress.com/
Re: Ayuda para capturar una cadena de datos
« Respuesta #2 en: 03 de Febrero de 2011, 19:53:39 »
Hola, gracias por la respuesta.
Resulta que leyendo me he dado cuenta que estaba implementado mal el dispositivo, el dispositivo trabaja con la comunicación de Motorola SPI, entonces lo he estado intentando implementar pero no estoy seguro de entenderlo.

1º), estoy usando un PIC16F876A, que según el datasheet dice que tiene SPI
Fragmento del datasheet:

9.3 SPI Mode
The SPI mode allows 8 bits of data to be synchronously
transmitted and received simultaneously. All four
modes of SPI are supported. To accomplish
communication, typically three pins are used:
• Serial Data Out (SDO) – RC5/SDO
• Serial Data In (SDI) – RC4/SDI/SDA
• Serial Clock (SCK) – RC3/SCK/SCL
Additionally, a fourth pin may be used when in a Slave
mode of operation:
• Slave Select (SS) – RA5/AN4/SS/C2OUT
Figure 9-1 shows the block diagram of the MSSP
module when operating in SPI mode.


2º) Leo el manual del CCS C donde explica como implementarlo pero me lío un poco y no sé cómo hacerlo del todo bien

3º) el dispositivo a conectar al pic, solo emite una cadena de 16bits si la entrada SC se activa a nivel bajo durante un tiempo determinado, luego pasa el CS a modo alto, con cada golpe de reloj emitirá una cadena de 16bits, con lo cual al dispositivo lo único que le tiene que llegar el pic es esa activación del bit select.

4º) he conseguido hacer eso de una determinada manera y creo que no es la adecuada, lo explico

El código que he hecho es este:
Citar

#use SPI(STREAM=cadena,LOAD=pin_c2,DI=pin_c4,CLK=pin_c3,BITS=16) 

//********************programa************************************************
 void main (){
        int16 captura;
        setup_spi(SPI_MASTER | SPI_H_TO_L |SPI_CLK_DIV_16);
       
         
         
       while(TRUE){
          spi_xfer(cadena,j,16);
          captura = spi_xfer(cadena,j,16);
}

La primer duda que tengo es en la función #USE SPI, según leo en manual dice que para implementar el hardware del pic y no hacerlo trabajar por software, hay que poner
FORCE_HW
 pero si lo pongo, el compilador me da un error de :
Option invalid Not valid for H/W
que no tengo ni idea de lo que quiere decir.

La segunda: es en la construcción de la función
si pongo la función de esta manera:
Citar

         setup_spi(SPI_MASTER | SPI_H_TO_L |SPI_CLK_DIV_16);

no funciona y si l apongo así:
Citar
         setup_spi2(SPI_MASTER | SPI_H_TO_L |SPI_CLK_DIV_16);
si, se supone que esta es para otro SPI que tenga el chip, y creo que el 16F876A solo tiene uno, con lo cual no entiendo porque no funciona.

 tercera duda:
se supone que el dispositivo es tonto, ósea que no requiere de recibir datos del pic si no con tal solo poniendo a low la entrada CS se activará y nos enviará la trama.
pues bien si en el cuerpo del main no pongo nada, el pic no genera el clok ni la señal cs pero si pongo esto:

Citar
          spi_xfer(cadena,j,16);
          captura = spi_xfer(cadena,j,16);

si empieza a funcionar. Según leo en el manual, esa sentencias emiten y reciben, lo que no entiendo es¿ por qué tengo que emitir si el dispositivo no va a recibir nada si no solo un pulso negativo por el CS y el reloj por el SCK?.
¿no habrá una manera de que el micro siempre emita la señal de reloj y los pulsos por CS y solo reciba la trama desde el dispositivo?

La configuración del dispositivo es la siguiente, la entrada de SCK está conectada al PIN C3
                                                                     la entrada de CS está conectada al PIN C2
                                                                    la salida de datos está conectada al PIN C4
como pueden ver en la cabecera hay una opción (LOAD=pin_c2) esa opción es para cada vez que se transfiera el dato se active, con eso hago los pulsos de CS, no sé si habrá otra forma mejor.

y la ultima duda no se qué diferencia hay entre

result = spi_data_is_in()
result = spi_data_is_in2()

value = spi_read (data)
value = spi_read2 (data)

spi_write (value)
spi_write2 (value)

spi_xfer(data)
spi_xfer(stream, data)
spi_xfer(stream, data, bits)
result = spi_xfer(data)
result = spi_xfer(stream, data)
result = spi_xfer(stream, data, bits)


la única que me funciona es spi_xfer las demás me da error o no funcionan, o seguro que no sé cómo ponerlas.

Bueno, esto es todo, espero que no sea muy pesada la lectura y espero haberme explicado bien.
Gracias
Más códigos y desarrollos en https://electronicadicto.wordpress.com/ date una vuelta y curiosea un rato...

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Ayuda para capturar una cadena de datos
« Respuesta #3 en: 03 de Febrero de 2011, 20:23:02 »
.........
2º) Leo el manual del CCS C donde explica como implementarlo pero me lío un poco y no sé cómo hacerlo del todo bien

3º) el dispositivo a conectar al pic, solo emite una cadena de 16bits si la entrada SC se activa a nivel bajo durante un tiempo determinado, luego pasa el CS a modo alto, con cada golpe de reloj emitirá una cadena de 16bits, con lo cual al dispositivo lo único que le tiene que llegar el pic es esa activación del bit select.

4º) he conseguido hacer eso de una determinada manera y creo que no es la adecuada, lo explico



  Yo no uso CCS así que no puede ayudarte mucho con las cosas especificas de dicho compilador.

  Normalmente tiene que ocurrir eso del cambio del pin CS pero además el dispositivo maestro (en este caso el PIC) también tiene que proveer los pulsos de clock necesarios. En tu caso el PIC debería enviar 16 pulsos de reloj.

  Cada transferencia hacia el bus SPI es de 8 bits. Se va transmitiendo/recibiendo bit a bit. Lo que está en el registro SSPBUF es transmitido y lo que va llegando se va almacenando allí.
  Entonces tendrías que hacer dos transmisiones consecutivas para lograr recibir los 16 bits.

  Tal vez algo así...

Código: C
  1. char primeraparte, segundaparte;
  2. int16 variable;
  3. ......
  4. .......
  5. primeraparte = xfer(......); // no sé lo que va entre paréntesis
  6. segundaparte = xfer(......); // no sé lo que va entre paréntesis
  7.  
  8. // supongamos que primero se lee la parte alta
  9.  
  10. variable = (primeraparte * 256) + segundaparte;

  Ese código es muy desprolijo y puede ser mejorado pero preferí dejarlo así para que sea mas entendible el punto.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado Thulsa Doom

  • PIC24F
  • *****
  • Mensajes: 771
    • https://electronicadicto.wordpress.com/
Re: Ayuda para capturar una cadena de datos
« Respuesta #4 en: 04 de Febrero de 2011, 14:05:16 »
Creo que ya lo entiendo, como el bus solo soporta 1 byte, tendría que leer el dato de 16 bits 2 veces y guardar los 2 bytes en dos posiciones de memorias distintas y luego sumarlos entre sí para que me dé la palabra entera.
¿Estoy en el camino?.

Y otra cosa, ¿está bien de la manera que tengo conectado el dispositivo al PIC?

PDT: ya sé porque no funcionaba cuando indicaba que utilizara el SPI de hardware del chip.
Se supone que si no utilizo (FORCE_HW), es porque quiero implementar el SPI por software y he de decir que patillas quiero utilizar,
Si utilizas el SPI por hardware, no hace falta designar el patillaje ya que se utiliza el del hardware.
Entonces al poner (FORCE_HW) y poner el patillaje hay un conflicto y no lo permite.
Sacado el patillaje de la función (DI, DO, LOAD), ya funciona por hardware.
« Última modificación: 04 de Febrero de 2011, 14:44:15 por Thulsa Doom »
Más códigos y desarrollos en https://electronicadicto.wordpress.com/ date una vuelta y curiosea un rato...

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Ayuda para capturar una cadena de datos
« Respuesta #5 en: 04 de Febrero de 2011, 14:59:50 »
  Me alegro!
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas


 

anything