TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Thulsa Doom en 21 de Febrero de 2011, 13:49:34

Título: Duda con cadenas y arreglos en CCS C
Publicado por: Thulsa Doom en 21 de Febrero de 2011, 13:49:34
Hola a todos, antes de nada he de decir que mis conocimientos es C son limitados, estoy intentando adquirirlos.
pues resulta que no entiendo lo referente a cadenas y arreglos, bueno entender no entiendo muchas cosas pero ahora le toca del turno a esto.

 He leído y releído mucha documentación en libros, foros y páginas en la red sobre el tema de cadenas y arreglos y hay cosas que no me quedan claras.

Voy a poner un ejemplo a ver si así me explico mejor:

Estoy utilizando el compilador CCS C y resulta que estoy intentando capturar una cadena de datos (unos y ceros) que provienen de un dispositivo que se comunica con un pic por el protocolo SPI, la lectura del dispositivo se hace de 2 veces ya que el dato del dispositivo es una palabra de 16 bit y el protocolo SPI solo adminte 8 bits de una vez, con lo cual tengo que hacerlo de 2 veces.

para ello utilizo la función spi_read() de la siguiente manera.
Código: [Seleccionar]
output_low(PIN_A4);  //Pongo a 0 el bit_seting para la lectura
valor1 = spi_read(0); //Capturo los primero 8 bits de la cadena de 16 bits
valor2 = spi_read(0); //Capturo los segundos 8 bits de la cadena de 16 bits
output_high(PIN_A4); //Pongo a 1 el bit_seting para terminar con la lectura

Eso me captura el dato y me lo divide en dos cadenas de 8 bits, y según dice la documentación de CCS C las variables valor1 y valor2 son variables int, hasta ahí todo bien, pero ahora me vienen las dudas y los líos que tengo que me confunden todo.

leyendo sobre cadenas lo que interpreto que hay al respecto, es referido a cadenas en el código ANSI ya que los ejemplos, he incluso lo que está en la librería string.h es referido a variables tipo char e incluso con arreglos tipo
Código: [Seleccionar]
chat string[17]; entonces fijandome en todo eso he intentado hacer lo mismo para los datos capturados e incluso sabiendo que los datos no son del tipo caracter si no son binarios.

he intentado unir las cadenas que capturo con la función  
Código: [Seleccionar]
strcat(cadena1,cadena2); pero con resultados nefastos, creo que será porque lo que capturo es una cadena tipo int y esa función es de tipo char, así como hacerle un arreglo ya que la captura es de 8 bits y el total es de 16 bits y he intentado ponerlo así
Código: [Seleccionar]
char valor1[17], valor2[9]; un bit más porque según lo que he leído dice que hay que dejar uno más para poner la terminación de la cadena '\0', pero me da error la función spi_read();

entonces lo que pregunto es:
 ¿las cadenas (string), sólo son referidas a caracteres ANSI o también sirven para datos binarios?
¿cómo se podría unir esas dos cadenas que capturo para luego trabajar con una cadena sola?
¿se le llama cadena o string a esos datos que capturo o tiene otro nombre?
¿valdrían los arreglos con ese tipo de datos o esto es una cosa especial y aparte de las cadenas típicas?

en todos los ejemplos de cadenas que he visto siempre se les hace un arreglo (si son cadenas estáticas) para trabajar con ella, según dicen si un arreglo tipo char es así :
Código: [Seleccionar]
char valor[5]="hola"el areglo lo combierte en:
valor[1]="h"
valor[2]="o"
valor[3]="l"
valor[4]="a"
valor[5]="'\0'"
¿eso sucedería si la cadenas en un int o char = valor (sin arreglo)?.

bueno no como ven tengo demasiado cacao en mi cabeza que ya me echa hasta humo porque no me sale nada de lo que supuestamente debería de funcionar.
un saludo y gracias de ante mano
Título: Re: Duda con cadenas y arreglos en CCS C
Publicado por: Nocturno en 21 de Febrero de 2011, 13:56:20
Ten cuidado al manejar datos binarios como chars en strings, porque si alguno de ellos es 0 determinará el final del string.
De hecho, da igual que definas un string con un tamaño determinado; si lo intentas imprimir u operas con él, este comenzará donde apunte su dirección, y continuará hasta encontrar un 0.
Título: Re: Duda con cadenas y arreglos en CCS C
Publicado por: Thulsa Doom en 21 de Febrero de 2011, 13:57:47
Pues vaya, no sabía ese dato, ¿entonces que se supone que he de hacer?, ¿solo utilizar int?
Título: Re: Duda con cadenas y arreglos en CCS C
Publicado por: Nocturno en 21 de Febrero de 2011, 14:09:07
Si no he entendido mal, ¿recibes sólo dos bytes y quieres conseguir un word?.
Si es así bastará con que hagas:

