Autor Tema: Enviar dato int1 por USB  (Leído 2131 veces)

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

Desconectado umalrovi

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 158
    • Aplicaciones Electrónicas
Enviar dato int1 por USB
« en: 05 de Noviembre de 2013, 12:48:28 »
Buenas, estoy desarrollando un proyecto con el pic18f4550 en el cual envío un array de 5 posiciones de datos de 1 bytes. Pero en realidad en ese array solamente hay unos (1) y ceros(0). Por ejemplo array[5]={1,0,1,0,1}; Donde array está definido como int8.

Todo funciona correctamente al comuniarme con el labview. El caso lo que quiero hacer para optimizar el código (RAM del microcontrolador) es definir el array como int1.

int1 array[5]={1,0,1,0,1};

Pues a la hora de leer el dato con el labview no lo hace correctamente. El dato que leo de la pipe lo tengo definido como unsigned 8 bit integer.

Un slaudo
Aplicaciones Electrónicas
http://www.neoingenia.com/

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Enviar dato int1 por USB
« Respuesta #1 en: 05 de Noviembre de 2013, 15:47:46 »
Hola!

Y por qué no dejar los 5 bits en dentro de una variable de 8 bits y empaquetarlos/desempaquetarlos acorde?

Saludos!
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado umalrovi

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 158
    • Aplicaciones Electrónicas
Re: Enviar dato int1 por USB
« Respuesta #2 en: 06 de Noviembre de 2013, 05:34:56 »
He puesto un array de 5 posiciones, pero en ralidad tengo un array de 500 posiciones y si defines como int1 los elementos del array ocupa menos memoria si lo define como int8. Por eso era la pregunta.
 
Aplicaciones Electrónicas
http://www.neoingenia.com/

Desconectado ppyote

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 929
Re: Enviar dato int1 por USB
« Respuesta #3 en: 06 de Noviembre de 2013, 06:55:41 »
Cuando haces el envío, envias todo el array? Ósea los 500 int1?
PPyote... siempre estareis en mi corazon.... Te quiero Hermano...

Desconectado umalrovi

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 158
    • Aplicaciones Electrónicas
Re: Enviar dato int1 por USB
« Respuesta #4 en: 06 de Noviembre de 2013, 08:27:47 »
Si. Me defino lo siguiente:

Código: [Seleccionar]
#define  LenMod  500
//Comunicación USB
#define USB_HID_DEVICE     FALSE
#define USB_EP1_TX_ENABLE  USB_ENABLE_BULK
#define USB_EP1_RX_ENABLE  USB_ENABLE_BULK

#define USB_EP1_TX_SIZE    LenMod                
#define USB_EP1_RX_SIZE    LenMod    
          
#include <pic18_usb.h>
#include "usb_desc_scope.h"
#include <usb.c>  
int8      Array[LenMod];


Utilizo la siguiente sentencia para recibir un dato del PC en el microcontrolador.
Código: [Seleccionar]
usb_get_packet(1, Array, LenMod);y la siguiente sentencia para enviar un dato del microcontrolador al PC
Código: [Seleccionar]
usb_put_packet(1, Array, LenMod, USB_DTS_TOGGLE);
¿Qué os parece?¿Hago algo mal? Mi idea es enviar
Código: [Seleccionar]
int1      Array[LenMod];El problema está a la hora de definir un tipo de dato en labview como int1.
« Última modificación: 06 de Noviembre de 2013, 08:45:17 por umalrovi »
Aplicaciones Electrónicas
http://www.neoingenia.com/

Desconectado umalrovi

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 158
    • Aplicaciones Electrónicas
Re: Enviar dato int1 por USB
« Respuesta #5 en: 07 de Noviembre de 2013, 09:59:40 »
Buenas, hablando con azicuetano, me ha propuesto en vez de enviar un array de 500 posiciones definidas como int8 y en realidad en cada una de ellas los numeros que van a ver son 0 ó 1, sería definirse un vector de 500 posiciones de int1 y a la hora de mandarlo por el USB reconstruir el array binario y pasarlo a decimal. Me explico con un ejemplo:

int1 tiempos[]={1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0};

Los elementos del array tiempos (las posiciones del 0 al 7) que están en rojo, tendríamos que pasarlas a decimal así sucesivamente hasta finalizar el array. En el momento que creamos un nuevo array quedaría de la siguiente forma:

int8 tiemosDec[]={128,64};

Así nos evitamos enviar en vez de 16 elementos de int8 del array tiempos (como estaba definido en la primera propuesta), solamente enviamos 2 elementos. Hablo para este ejemplo.

Para ejemplo de 500 posiciones pues solamente enviariamos 500/8=63 bytes con lo que ahorramos mucha memoria RAM del microprocesador.

Me pongo manos a la obra para desarrollar la primera función para pasar un array de números int1 a decimal:

int1 tiempos[]={1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0};

La funión la declaro así:

Código: [Seleccionar]
void ArrayBinToDecimal (int1 *,int *);Reservo memoria de un puntero a un entero de 1 bit y también reservo memoria de un puntero aun entero de 1 byte.

