Autor Tema: input_change_x en CCS  (Leído 2633 veces)

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

Desconectado f_leyva

  • PIC10
  • *
  • Mensajes: 6
input_change_x en CCS
« en: 30 de Noviembre de 2016, 12:28:44 »
Hola a todos. Es la primera vez que me escribo aqui en el foro para resolver una duda, que es la siguiente:
estoy tratando de usar la instrucción "input_change_x" en CCS ya que lo que pretendo hacer es que el PIC detecte un cambio de estado logico alto a un estado logico bajo en el puerto B pero solo en los pines RB5-RB2 se que puede lograrse con las interrupciones por cambio de estado en el puerto B, sin embargo el uso de las interrupciones causa que el programa haga cosas "raras". Espero puedan guiarme con este pequeño problema. Gracias!

Desconectado AleSergi

  • PIC16
  • ***
  • Mensajes: 214
Re:input_change_x en CCS
« Respuesta #1 en: 30 de Noviembre de 2016, 13:00:54 »
¿Y tu código?...   Es que no somos adivinos.

Desconectado f_leyva

  • PIC10
  • *
  • Mensajes: 6
Re:input_change_x en CCS
« Respuesta #2 en: 30 de Noviembre de 2016, 14:43:11 »
Claro olvide poner el codigo
este es el segmento de codigo que no me da:

 while(1)
   {
      output_low(PIN_C2);
     
      int pin_check = input_change_b();
      int filtro = pin_check & 0b00111100;
      putc(filtro);
     
      if(filtro != 0b00111100 || pin_check != 0b00111100)
      {
         CONTROLES = bomba_off;
      }
      gets(buffer);


Se supone que en la guia de CCS dice que devuelve un 1 si cambio y un 0 si no.
pero probe con getc y me envia un caracter eso lo paso a hex y pues tengo el estado de los puertos

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7918
Re:input_change_x en CCS
« Respuesta #3 en: 30 de Noviembre de 2016, 17:45:59 »
Por que los Int delante de pincheck y filtro??
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado AleSergi

  • PIC16
  • ***
  • Mensajes: 214
Re:input_change_x en CCS
« Respuesta #4 en: 30 de Noviembre de 2016, 18:01:27 »
Mira..  Si todo eso que has posteado de código está dentro de la interrupción,  difícil que funcione bien el programa,  resulta que las rutinas que se disparan con las interrupciones deben ser lo más cortas posibles,  por ejemplo adisionan un sumador,  cambian de estado una variable y no mucho mas.... 

Desconectado f_leyva

  • PIC10
  • *
  • Mensajes: 6
Re:input_change_x en CCS
« Respuesta #5 en: 30 de Noviembre de 2016, 21:13:47 »
Como mencione al principio, estaba usando interrupciones pero ahora no. Este segmento de codigo no se encuentra dentro de la rutina de interrupcion sino dentro del main y a su vez dentro de un ciclo while infinito para que siempre este detectando el cambio.
Lo que quiero hacer es que detecte el cambio de estado en la cual quiera de los pines RB5-RB2, por eso estoy usando la funcion input_change_x, en el momento en que lo haga saltara al estado que es bomba_off.
MGLSOFT pongo el int ya que es lo que devuelve la funcion como lo dice en la guia de CCS puede ser un int de 8 o 16 bits.

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7918
Re:input_change_x en CCS
« Respuesta #6 en: 30 de Noviembre de 2016, 22:25:30 »
Ese Int delante de la variable es una declaración, no un Cast.
Sacalo y prueba, las variables se declaran fuera de la función.
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:input_change_x en CCS
« Respuesta #7 en: 30 de Noviembre de 2016, 22:34:17 »
Citar
sin embargo el uso de las interrupciones causa que el programa haga cosas "raras".

Eso es por que esta mal programado y no por culpa de la interrupcion.

Citar
Ese Int delante de la variable es una declaración, no un Cast.

Como bien dice MGLSOFT en esta oracion que quotee. Lo que estas haciendo es crear una variable y darle un valor inicial, eso dentro del while. Mientras estes dentro de ese while, no va a volver a crear otra variable y asignarle el valor de vuelta, sino que va a seguir usando las mismas. En resumen tu programa se parece a esto:


Código: C
  1. int pin_check = input_change_b();
  2.  int filtro = pin_check & 0b00111100;
  3.  
  4.  while(1)
  5.    {
  6.       output_low(PIN_C2);
  7.      
  8.       putc(filtro);
  9.      
  10.       if(filtro != 0b00111100 || pin_check != 0b00111100)
  11.       {
  12.          CONTROLES = bomba_off;
  13.       }
  14.       gets(buffer);
  15. }

Solucion:

Código: C
  1. void main(void)
  2. {
  3.    int pin_check;          // Declaracion de la variable
  4.    int filtro;                   // Declaracion de la variable
  5.  
  6.    input_change_b();    // Actualizo al primer valor para que luego haga la diferencia, descarto el valor retornado
  7.  
  8.    while(1)
  9.    {
  10.       output_low(PIN_C2);
  11.       pin_check = input_change_b();
  12.       filtro = pin_check & 0b00111100;
  13.       putc(filtro);
  14.      
  15.       if(filtro != 0b00111100 || pin_check != 0b00111100)
  16.       {
  17.          CONTROLES = bomba_off;
  18.       }
  19.       gets(buffer);
  20.    }
  21. }

Tampoco existe necesidad de tener 2 variables para esto.. Con una sola es suficiente:

Código: C
  1. void main(void)
  2. {
  3.    int pin_check = 0;          // Declaracion de la variable
  4.  
  5.    input_change_b();    // Actualizo al primer valor para que luego haga la diferencia, descarto el valor retornado
  6.  
  7.    while(1)
  8.    {
  9.       output_low(PIN_C2);
  10.       pin_check = input_change_b() & 0b00111100;
  11.       putc(pin_check);
  12.      
  13.       if(pin_check != 0)    // Quiere decir que algun bit esta en 1, por lo tanto se detecto un cambio y accede al if
  14.       {
  15.          CONTROLES = bomba_off;
  16.       }
  17.       gets(buffer);
  18.    }
  19. }

Le cambie la condicion del if tambien.
« Última modificación: 30 de Noviembre de 2016, 22:37:04 por KILLERJC »

Desconectado f_leyva

  • PIC10
  • *
  • Mensajes: 6
Re:input_change_x en CCS
« Respuesta #8 en: 01 de Diciembre de 2016, 12:23:39 »
Gracias KILLERJC tienes toda la razón, con esto ya me doy una idea mas amplia de como funciona input_change_x aun no logro hacer que funcione como deseo pero seguiré intentando.

Desconectado f_leyva

  • PIC10
  • *
  • Mensajes: 6
Re:input_change_x en CCS
« Respuesta #9 en: 05 de Diciembre de 2016, 11:42:54 »
hola de nuevo a todos ya pude resolver la deteccion de canbio de estado sin embargo. Creé una función que detecta o espera un cambio de estado en b5-b2 si embargo al momento de insertar la funcion dentro del mail deja de hacer todo lo demas y solo detecta el cambio de estado.Creo que es un problema con el while sin embargo pongo break para romper el ciclo y aun asi no funciona. Tienen idea de que podria estar haciendo mal?? Anexo el segmento de codigo.


int wait_h_to_l()
   {
      while((input(PIN_B5) && input(PIN_B3) && input(PIN_B2)));//{     //espera cambio de estado alto a bajo
      break;
      output_high(PIN_C1);
      delay_ms(700);
      output_low(PIN_C1);
      output_low(PIN_B1);
      output_high(PIN_C2);
      printf("CBHR01\r");
      output_low(PIN_C2);
      output_low(PIN_C2);
      }


while(TRUE)
   {
      output_low(PIN_C2);
      wait_h_to_l();
      gets(buffer);
.
.
.
}

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:input_change_x en CCS
« Respuesta #10 en: 05 de Diciembre de 2016, 14:34:05 »
si ...

Un break iria dentro de un while.. en tu caso se encuentra afuera, si lo pones dentro no tendria sentido. Por lo cual ese break deberia hacer absolutamente nada, tanto afuera como adentro.

El while se queda encerrado si es que los pines B3,B2 y B5 estan en 1, cualquiera que este en 0 haria que salga del while.
Asi que en realidad no estarias esperando que se presente un cambio, sino que algun nivel este en 0.

Eso una ves por vuelta. EL problema luego surge con el gets(), pueden ocurrir 2 problemas aca..

El primero es que debido al delay y al printf que tenes en wait_h_to_l() lleguen datos a la UART, y si no se sacan a tiempo implica un OVERRUN de la UART, es decir que llegaron mas de 1 dato y como tiene lugar para 1 solo, se perdieron.

El segundo problema es que si aun asi no llego nada, deberia si o si llegarte un retorno de carro \r o 0xD si no mal recuerdo, para que el gets salga, sino sigue guardando hasta que se quede sin memoria y sobreescribiendo otras variables.


 

anything