Autor Tema: Asignar variables fijas tipo bit en el pre-procesador de C  (Leído 3962 veces)

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

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
Asignar variables fijas tipo bit en el pre-procesador de C
« en: 16 de Abril de 2008, 03:07:04 »
No doy con ello.

El problema es el siguiente:

Tengo una variable int lamada bit_port que puede tomar los valores de 0 a 7 (bits de salida del portb).

Pretendo hacer:

#bit Salida = 0x06.bit_port    para luego desde un trozo en ensamblador hacer:  bcf Salida

pero esto no lo admite el pre-procesador, necesita que bit_port sea un número.

¿Se os ocurre algo?

« Última modificación: 16 de Abril de 2008, 03:09:05 por pocher »

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Asignar variables fijas tipo bit en el pre-procesador de C
« Respuesta #1 en: 16 de Abril de 2008, 03:17:45 »
Creo que no se puede hacer Pocher, porque mezclas conceptos de tiempo de compilación (directivas del preprocesador) con conceptos de tiempo de ejecución (variables).

La única manera que se me ocurre de hacerlo es mediante "if" o "switch" o quizás usando el array de pines que Guillermo proponía en otro hilo del foro.

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5474
    • Electrónica Didacta
Re: Asignar variables fijas tipo bit en el pre-procesador de C
« Respuesta #2 en: 16 de Abril de 2008, 15:18:04 »
¿y porque no usas operadores logicos? manipulas datos a nivel de bits sin alterar los hermanos  :mrgreen:

La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Asignar variables fijas tipo bit en el pre-procesador de C
« Respuesta #3 en: 16 de Abril de 2008, 15:55:17 »
Pocher, a nivel de las instrucciones del micro no es posible mandar como variable el numero de pin del puerto.

Es por ello que el compilador va a "quejarse".  La solución, aunque lenta en tiempo de ejecución, viene por el lado de usar las OR y NAND con el bit de puerto que quieras activar/desactivar, como bien te ha sugerido Palitroquez.



- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Asignar variables fijas tipo bit en el pre-procesador de C
« Respuesta #4 en: 16 de Abril de 2008, 16:05:33 »
Ya he encontrado el hilo de Gu1llermo que antes mencionaba. La verdad es que la solución más sencilla es la de los operadores lógicos, pero esta no está mal:
http://www.todopic.com.ar/foros/index.php?topic=21195.msg163359#msg163359

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
Re: Asignar variables fijas tipo bit en el pre-procesador de C
« Respuesta #5 en: 17 de Abril de 2008, 07:58:55 »
Gracias muchachos, me habeis hecho encender la bombilla.

Dependiendo del valor de la variable bit_port, haré que se active un determinado bit de otra variable (registro). Por ejemplo si bit_port=3, haré que se active el bit 3 de la variable AUX. Luego desde el ensamblador le pasaré este registro AUX al acumulador y desde el acumulador al PORTB.

A veces lo más fácil es lo más dificil de ver.

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Asignar variables fijas tipo bit en el pre-procesador de C
« Respuesta #6 en: 17 de Abril de 2008, 08:09:08 »
Desde la mayor humildad, Pocher, creo que te estás complicando la vida. ¿No te vale esto?

PORTB = (PORTB & (255 - (1<<bit_port) )) | (1<<bit_port);

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
Re: Asignar variables fijas tipo bit en el pre-procesador de C
« Respuesta #7 en: 17 de Abril de 2008, 16:15:27 »
Gracias Manolo por el interés. Con la primera idea que me disteis arriba ya lo solucioné.

El problema venía de usar variables en C y que me las viese el ensamblador. Yo intentaba que el ensamblador me viese variables tipo bit pero no se puede, ha de ser con registros (variables int8).

A ver déjame que piense en voz bajita, lo que me has dejado.

Si por ejemplo bit_port=3:

1<<bit_port=6  ---->   255-6=249=1111 1001 y esto lo hacemos AND bit a bit con el PORTB con lo que quedarán intactos todos los bits, menos RB1 y RB2 que seran 0.

Si ahora hacemos una OR bit a bit con 6=0000 0110 quedarían todos los bits del PORTB intactos, menos RB1 y RB2 que ahora seran 1. ¡ Ostras !que cosa más rara me ha salido ... seguramente abré metido la pata en algún sitio.

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Asignar variables fijas tipo bit en el pre-procesador de C
« Respuesta #8 en: 17 de Abril de 2008, 16:32:06 »
1<<bit_port debe ser 00001000 = 8
255-8=247 = 11110111
Al hacer un AND dejo todos los bits intactos menos el 3º, que lo borramos.

Ahora hacemos un OR con 00001000 y lo encendemos sin tocar el resto.

Doy por hecho que bit_port va de 0 a 7.

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
Re: Asignar variables fijas tipo bit en el pre-procesador de C
« Respuesta #9 en: 18 de Abril de 2008, 01:08:59 »
La variable bit_port es int8 y vale (por ejemplo) 0000 0011 (3) ¿Como es posible que al rotarla un lugar hacia la izquierda salga 0000 1000 en lugar de 0000 0110?

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Asignar variables fijas tipo bit en el pre-procesador de C
« Respuesta #10 en: 18 de Abril de 2008, 01:40:52 »
Es que el valor que estamos desplazando es 1 y bit_port indica el nº de saltos.
En realidad es equivalente a hacer:
2 ^{bit_port}

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
Re: Asignar variables fijas tipo bit en el pre-procesador de C
« Respuesta #11 en: 18 de Abril de 2008, 01:51:59 »
Ah vale, vale. Desde ese punto de vista sí, pero en mi programa C el valor de la variable bit_port puede ser 0000 0001, 0000 0010, 0000 0011, 0000 0100, 0000 0101, 0000 0110 y 0000 0111 (no indica el número de saltos).

Entendido, gracias Manolo.

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Asignar variables fijas tipo bit en el pre-procesador de C
« Respuesta #12 en: 18 de Abril de 2008, 01:57:53 »
Ahora soy yo quien no lo entiende  :?

¿Bit_port te puede indicar que se enciendan varios bits a la vez?, ¿es una imagen de lo que quieres sacar por el puerto?

Yo me he basado en esta frase tuya:
Por ejemplo si bit_port=3, haré que se active el bit 3 de la variable AUX.

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
Re: Asignar variables fijas tipo bit en el pre-procesador de C
« Respuesta #13 en: 18 de Abril de 2008, 02:09:06 »
Lo tengo así:

Si bit_port=3, entonces AUX=0000 1000 (se activa el bit 3) y con esta variable AUX me la llevo al ensamblador y hago la máscara con la AND del PORTB.

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Asignar variables fijas tipo bit en el pre-procesador de C
« Respuesta #14 en: 18 de Abril de 2008, 02:19:07 »
Entonces bit_port sí indica el nº de saltos  :D


 

anything