Autor Tema: Leer entradas  (Leído 1679 veces)

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

Desconectado bloxons

  • PIC10
  • *
  • Mensajes: 15
Leer entradas
« en: 06 de Febrero de 2017, 12:26:35 »
Buenas gente, quería realizarles una consulta mas bien conceptual, cuando uno escribe PORTAbits.RA5, para leer la entrada, si ese pin esta configurado para ser digital, la entrada que lee es un 0 o 1 lógico? o siempre ese comando lee el valor analógico de la entrada?

Desde ya muchas gracias por su ayuda.

Desconectado Fer_TACA

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4069
Re:Leer entradas
« Respuesta #1 en: 06 de Febrero de 2017, 15:04:42 »
Si lo tienes configurado como digital solo vas a poder leer o escribir datos digitales: 1 o 0.
Nunca podrás leer un valor analógico, salvo que reconfigures el puerto y le digas que es analógico.
Todos los días se aprende algo nuevo.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Leer entradas
« Respuesta #2 en: 06 de Febrero de 2017, 21:34:36 »
Además leyendo el registro porta siempre va a ser un 1 o 0. Para leer la entrada analógica deberás usar el ADC, y si lo tenés como análogo y lees el porta creo que lees 0

Desconectado bloxons

  • PIC10
  • *
  • Mensajes: 15
Re:Leer entradas
« Respuesta #3 en: 07 de Febrero de 2017, 10:37:37 »
Muchas gracias por sus respuestas, la consulta vino a raiz de que estoy leyendo varios pines con PORTXbits.RX y transmitiendolos pero el tema es que no lo lee. por ejemplo.

#define D0  PORTAbits.RA5
#define D1  PORTEbits.RE0
#define D2  PORTEbits.RE1
#define D3  PORTEbits.RE2
#define D4  PORTBbits.RB2
#define D5  PORTBbits.RB3
#define D6  PORTBbits.RB1
#define D7  PORTBbits.RB4

    TRISAbits.TRISA5 = 1;   //D0
    TRISEbits.TRISE0 = 1;   //D1
    TRISEbits.TRISE1 = 1;   //D2
    TRISEbits.TRISE2 = 1;   //D3
    TRISBbits.TRISB2 = 1;   //D4
    TRISBbits.TRISB3 = 1;   //D5
    TRISBbits.TRISB1 = 1;   //D6
    TRISBbits.TRISB4 = 1;   //D7


    char dato1 = D7 & D6 & D5 & D4 & D3 & D2 & D1 & D0;
    UART_write(dato1);
y utilizando el hyperterminal no me transmite nada, entonces empece a dudar como era que funcionaba el comando PORTXbits.RX. Alguna sugerencia para resolver esto. Desde ya muchas gracias por sus respuetas.

Desconectado bloxons

  • PIC10
  • *
  • Mensajes: 15
Re:Leer entradas
« Respuesta #4 en: 07 de Febrero de 2017, 12:33:28 »
Y tambien tengo otra duda, en la linea char dato1 = D7 & D6 & D5 & D4 & D3 & D2 & D1 & D0; estoy tratando de concatenar los bits leídos, pero me parece que en realidad estoy haciendo una and bit a bit, no estoy muy seguro. alguien me podría orientar si es correcta esa linea para concatenar. la idea es concatenar los bits para formar el char.


Desde ya muchas gracias.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Leer entradas
« Respuesta #5 en: 07 de Febrero de 2017, 18:07:27 »
Tu problema esta en la forma de concatenar.

PORTBbits.RB1

devuelve cero o uno. No devuelve 0b00000010, es decir no devuelve la posicion del bit en 1.

Cuando haces:

Código: C
  1. char dato1 = D7 & D6 & D5 & D4 & D3 & D2 & D1 & D0;

Imaginate que quedaria asi:

Código: [Seleccionar]
1 & 1 & 0 & 1 & 0 & 1 & 0 & 1 & 0 & 1
Con uno solo que sea 0 el resultado es 0. Entonces podes hacerlo de 2 formas. O hacer una super funcion como esto:

Código: C
  1. char dato1 = (D7 << 7) | (D6 << 6) | (D5 << 5) | (D4 << 4) | (D3 << 3) | (D2 << 2) | (D1 << 1) | D0;

o podes hacerlo con ifs

Código: C
  1. char dato1 = 0;
  2. if(D7) dato1 |= (1<<7);
  3. if(D6) dato1 |= (1<<6);
  4. if(D5) dato1 |= (1<<5);
  5. if(D4) dato1 |= (1<<4);
  6. if(D3) dato1 |= (1<<3);
  7. if(D2) dato1 |= (1<<2);
  8. if(D1) dato1 |= (1<<1);
  9. if(D0) dato1 |= 1;

Desconectado bloxons

  • PIC10
  • *
  • Mensajes: 15
Re:Leer entradas
« Respuesta #6 en: 13 de Febrero de 2017, 11:05:20 »
Muchas gracias por su respuesta, hice como me dijeron pero resulta que no me convierte el dato en forma correcta, es mas me envia el valor inicial de dato1, es decir, me envia 0 o haciendo una prueba dato1 = 'a' envia a(no todo el tiempo en algunas ocaciones envia q). La cuestion es que no se si no esta adquiriendo en forma correcta es decir si no esta leyendo bien PORTX.RX o si no esta haciendo bien los if, es decir los saltea. Si alguno tiene alguna idea para comprobar por donde viene el error se los agradeceria mucho.

Desconectado Nano_T

  • PIC10
  • *
  • Mensajes: 36
Re:Leer entradas
« Respuesta #7 en: 13 de Febrero de 2017, 11:37:26 »
Buenas! Qué formato esperas recibir en tu terminal?
La opción que te dió el maestrísimo KillerJC está perfecta, creería que así vas a recibir un solo caracter porque estas llenando los espacios de los 8 bits del char, trabajo aparte es desarmarlo cuando llegue.. Otra opción tal vez sería guardar los datos en un array y recorrerlo con un for para enviarlos por serial caracter a caracter.

Salutes! Leo B.

Desconectado bloxons

  • PIC10
  • *
  • Mensajes: 15
Re:Leer entradas
« Respuesta #8 en: 15 de Febrero de 2017, 10:26:00 »
Buenas, el dispositivo que me envía el dato lo envía en ASCII, pero el tema es que el dato no es correcto, es decir me debería llegar un guion medio y en su lugar me llega el tilde. He revisado el código que me ha pasado KILLERJC y no tengo dudas con respecto a que ese código funciona correctamente. pero la cuestión es por que el dato es erroneo. Me he colgado de D0 y D1 que deberian ser los que mas cambian y son correctos. La verdad que no se por donde buscar el error, cualquier sugerencia sera muy bien recibida.
Como siempre muchas gracias por su ayuda.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Leer entradas
« Respuesta #9 en: 23 de Febrero de 2017, 15:31:58 »
Seria interesante si podes explayarte un poco mas que tenes conectado a que pensas conectarlo , como se transmite, etc.

Ejemplo: Recibo el caracter por la UART y debo sacarlo de forma paralela.
Ejemplo2: Recibo el caracter de forma paralela en ASCII nomas que los bits no estan en su orden correcto y debo luego enviarlo por UART a una PC.

Eso nos daria un poco mas de informacion de lo que veniamos viendo y manejando para encontrar el problema. Ya que no logro entender que estas intentando hacer.