TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Vanesa en 04 de Diciembre de 2006, 08:31:41
-
Hola!!
Estamos utilizando el compilador de C CCS y queríamos saber si es posible agrupar los bits de una serie de entradas en una sola variable.
Me explico:
Tenemos como entradas los pines del puerto A: 0, 1, 2 y 3 y queremos realizar una función switch con esos 4 bits y ninguno más del puerto A. Utilizando el puerto A al completo sería poner: switch (port_a) siendo port_a la variable que agrupa todos los bits de entrada. El caso es hacer lo mismo pero con una serie de pines determinados.
Muchas gracias!
-
No se si te ayudara, ya que apenas conozco el CCS pero prueba algo como esto
variable = (A3 & 8) + (A2 & 4) + (A1 & 2) + (A0 & 1)
-
muchas gracias atanil!!
Ahora vamos a probar con tu idea, y si no, probaremos con algo similar a ello que se nos ha ocurrido al ver tu fórmula, y que consistiría en el bit 4 rotarlo 4 posiciones a la izquierda, el bit 3, 3 posiciones... y luego sumarlos todos, que creo que el resultado es el mismo que tú propones.
Al final no era tan complicado, únicamente había que caer en la cuenta...
Gracias otra vez y ya te contaremos qué pasa
-
Hola Vanesa!!
Según como lo veo yo, puede hacerlo de 2 maneras. La primera es algo parecido a lo que atani123 te ha comentado y la segunda la veo como estructuras.
1ª: Enmascaramos el puertoA
....
switch(PuertoA & 0x0F) // PuertoA es el completo, pero solo utilizamos los LSB [PIN_A0...3]
{
case ...
...... ...
}
....
Es lo mismo que atani123 dijo, pero mejorado en optimización de tiempo y numero de operaciones. "El tiempo es nuestro enemigo :D"
2º: Este aún lo veo yo más mejorado en tiempo, usando estructuras
- Cuando estés configurando el dispositivo y las variables globales, puedes definir una struct que apunte a la dirección de memoria del puertoA
struct port_a_struc {
int dato : 4; // datos desde [Pin_A0 .... A3]
int unuser:4; // el resto como no lo usamos
} port_a_mod;
#locate port_a_mod = getenv("sfr:PORTA")
....
....
// Cuando quieras usarlo entonces el switch es así
switch(port_a_mod.dato) // Solo utilizamos los LSB [PIN_A0...3]
{
case ...
...... ...
}
....
Saludos y espero que te sirva de ayuda!
Atte. Diego Jesús
[goear]5748c0f[/goear]