Vword = Vbyte1 * 256 + Vbyte2;
Título: Re: Duda con cadenas y arreglos en CCS C
Publicado por: AngelGris en 21 de Febrero de 2011, 14:13:33
  Hasta donde llegan mis conocimientos, cadena se refiere a string y esto a la representación ASCCI.

  En tu caso no es una cadena lo que estás recibiendo, sino que estás recibiendo 2 bytes (suponiendo que el dispositivo envía 2 byte en binario y no 2 caracteres).

  Para unir 2 bytes de datos podes hacer dos cosas... (muestro los ejemplos teniendo en cuenta el tipo de datos en HiTech)

 a)

Código: C
  1. int ValorTotal; // variable de 16 bits
  2. char Valor1, Valor2; // variables de 8 bits
  3.  
  4. ValorTotal = (Valor1 * 256) + Valor2

b) sería haciendo uso de la función make16, en el manual de CCS debe haber una buena descripción y ejemplo de utilización


  En cuanto a arreglos, se pueden usar arreglos para distinto tipos de datos

  Estaba escribiendo y al publicar apareció la respuesta de Nocturno
Título: Re: Duda con cadenas y arreglos en CCS C
Publicado por: Thulsa Doom en 21 de Febrero de 2011, 14:44:06
Muchas gracias por la ayuda.

¿alguien me puede explicar que hace esa instrucción?

ValorTotal = (Valor1 * 256) + Valor2

Por lo que veo se multiplica el valor1 por 256 y el resto se suma avalor2, lo que no entiendo es como esa operación puede unir la palabra sin deformarla

¿Y si no es cadena que es?
Título: Re: Duda con cadenas y arreglos en CCS C
Publicado por: AngelGris en 21 de Febrero de 2011, 14:57:35
  La operación no es para una palabra en tanto que string, sino para unir una palabra en tanto que datos.
  A ver si logro explicarme mejor......

  Como sabrás una palabra o word consta de 16 bits. Tomemos como ejemplo tu caso, que se tienen que enviar 16 bits por SPI pero obviamente hay que hacerlo en dos veces de 8 bits cada uno. Supongamos que el número a enviar es (en hexa para que se entienda mejor) 0x1050, el byte de mayor peso es 0x10 y el otro byte es 0x50. Envío primero 0x10 y luego 0x50. En tu programa se toma dicho dato en dos variables diferentes....

Código: C (Mac)
  1. Valor1 = read_spi();
  2. Valor2 = read_spi()

  ... eso hace que en Valor1 quede almacenado el dato 0x10 y en Valor2 el dato 0x50.

  Multiplicar un valor por 256 es equivalente a hacer un shift a la izquierda 8 veces, por consiguiente el número que antes era 0x10 pasara a ser 0x1000. El valor 0x50 es un valor de 8 bits, si se lo quisiese visualizar como 16 bits sería 0x0050 (el byte de mayor peso es cero). Si ahora sumamos el primer valor multiplicado x 256 mas el segundo como está --> 0x1000 + 0x50 el resultado sería 0x1050.  Como se observa, al hacer esto estamos recuperando el dato tal cual lo necesitábamos.
Título: Re: Duda con cadenas y arreglos en CCS C
Publicado por: Suky en 21 de Febrero de 2011, 15:16:43
Muchas gracias por la ayuda.

¿alguien me puede explicar que hace esa instrucción?

ValorTotal = (Valor1 * 256) + Valor2

Por lo que veo se multiplica el valor1 por 256 y el resto se suma avalor2, lo que no entiendo es como esa operación puede unir la palabra sin deformarla

¿Y si no es cadena que es?

Otra es usar punteros, de esa manera cargas cada byte individualmente:

ValorTotal = Valor2; // Cargo Byte LB
*((char *)&ValorTotal+1)=Valor1; // Cargo Byte HB.


