TODOPIC

Microcontroladores PIC => Primeros pasos - Iniciación a los microcontroladores => Mensaje iniciado por: Enigma en 23 de Enero de 2010, 23:27:24

Título: Pregunta acerca de una instrucción!
Publicado por: Enigma en 23 de Enero de 2010, 23:27:24
Hola chicos, que tal.... Estoy haciendo un programa y bueno el pic me está saltando está instrucción .....

      aux_val5    =(val_alto5<<8)|val_bajo5;

En realidad lo que quiero hacer es hacer de val_alto5 y val_bajo 5 una palabra de 8 bits cada una, para así hacer un palabra de 16 bits que requiere un conversor para que me pueda leer bien el dato de voltaje!!!! pero no me hace caso a la instrucción, no se si la estoy escribiendo mal... Alguien me puede corregir??

Atte: Enigma... La llanerita de Guayana :D
Título: Re: Pregunta acerca de una instrucción!
Publicado por: KALLITOS en 23 de Enero de 2010, 23:59:55
hola ENIGMA, segun veo estas usando lenuaje C, yo uso CCS y para hacer lo que deseeas se hace lo siguiente:

Código: C
  1. valor16 = make16(byte_alto,byte_bajo);


saludos


Título: Re: Pregunta acerca de una instrucción!
Publicado por: Enigma en 24 de Enero de 2010, 00:41:47
Ahhh o.k, osea que esa instrucción que estoy usando no es la correcta??? y que hace la que estoy usando entonces??? :?


Enigma... La llanerita de Guayana :g)
Título: Re: Pregunta acerca de una instrucción!
Publicado por: Suky en 24 de Enero de 2010, 09:40:39
Es correcta y hace exactamente los mismo. Es solo cuestión de analizar, observa que val_alto lo estas rotando 8 veces hacia la izquierda pero en una variable de 16 bits, entonces ésta se guarda en los bits 8-15 de val_auxiliar, y luego le sumas val_bajo colocandolo en los bits 0-7 de val_auxiliar.

Puede que a esto se deba agregar casting para que no haya truncamiento y se trate como variable de 16-bits:


Código: C
  1. aux_val5    =(((long)val_alto5<<8)|val_bajo5;


Saludos!
Título: Re: Pregunta acerca de una instrucción!
Publicado por: Enigma en 25 de Enero de 2010, 23:17:50
Ahhhh o.k, ya bueno voy a intentar hacerlo de otra manera porque no me le hace caso a la instrucción... CCS me está jugando una mala pasada! JUM1 :5]


Enigma... La llanerita de Guayana
Título: Re: Pregunta acerca de una instrucción!
Publicado por: Enigma en 27 de Enero de 2010, 23:40:20
Hola chicos otra vez.... No me da la instrucción (que raro!!!)  tengo una dificultad, dificultosa jejejeje! es lo siguiente, estoy tomando un dato analogico desde los ADC de un pic, la cuestión es que debo de llevar ese dato a uno con el mismo valor pero de mayor longitud, es decir de 16 bits, estoy trabajando el ADC con 10 bits.... Ustedes se preguntarán pero para que hacer esto? :? Bueno es que debo llevar enviar el dato que recojo en los ADC´s del pic vía SPI a un DAC para un posterior procesamiento de la señal, pero resulta que mi DAC (TLC5615) tiene que recibir un dato de 16 bits para poder procesarlo bien.... Ahora. estoy aplicando estás instrucciones para convertir mi dato proveniente desde el conversor del PIC a uno de 16 bits, pero en la salida del DAC pues el valor de voltaje me sale erroneo, no se si es que estoy aplicando las instrucciones mal, si alguien me orientase se lo agradecería!


Código: [Seleccionar]
int16 c;
int16 analg_b,analg_a,val_dac;
signed int16 ADC;

                     ADC=read_adc();                    // ADC=dato digital del ADC
                     analg_b= ADC;
                     analg_a= ADC>>8;
                     val_dac=(analg_a<<8)|analg_b;
                     RA5=0;                     // Activo el DAC
                     c=val_dac;
                     SPI_Envia (c);             // Envía dato
                     RA5=1;                     // Desactivo el DAC


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

Atte: Enigma... La llanerita de Guayana :?
Título: Re: Pregunta acerca de una instrucción!
Publicado por: Suky en 28 de Enero de 2010, 02:06:19
Te estas complicando la vida, lo que quieres realizar es sencillo de la siguiente forma:

Código: C
  1. // Seleccionar los pines correctos:
  2. /*#define DA_SCL PIN_B0
  3. #define DA_SDO PIN_B1
  4. #define DA_SDI PIN_B2
  5. #define DA_CS PIN_B3*/
  6.  
  7. // Colocar force_hw si se usa hardware del PIC para comunicacion SPI y sino force_sw.-
  8. #use spi(MASTER,CLK=DA_SCL, DO=DA_SDO, DI=DA_SDI, BITS=16, MODE=3, MSB_FIRST, stream=DA_spi, FORCE_HW)
  9.  
  10.  
  11. int16 ADC, val_dac;
  12.  
  13.       ADC=read_adc();
  14.       val_dac=ADC<<2;
  15.       output_low(DA_CS);
  16.       spi_xfer(DA_spi,val_dac);/* |4 bits dummy|10bits DA|2 bits x */
  17.       output_high(DA_CS);

