TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: pocher en 16 de Abril de 2008, 03:07:04

Título: Asignar variables fijas tipo bit en el pre-procesador de C
Publicado por: pocher 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?

Título: Re: Asignar variables fijas tipo bit en el pre-procesador de C
Publicado por: Nocturno 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.
Título: Re: Asignar variables fijas tipo bit en el pre-procesador de C
Publicado por: PalitroqueZ 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:

Título: Re: Asignar variables fijas tipo bit en el pre-procesador de C
Publicado por: maunix 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.



Título: Re: Asignar variables fijas tipo bit en el pre-procesador de C
Publicado por: Nocturno 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
Título: Re: Asignar variables fijas tipo bit en el pre-procesador de C
Publicado por: pocher 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.
Título: Re: Asignar variables fijas tipo bit en el pre-procesador de C
Publicado por: Nocturno 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);
Título: Re: Asignar variables fijas tipo bit en el pre-procesador de C
Publicado por: pocher 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.
Título: Re: Asignar variables fijas tipo bit en el pre-procesador de C
Publicado por: Nocturno 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.
Título: Re: Asignar variables fijas tipo bit en el pre-procesador de C
Publicado por: pocher 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?
Título: Re: Asignar variables fijas tipo bit en el pre-procesador de C
Publicado por: Nocturno 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}
Título: Re: Asignar variables fijas tipo bit en el pre-procesador de C
Publicado por: pocher 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.
Título: Re: Asignar variables fijas tipo bit en el pre-procesador de C
Publicado por: Nocturno 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.
Título: Re: Asignar variables fijas tipo bit en el pre-procesador de C
Publicado por: pocher 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.
Título: Re: Asignar variables fijas tipo bit en el pre-procesador de C
Publicado por: Nocturno en 18 de Abril de 2008, 02:19:07
Entonces bit_port sí indica el nº de saltos  :D
Título: Re: Asignar variables fijas tipo bit en el pre-procesador de C
Publicado por: PalitroqueZ en 10 de Mayo de 2008, 14:35:26
pocher:

leete el pdf FromAssembly2Cusing_PIC18Fxx2 a partir de la página 140 explican muy bien todo lo relacionado a  operaciones logicas a nivel de bits (en asm y traducida al c).

Título: Re: Asignar variables fijas tipo bit en el pre-procesador de C
Publicado por: pocher en 10 de Mayo de 2008, 15:06:47
Vale Pali, voy a bajarlo y pegarle una leida.