Autor Tema: agrupar bits de entrada en una sola variable  (Leído 2157 veces)

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

Desconectado Vanesa

  • PIC10
  • *
  • Mensajes: 29
agrupar bits de entrada en una sola variable
« 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!

Desconectado atani123

  • PIC10
  • *
  • Mensajes: 31
Re: agrupar bits de entrada en una sola variable
« Respuesta #1 en: 04 de Diciembre de 2006, 08:57:10 »
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)

Desconectado Vanesa

  • PIC10
  • *
  • Mensajes: 29
Re: agrupar bits de entrada en una sola variable
« Respuesta #2 en: 04 de Diciembre de 2006, 09:33:37 »
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

Desconectado djpalas

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 595
    • Microtronic
Re: agrupar bits de entrada en una sola variable
« Respuesta #3 en: 04 de Diciembre de 2006, 09:53:58 »
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
Código: [Seleccionar]
....
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
Código: [Seleccionar]
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]

« Última modificación: 04 de Diciembre de 2006, 10:54:01 por djpalas »

Saludos desde Cádiz, España
Web personal: http://www.microtronic.es