Se puede simplificar más si se entiende de la siguiente manera:

Código: C
  1. output_low(DA_CS);
  2.       spi_xfer(DA_spi,(read_adc()<<2));/* |4 bits dummy|10bits DA|2 bits x */
  3.       output_high(DA_CS)

Es importante que el conversor este definido a 10 bits.


Saludos!
Título: Re: Pregunta acerca de una instrucción!
Publicado por: Enigma en 28 de Enero de 2010, 23:44:32
Pero allí no estoy mandando 16 bits.... estoy enviando 8bits de la manera en que lo planteas! porque al rotarlo dos veces hacía la derecha no le estaria quitando 2 bits al dato de 10 bits el cual me quedará en 8 bits????


Atte: Enigma... La llanerita de Guayana :D
Título: Re: Pregunta acerca de una instrucción!
Publicado por: Suky en 29 de Enero de 2010, 00:07:16
Pero allí no estoy mandando 16 bits.... estoy enviando 8bits de la manera en que lo planteas! porque al rotarlo dos veces hacía la derecha no le estaria quitando 2 bits al dato de 10 bits el cual me quedará en 8 bits????


Atte: Enigma... La llanerita de Guayana :D

No, porque la variable declarada es de 16 bits.


Saludos!
Título: Re: Pregunta acerca de una instrucción!
Publicado por: Enigma en 30 de Enero de 2010, 00:22:16
Aja ya va... pero es que igual si la variable es de 16 bts y la rotas, pues no estaría manando 14 bits por el bus....?
Título: Re: Pregunta acerca de una instrucción!
Publicado por: Suky en 30 de Enero de 2010, 08:55:25
Aja ya va... pero es que igual si la variable es de 16 bts y la rotas, pues no estaría manando 14 bits por el bus....?

 :rolleyes: Porque piensas eso? Acá las variables son de tamaño fijo, 8 16 o 32 bits. Donde los bits internos los podes manejar a gusto, y en este caso tomas 10 de ellos y los rotas a la izquierda, pero sigue siendo un conjunto de 16-bits.  ;-)


Saludos!
Título: Re: Pregunta acerca de una instrucción!
Publicado por: Enigma en 30 de Enero de 2010, 15:54:08
Ummm creo que no estoy entendiendo bien....

En realidad no se modifica el tamaño de la palabra de bits cuando le hago la rotación?
Título: Re: Pregunta acerca de una instrucción!
Publicado por: Suky en 30 de Enero de 2010, 16:05:57
Ummm creo que no estoy entendiendo bien....

En realidad no se modifica el tamaño de la palabra de bits cuando le hago la rotación?

No, por ahí te conviene utilizar un simulador y observar la variable al ejecutar las rotaciones y entenderás como trabaja  ;-)


Saludos!
Título: Re: Pregunta acerca de una instrucción!
Publicado por: Enigma en 30 de Enero de 2010, 16:25:48
Mierrrr  :shock: toda mi vida he tenido un concepto errado acerca de esto....

Aja, pero entonces que es lo que sucede con la rotación.....?
Título: Re: Pregunta acerca de una instrucción!
Publicado por: Suky en 30 de Enero de 2010, 16:31:33
Mierrrr  :shock: toda mi vida he tenido un concepto errado acerca de esto....

Aja, pero entonces que es lo que sucede con la rotación.....?

Un ejemplo sencillo fijando el Carry como 0.

0000001001100101  0
0000010011001010  0
0000100110010100  0

Ahora con carry en 1.

0000001001100101  1
0000010011001011  1
0000100110010111  1


Cuando hacemos Variable<<4 se rota 4 veces a la izquierda con carry igual a 0.


Saludos!
Título: Re: Pregunta acerca de una instrucción!
Publicado por: Enigma en 30 de Enero de 2010, 17:01:48
Aja, pero cuando se rota una vez, por ejemplo, queda el bit menos significativo rellenado con cero?
Título: Re: Pregunta acerca de una instrucción!
Publicado por: Enigma en 30 de Enero de 2010, 22:35:11
Bueno sigo intentando que mi programa de, pero necesito una ayudta, solo el significado de ésta instrucción que ya la he visto en muchos programas:

BYTE cmd[3];
Título: Re: Pregunta acerca de una instrucción!
Publicado por: Suky en 31 de Enero de 2010, 00:43:20
Es un arreglo de 3 elementos donde cada elemento se define como byte osea una variable de 8 bits. Mas información en  San Google  :mrgreen:


Saludos!
Título: Re: Pregunta acerca de una instrucción!
Publicado por: Enigma en 31 de Enero de 2010, 23:39:39
Pero cmd, es en si una instrucción del ccs?? o yo puedo llamar como me plazca a ese arreglo... Lo pregunto porque en los programas que he visto que lo tienen pues no sale declarado ni nada!
Título: Re: Pregunta acerca de una instrucción!
Publicado por: PalitroqueZ en 31 de Enero de 2010, 23:45:01
cmd no es palabra reservada del ccs, han de haberla llamado en alusión a comando, seguramente para agrupar o identificar una secuencia de datos establecida para ejecutar una acción.

Título: Re: Pregunta acerca de una instrucción!
Publicado por: Enigma en 04 de Febrero de 2010, 09:58:55
Si eso me imagine!!!!!