La función la creo así:
Código: [Seleccionar]
void ArrayBinToDecimal (int1 xbin,int8 xdec)
{
   int i,j,temp;
   for(i=0;i<p-1;i=i+8)  //p es tamaño del array de xbin y es una variable global
   {
      temp=0;
      for(j=0;j<=7;j++)
      {
         temp=t[i+j]*2**(7-j)+temp;
      }
      xdec[i/8]=temp;
   }

Y la función la llamaría así:
Código: [Seleccionar]
ArrayBinToDecimal (int1 &xbin,int8 &xdec)
El problema de esto y he comprobado es que el compilador CCS no reserva memoria int1 sino para un int8. Lo he comprobado haciendo un printf y sacando el valor con la función sizeof.

Alguien me lo puede confirmar y ya de paso me diría como lo puedo hacer...

Gracias
« Última modificación: 07 de Noviembre de 2013, 10:04:46 por umalrovi »
Aplicaciones Electrónicas
http://www.neoingenia.com/

Desconectado xxopiumxx

  • PIC12
  • **
  • Mensajes: 82
Re: Enviar dato int1 por USB
« Respuesta #6 en: 02 de Diciembre de 2013, 13:12:34 »
es un tema bastante complicado. en realidad los compiladores, en bajo nivel no reservan espacio en memoria de 1bit. menos lo va a hacer ccs. lo que hace es reservar pedazos de ocho bits y cambiar las direcciones de las variables definidas como int1 para que queden todas juntas.

en tu caso particular, no tiene sentido lo que queres hacer, porque te sobra memoria RAM. defini UNA variable de 8 bits y manejala por bitset e interpreta todo como binario. mandar 3 bits muertos no te cambia en nada.

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Enviar dato int1 por USB
« Respuesta #7 en: 02 de Diciembre de 2013, 15:22:55 »
El problema es que la variable int1 es un invento del CCS. Personalmente me parece que trabajar con array de variables int1, es salirse del standard y te va a traer muchos problemas.

Lo que estás queriendo hacer, se puede hacer tranquilamente con variables de 1 byte de tamaño, sin desperdicio de RAM. No entiendo por qué seguís insistiendo en utilizar un array de variables int1.

Solución: generá un array de 63 bytes (uint8). Eso equivale a 504 bits. Podés olvidarte de los últimso 4 si no los necesitás. Ahora, eso se puede mandar sin problemas por USB. Si asumimos un ordenamiento de LSb a MSb, tenemos que tu primer "int1" estaría en el elemento 0, bit 0, el 2do estaría en el elemento 0, bit 1... etc. Utilizando de 0 a 7 los bits y pasando luego al próximo byte volviendo desde el bit 0 al 7, y así.

Sólo te resta ahora generar dos funciones para poder escribir y leer un determinado bit del array:

Código: C#
  1. #include <stdint.h>
  2.  
  3. #define Elementcount    500
  4.  
  5. #if(Elementcount / 8 != 0)
  6.         #define arrayByteCount Elementcount / 8 + 1
  7. #else
  8.         #define arrayByteCount Elementcount / 8
  9. #endif
  10. uint8_t myBitArray[arrayByteCount];
  11.  
  12.  
  13.  
  14. void write_array_bit (uint8_t array[], uint16_t elementNumber, uint8_t value)
  15. {
  16.     if(value)   //si es 1
  17.        array[elementNumber>>3] |= 1<<(elementNumber % 8);               //poner a 1 el elemento correspondiente
  18.     else                //sino
  19.        array[elementNumber>>3] &= ~(1<<(elementNumber % 8));    //poner a 0 el elemento correspondiente
  20. }
  21.  
  22. uint8_t read_array_bit (uint8_t array[], uint16_t elementNumber)
  23. {
  24.         if( array[elementNumber>>3] & 1<<(elementNumber % 8) ) return 1; else return 0;
  25. }
  26.  
  27. void main()
  28. {
  29.         uint8_t value;
  30.  
  31.         write_array_bit(myBitArray, 0, 1);     //escribimos el valor 1 en el elemento bit número 0
  32.         write_array_bit(myBitArray, 7, 0);     //escribimos el valor 0 en el elemento bit número 7
  33.         write_array_bit(myBitArray, 8, 1);     //escribimos el valor 1 en el elemento bit número 8
  34.         write_array_bit(myBitArray, 499, 1); //escribimos el valor 1 en el elemento bit número 499
  35.  
  36.         value = read_array_bit(myBitArray, 0);      //leemos el valor del elemento bit número 0
  37.         value = read_array_bit(myBitArray, 7);      //leemos el valor del elemento bit número 7
  38.         value = read_array_bit(myBitArray, 8);      //leemos el valor del elemento bit número 8
  39.         value = read_array_bit(myBitArray, 499);  //leemos el valor del elemento bit número 499
  40.  
  41. }

luego, los envías así:

usb_put_packet(1, myBitArray, arrayByteCount, USB_DTS_TOGGLE);

Saludos.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado umalrovi

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 158
    • Aplicaciones Electrónicas
Re: Enviar dato int1 por USB
« Respuesta #8 en: 03 de Diciembre de 2013, 05:30:32 »
Bruno muy buen aporte. Como muy bien dices, los int1 me han dado un mnontón de problemas. Lo que hice fue enviar y recibir una cadena de carácteres de unsigned int8 y con la función bit_test (funcion, bit) compruebo cada bit y en función a eso pues hago mis activaciones en la salida. Te agradezco tu código y lo voy analizar y guardar.

Muchas gracias.
Aplicaciones Electrónicas
http://www.neoingenia.com/


 

anything