Saludos!
Título: Re: Duda con cadenas y arreglos en CCS C
Publicado por: Thulsa Doom en 22 de Febrero de 2011, 13:37:31
Pues garcias a todos por las respuestas, las dos propuestas funcionan bien, la última no la comprendo pero también funciona, gracias de nuevo
Título: Re: Duda con cadenas y arreglos en CCS C
Publicado por: cosmic en 27 de Abril de 2011, 01:28:02
Hola amigos.
Tengo el siguiente problema, y ahi dejo el codigo.
ayudaaa por favor, ¿que estoy haciendo mal?
gracias a todos
 :-/

//*************************************************
arreglo
//*************************************************
unsigned char code,addr_tab[4][32]={     //????????????
0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,//???????
0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,//???????
0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f,//???????
0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f,//???????
};

//*********
funcion
//********************************
void  GLCD_Letra_Disp(unsigned char x,unsigned char y,unsigned char code,*s)
{
   *s=code;
    //x?y?????
 GLCD_enviaBYTE(GLCD_COMANDO,addr_tab[8*x+y]);  //???
 while(*s>0);//(*s>0)
    {
   GLCD_enviabyte(GLCD_DATO,*s);    //???
  s++;
 
    }
}
//*****************************
llamada a funcion
//*******************************
GLCD_Letra_Disp(1,0,"hola");

al llamarla desde aqui, me da este error

attemp to createa pointer to a cosntant
Título: Re: Duda con cadenas y arreglos en CCS C
Publicado por: Nocturno en 27 de Abril de 2011, 01:39:59
CCS no admite punteros a constantes (http://www.todopic.com.ar/foros/index.php?topic=16226.0)
Título: Re: Duda con cadenas y arreglos en CCS C
Publicado por: cosmic en 27 de Abril de 2011, 19:03:42
Amigos, denme una idea para hacer esto :-/
el las librerias de lcd grafico, lo hacen, mientras reviso, por favor denme una manito, gracias.......... :)
Título: Re: Duda con cadenas y arreglos en CCS C
Publicado por: Suky en 27 de Abril de 2011, 20:26:34
Amigos, denme una idea para hacer esto :-/
el las librerias de lcd grafico, lo hacen, mientras reviso, por favor denme una manito, gracias.......... :)

En CCS hay que crear un único buffer, y luego un arreglo con los offset a cada letra, imagen o lo que sea. Entonces tomas el buffer y direccionas con el offset.


Saludos!
Título: Re: Duda con cadenas y arreglos en CCS C
Publicado por: cosmic en 27 de Abril de 2011, 22:45:22
Gracias amigo suky.
Pero regálame un ejemplo, pues este trozo de código lo copie de por ahy
y era para un avr, yo lo intente adapar.No soy ni amateur en ccs. :D
Podrias usar el mismo que subi.
Gracias amigo. :-/
Título: Re: Duda con cadenas y arreglos en CCS C
Publicado por: Suky en 27 de Abril de 2011, 23:02:13
No miraste la librería para GLCD que trae CCS? Busca en el foro, también hay varios ejemplos.


Saludos!
Título: Re: Duda con cadenas y arreglos en CCS C
Publicado por: bondadoso en 01 de Agosto de 2011, 15:22:21
hola a todos yo quiero unir dos char en una sola por ejemplo

char a;
char b;
char c;

y que el valor de c sea c=ab
conque funcion puedo unirlos,
Título: Re: Duda con cadenas y arreglos en CCS C
Publicado por: rivale en 01 de Agosto de 2011, 15:45:39
hola a todos yo quiero unir dos char en una sola por ejemplo

char a;
char b;
char c;

y que el valor de c sea c=ab
conque funcion puedo unirlos,

usa la funcion strcat()

c=strcat(a,b);
Título: Re: Duda con cadenas y arreglos en CCS C
Publicado por: Suky en 01 de Agosto de 2011, 15:49:13
a,b y c no deberían se char sino un arreglo de char:

char a[2], b[2], c[2];


sino strcat() no va a funcionar, porque el string debe tener el carácter nulo ('\0') al final

Saludos!
Título: Re: Duda con cadenas y arreglos en CCS C
Publicado por: rivale en 01 de Agosto de 2011, 15:50:24
cierto :oops:, pense que querias unir strings
Título: Re: Duda con cadenas y arreglos en CCS C
Publicado por: MLO__ en 01 de Agosto de 2011, 20:36:51
Hola.

Por eso mismo, un string hay que guardarlo en un buffer  ;-)

Saludos