Autor Tema: Leer Puerto  (Leído 1483 veces)

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

Desconectado cvargcal

  • PIC16
  • ***
  • Mensajes: 166
Leer Puerto
« en: 03 de Junio de 2016, 15:38:06 »
Alguien sabe porque solo puedo capturar hasta el valor "IN8"
¿Que falta?

No Logro capturar IN9, IN10,IN11, IN12
cuando censo IN9 envia "000" censa algo, pero no captura el bit
Código: C
  1. //******* Leer Entradas *****************
  2.  
  3. int32 entradas;
  4. int8   salidas;
  5. int8   Temp1,Temp2;
  6. int8   alerta_entradas1=0, alerta_entradas2=0;
  7.  
  8. void leer_entradas(void){
  9.    entradas = 0;
  10.    Temp1 = input_a();                                       // Leer todo PORTA
  11.    
  12.    if (bit_test(Temp1,0)) bit_set(entradas,5);     // Leer bit 0 (A0) de Temp y guardar en el bit 5 entradas (IN 6)
  13.    if (bit_test(Temp1,1)) bit_set(entradas,4);     // Leer bit 1 (A1) de Temp y guardar en el bit 4 entradas (IN 5)  
  14.    if (bit_test(Temp1,2)) bit_set(entradas,3);     // Leer bit 2 (A2) de Temp y guardar en el bit 3 entradas (IN 4)  
  15.    if (bit_test(Temp1,3)) bit_set(entradas,2);    // Leer bit 3 (A3) de Temp y guardar en el bit 2 entradas (IN 3)  
  16.    if (bit_test(Temp1,4)) bit_set(entradas,1);    // Leer bit 4 (A4) de Temp y guardar en el bit 1 entradas (IN 2)  
  17.    if (bit_test(Temp1,5)) bit_set(entradas,0);    // Leer bit 5 (A5) de Temp y guardar en el bit 0 entradas (IN 1)
  18.    
  19.    Temp2 = input_b();                                       // Leer todo PORTB
  20.      
  21.    if (bit_test(Temp2,7)) bit_set(entradas,6);    // Leer bit 7 (B7) de Temp2 y guardar en el bit 6 entradas (IN 7)
  22.    if (bit_test(Temp2,6)) bit_set(entradas,7);    // Leer bit 6 (B6) de Temp2 y guardar en el bit 7 entradas (IN 8)
  23.  
  24.    if (bit_test(Temp2,5)) bit_set(entradas,8);     // Leer bit 5 (B5) de Temp2 y guardar en el bit 8   entradas (IN 9)  
  25.    if (bit_test(Temp2,4)) bit_set(entradas,9);     // Leer bit 4 (B4) de Temp2 y guardar en el bit 9   entradas (IN 10)  
  26.    if (bit_test(Temp2,3)) bit_set(entradas,10);   // Leer bit 3 (B3) de Temp2 y guardar en el bit 10 entradas (IN 11)  
  27.    if (bit_test(Temp2,2)) bit_set(entradas,11);   // Leer bit 2 (B2) de Temp2 y guardar en el bit 11 entradas (IN 12)
  28.  
  29.  
  30. //******* Cambios en Entradas ***********
  31. void alert_in()                                 //  Tarea #1
  32. {
  33.  /*<<< Consulta estado de entradas  >>>*/  
  34.    alerta_entradas1 = input_change_a();   // Censar entradas 1,2,3,4,5,6 (Si hay un cambio, envia alerta)
  35.    alerta_entradas2 = input_change_b();   // Censar entradas 7,8,9,10,11 (Si hay un cambio, envia alerta)
  36.    
  37.    if((alerta_entradas1 || alerta_entradas2))  
  38.    {
  39.       leer_entradas();              // Consulta estado de entradas
  40.       leer_salidas();               // Consulta estado de salidas
  41.      
  42.        if (SEND_DATA())  
  43.        {
  44.          fprintf(uart1,"##%s:%X:%3X##\r\n",ID,salidas,entradas);   // >
  45.          fprintf(uart1,"%c",0x1A);                                 // Ctrol+z
  46.          fprintf(debug,"##%s:%X:%3X##\r\n",ID,salidas,entradas);   // >
  47.        }
  48.    }
  49.    fprintf(debug,"Tarea #:Alerta Entradas\r\n");
  50. }
  51. }
« Última modificación: 03 de Junio de 2016, 16:21:12 por cvargcal »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Leer Puerto
« Respuesta #1 en: 03 de Junio de 2016, 18:33:40 »
el codigo funciona, o deberia, ya que IN1 a IN8 funciona. el bit_Set y test_bit admiten todo tipo de variable, de 8 , 16 y 32.

Solo queda queda una configuracion de algun modulo.

Desconectado cvargcal

  • PIC16
  • ***
  • Mensajes: 166
Re:Leer Puerto
« Respuesta #2 en: 03 de Junio de 2016, 22:34:51 »
...

Gracias por comentar.
haciendo un debug, veo que si funciona. pero el valor se esta guardando en decimal...
para que esta linea funcione :
Código: [Seleccionar]
fprintf(uart1,"##%s:%X:%3X##\r\n",ID,salidas,entradas); ¿o de que forma convierto ese valor a hex?

« Última modificación: 03 de Junio de 2016, 22:54:40 por cvargcal »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Leer Puerto
« Respuesta #3 en: 03 de Junio de 2016, 22:44:51 »
empecemos por una cosa. El valor si o si se guarda en binario, no hay otra forma de guardarlo. Toda la electronica digital se basa en binario.

Que se decida representar luego ese binario en sistema decimal o hexadecimal no cambia que este guardado como binario. el fprint tendra que lidiar con ese binario para pasarlo a ASCII y asi enviarlo por la UART, lo cual sigue siendo binario.

------------

Por lo que veo en la imagen, solo los bits 9 y 10 correspondientes a ( IN10 e IN11 ) entraron al IF y pusieron a 1 sus bits correspondientes.

Eso te dice que al menos lo que es leer_entradas() funciona. ( en tu codigo le falta un "}" para cerrar la funcion de leer_entradas() )

Luego habra que verificar paso por paso que es lo que se esta enviando.
« Última modificación: 03 de Junio de 2016, 22:47:08 por KILLERJC »

Desconectado cvargcal

  • PIC16
  • ***
  • Mensajes: 166
Re:Leer Puerto
« Respuesta #4 en: 03 de Junio de 2016, 22:50:23 »
...
Gracias, La idea es mandar la trama "FFF" al un servidor.
Un segundo después, encontré la solución
Código: C
  1. fprintf(uart1,"##%s:%X:%3LX##\r\n",ID,salidas,entradas);
Tenia que poner %3LX   :mrgreen:

ahora si funciona correctamente.