Autor Tema: Duda con cadenas y arreglos en CCS C  (Leído 15441 veces)

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

Desconectado Thulsa Doom

  • PIC24F
  • *****
  • Mensajes: 771
    • https://electronicadicto.wordpress.com/
Duda con cadenas y arreglos en CCS C
« 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
« Última modificación: 21 de Febrero de 2011, 13:55:39 por Thulsa Doom »
Más códigos y desarrollos en https://electronicadicto.wordpress.com/ date una vuelta y curiosea un rato...

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Duda con cadenas y arreglos en CCS C
« Respuesta #1 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.

Desconectado Thulsa Doom

  • PIC24F
  • *****
  • Mensajes: 771
    • https://electronicadicto.wordpress.com/
Re: Duda con cadenas y arreglos en CCS C
« Respuesta #2 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?
Más códigos y desarrollos en https://electronicadicto.wordpress.com/ date una vuelta y curiosea un rato...

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Duda con cadenas y arreglos en CCS C
« Respuesta #3 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;

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Duda con cadenas y arreglos en CCS C
« Respuesta #4 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
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: Duda con cadenas y arreglos en CCS C
« Respuesta #5 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?
« Última modificación: 21 de Febrero de 2011, 14:46:38 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: Duda con cadenas y arreglos en CCS C
« Respuesta #6 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.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Duda con cadenas y arreglos en CCS C
« Respuesta #7 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!
No contesto mensajes privados, las consultas en el foro

Desconectado Thulsa Doom

  • PIC24F
  • *****
  • Mensajes: 771
    • https://electronicadicto.wordpress.com/
Re: Duda con cadenas y arreglos en CCS C
« Respuesta #8 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
Más códigos y desarrollos en https://electronicadicto.wordpress.com/ date una vuelta y curiosea un rato...

Desconectado cosmic

  • PIC16
  • ***
  • Mensajes: 175
Re: Duda con cadenas y arreglos en CCS C
« Respuesta #9 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


Desconectado cosmic

  • PIC16
  • ***
  • Mensajes: 175
Re: Duda con cadenas y arreglos en CCS C
« Respuesta #11 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.......... :)

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Duda con cadenas y arreglos en CCS C
« Respuesta #12 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!
No contesto mensajes privados, las consultas en el foro

Desconectado cosmic

  • PIC16
  • ***
  • Mensajes: 175
Re: Duda con cadenas y arreglos en CCS C
« Respuesta #13 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. :-/

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Duda con cadenas y arreglos en CCS C
« Respuesta #14 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!
No contesto mensajes privados, las consultas en el foro