Autor Tema: como leer solo los 5 primeros bits de un puerto?  (Leído 1234 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado johenrod

  • PIC18
  • ****
  • Mensajes: 265
como leer solo los 5 primeros bits de un puerto?
« en: 20 de Agosto de 2022, 14:26:12 »
cordial saludo, tan amables si pueden ayudarme.
tengo el puerto b y requiero leer los 5 bits menos significativos 0-4, el bit 5 no lo uso y el 6 y  7 para la comunicación tx rx.
en el momento hago algo como esto:

 if ((!input_state(stop))&&(input_state(izq))&&(input_state(der))&&(input_state(medias)))

el detalle es que lleva como 12 estructuras de estas.
hay alguna forma de leer estos 5 primeros bits sin afectar los demás y pasarlos a una variable?
gracias de antemano
Si algo parece complicado... es por que esta mal explicado.

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1937
    • Sicoy
Re:como leer solo los 5 primeros bits de un puerto?
« Respuesta #1 en: 20 de Agosto de 2022, 15:57:39 »
cordial saludo, tan amables si pueden ayudarme.
tengo el puerto b y requiero leer los 5 bits menos significativos 0-4, el bit 5 no lo uso y el 6 y  7 para la comunicación tx rx.
en el momento hago algo como esto:

 if ((!input_state(stop))&&(input_state(izq))&&(input_state(der))&&(input_state(medias)))

el detalle es que lleva como 12 estructuras de estas.
hay alguna forma de leer estos 5 primeros bits sin afectar los demás y pasarlos a una variable?
gracias de antemano

Lo que suele hacerse es enmascarar al puerto con una constante, por ejemplo sería sí:

Código: C
  1. miVariable = PORTX & 0x3F; // 0x3F es 00111111 en binario, y al realizar un and lógico con el puerto elimino el bit 6 y 7 de PORTX

Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Conectado Eduardo2

  • PIC24F
  • *****
  • Mensajes: 965
Re:como leer solo los 5 primeros bits de un puerto?
« Respuesta #2 en: 20 de Agosto de 2022, 16:04:29 »
Otra manera: Definiendo una estructura.

Código: [Seleccionar]
struct {int8 data:5 ;} port ;
#byte port = getenv("SFR:PORTB")

Y si se trata de comparar diferentes estados:

Código: [Seleccionar]
    switch(port.data) {   // solo usa los 5 primeros bits
        case 0b1000 :
            ..........
            ..........
            break ;
        case 0b1010 :
            ..........
            ..........
            break ;
        case 0b1011 :
            ..........
            ..........
            break ;
       ...............

Desconectado johenrod

  • PIC18
  • ****
  • Mensajes: 265
Re:como leer solo los 5 primeros bits de un puerto?
« Respuesta #3 en: 20 de Agosto de 2022, 18:46:39 »

Lo que suele hacerse es enmascarar al puerto con una constante, por ejemplo sería sí:

Código: C
  1. miVariable = PORTX & 0x3F; // 0x3F es 00111111 en binario, y al realizar un and lógico con el puerto elimino el bit 6 y 7 de PORTX

Citar
Publicado por: Eduardo2
« en: Hoy a las 16:04:29 »Insertar Cita
Otra manera: Definiendo una estructura.

Código: [Seleccionar]
struct {int8 data:5 ;} port ;
#byte port = getenv("SFR:PORTB")

Y si se trata de comparar diferentes estados:

Código: [Seleccionar]
    switch(port.data) {   // solo usa los 5 primeros bits
        case 0b1000 :
            ..........
            ..........
            break ;
        case 0b1010 :
            ..........
            ..........
            break ;
        case 0b1011 :
            ..........
            ..........
            break ;
       ...............
Muchas gracias a ambos voy a implementarlo y pasarlo a mis notas para consultar.
solo una pregunta
Código: C
  1. struct {int8 data:5 ;} port ;
  2. #byte port = getenv("SFR:PORTB")
esta parte la coloco antes de los define?
« Última modificación: 20 de Agosto de 2022, 18:59:23 por johenrod »
Si algo parece complicado... es por que esta mal explicado.

Desconectado Robert76

  • PIC24F
  • *****
  • Mensajes: 571
Re:como leer solo los 5 primeros bits de un puerto?
« Respuesta #4 en: 20 de Agosto de 2022, 22:24:35 »
Hola, debes usar una máscara aplicando AND entre el puerto y una constante 0x1F.

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1937
    • Sicoy
Re:como leer solo los 5 primeros bits de un puerto?
« Respuesta #5 en: 20 de Agosto de 2022, 23:59:10 »
Hola, debes usar una máscara aplicando AND entre el puerto y una constante 0x1F.

Con 0x1F eliminarías el bit 7, 6 y 5. Y el OP sólo desea eliminar al 7 y el 6.
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado Robert76

  • PIC24F
  • *****
  • Mensajes: 571
Re:como leer solo los 5 primeros bits de un puerto?
« Respuesta #6 en: 21 de Agosto de 2022, 09:26:14 »
Hola, debes usar una máscara aplicando AND entre el puerto y una constante 0x1F.

Con 0x1F eliminarías el bit 7, 6 y 5. Y el OP sólo desea eliminar al 7 y el 6.
En el comentario del compañero, manifiesta que el bit 5 no lo usa y el 6 y 7 para comunicación.
« Última modificación: 21 de Agosto de 2022, 09:28:51 por Robert76 »

Desconectado tsu_electronica

  • PIC18
  • ****
  • Mensajes: 274
Re:como leer solo los 5 primeros bits de un puerto?
« Respuesta #7 en: 21 de Agosto de 2022, 17:41:15 »
también puedes comparar, primero lees el puerto y si es mayor a 0x1f lo descartas si es menor o igual pues sigues con tu programa.

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1937
    • Sicoy
Re:como leer solo los 5 primeros bits de un puerto?
« Respuesta #8 en: 21 de Agosto de 2022, 17:52:00 »
Hola, debes usar una máscara aplicando AND entre el puerto y una constante 0x1F.

Con 0x1F eliminarías el bit 7, 6 y 5. Y el OP sólo desea eliminar al 7 y el 6.
En el comentario del compañero, manifiesta que el bit 5 no lo usa y el 6 y 7 para comunicación.

Tienes toda la razón
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1937
    • Sicoy
Re:como leer solo los 5 primeros bits de un puerto?
« Respuesta #9 en: 21 de Agosto de 2022, 18:04:46 »
también puedes comparar, primero lees el puerto y si es mayor a 0x1f lo descartas si es menor o igual pues sigues con tu programa.

No estoy seguro de eso. Suponiendo que deseo conocer, digamos el estado del bit 0, y el instante que realice la lectura, el bit 7 esté en 1 lógico, eso me daría un valor mayor a 0x1F, y por esa razón desecharía una lectura válida.

Es más, como menciona que usa el UART, y dicho módulo este en espera de lectura o escritura de datos, los bit 7 y 6 estarían permanentemente en 1 lógico y por lo tanto el valor siempre sería mayor que 0x1F y nunca podría obtener el valor de los otros bits.
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado Robert76

  • PIC24F
  • *****
  • Mensajes: 571
Re:como leer solo los 5 primeros bits de un puerto?
« Respuesta #10 en: 21 de Agosto de 2022, 20:03:20 »
Añadiendo un poco más a la decodificación de pines del puerto que nos interesa.
Se puede hacer un decodificador de aproximación sucesiva por soft obviamente.
Preguntando si el bit 4 está en 1, sino... seguimos con el bit 3 y asi sucesivamente.

Desconectado tsu_electronica

  • PIC18
  • ****
  • Mensajes: 274
Re:como leer solo los 5 primeros bits de un puerto?
« Respuesta #11 en: 21 de Agosto de 2022, 22:16:40 »
DominusDRR como dices posiblemente siempre puede estar marcando por así decirlo ese error pero ya con esa premisa podemos ajustar a 0xdf si esta igual o por debajo seguiría el programa pero es solo una opción y concuerdo que la mejor es enmascarar con un and al final y recordando el puerto uart esta en el puerto c así que el puerto b estaría libre pero si esta usando el puerto b eso quiere decir que es un micro de pocos pines y lo esta usando por código y no por uart así que no siempre estarán los pines en alto y puede que funcione la comparación pero bueno ya el amigo johenrod nos comentara que le funciono o que uso

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1937
    • Sicoy
Re:como leer solo los 5 primeros bits de un puerto?
« Respuesta #12 en: 21 de Agosto de 2022, 22:28:52 »
DominusDRR como dices posiblemente siempre puede estar marcando por así decirlo ese error pero ya con esa premisa podemos ajustar a 0xdf si esta igual o por debajo seguiría el programa

No creo que ni con eso, ya que me parece que generalmente  la transmisión y recepción trabajan de manera sincrónica, es decir solamente se está transmitiendo o solo recibiendo, por lo tanto siempre estará el bit 7 en 1 lógico mientras el bit 6 está cambiando o viceversa, el bit 7 cambiando y el bit 6 en 1 lógico.

Tendría que transmitir y recibir al mismo tiempo para que el algún momento el bit 7 y 6 estén ambos en 0 lógico y obtener un valor menor que 0x1F.
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado tsu_electronica

  • PIC18
  • ****
  • Mensajes: 274
Re:como leer solo los 5 primeros bits de un puerto?
« Respuesta #13 en: 21 de Agosto de 2022, 22:41:10 »
hay si difiero la uart es transmisión y recepción asíncrona y como comento no importaría la comparación ya que al parecer hace la comunicación por código ósea que no usa el puerto uart integrado así que el tiempo en el que lee el puerto y en el que después envía o recibe es diferente ya que como no es por el puerto solo hasta que pasa a la parte del código es cuando estaría poniendo en alto los pines a diferencia de usar el puerto uart que siempre en todo momento estaría en alto pero insisto ya el amigo nos dirá su experiencia si es que fuera o no

Desconectado johenrod

  • PIC18
  • ****
  • Mensajes: 265
Re:como leer solo los 5 primeros bits de un puerto?
« Respuesta #14 en: 30 de Agosto de 2022, 13:38:24 »
cordial saludo, gracias a todos realice una and  entre el puerto b y 0X1F (0B00011111) como solo necesito chequear los 5 primeros bits me salio al pelo, realice los 3 primeros ejemplos y ambos anduvieron.
Citar
Publicado por: DominusDRR

Lo que suele hacerse es enmascarar al puerto con una constante, por ejemplo sería sí:

miVariable = PORTX & 0x3F; // 0x3F es 00111111 en binario, y al realizar un and lógico con el puerto elimino el bit 6 y 7 de PORTX

Citar
Publicado por: Eduardo2
« en: 20 de Agosto de 2022, 16:04:29 »Insertar Cita
Otra manera: Definiendo una estructura.

Código: [Seleccionar]
struct {int8 data:5 ;} port ;
#byte port = getenv("SFR:PORTB")

Y si se trata de comparar diferentes estados:

Código: [Seleccionar]
    switch(port.data) {   // solo usa los 5 primeros bits
        case 0b1000 :
            ..........
            ..........
            break ;
        case 0b1010 :
            ..........
            ..........
            break ;
        case 0b1011 :
            ..........
            ..........
            break ;
       ...............

Citar
Publicado por: Robert76
« en: 20 de Agosto de 2022, 22:24:35 »Insertar Cita
Hola, debes usar una máscara aplicando AND entre el puerto y una constante 0x1F.

mil gracias a todos..
« Última modificación: 30 de Agosto de 2022, 21:01:14 por johenrod »
Si algo parece complicado... es por que esta mal explicado.


 

anything