Autor Tema: No me incrementa variable  (Leído 3266 veces)

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

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
No me incrementa variable
« en: 01 de Mayo de 2011, 19:00:09 »
Hola,  tengo un problema con una variable que no se incrementa y no consigo ver el porque, alguien podria echarme una mano.
Código: CSS
  1. /**************************************************************************************/
  2. /* ** Prueba de control Domotico para habitacion de matrimonio
  3. /* ** Encendemos/Apagamos luces con control de sensores en la entrada
  4. /* ** SENSOR A (Sensor de entrada) ----> RB0
  5. /* ** SENSOR B (Sensor de salida) ----> RB1
  6. /* ** LUCES ----> RA6
  7.  
  8. /* ** Autor: Miquel Servera
  9. /* ** Fecha: 30-Abril-2011
  10. /* ** Modelo de Micro: PIC16F88
  11.  
  12. /*************************************************************************************/
  13.  
  14. /* ** Archivo con definicion de registros y bits del microcontrolador elegido ** */
  15.  
  16. #include <16F88.h>
  17.  
  18. /* ** Configuracion de los Fuses del microcontrolador ** */
  19.  
  20. #fuses INTRC,NOWDT,PUT,NOBROWNOUT,NOLVP,NOCPD,NOWRT,NODEBUG,NOPROTECT,MCLR
  21.  
  22. /* ** Frecuencia del oscilador ** */
  23.  
  24. #use delay(clock=4000000)
  25.  
  26. /* ** Configuracion de puertos ** */
  27.  
  28. #use fast_io(a)
  29. #use fast_io(b)
  30.  
  31. /* ** Include para el USART ** */
  32.  
  33. //#use rs232(baud=19200,xmit=PIN_B5,rcv=PIN_B2)
  34.  
  35. /* ** Variables de uso global ** */
  36.  
  37. int Personas;     // Variable personas que entran o salen.-
  38.  
  39. void main()
  40. {
  41.    set_tris_a(0x00);
  42.    set_tris_b(0b00000011);
  43.    do
  44.    {
  45.       if(input(PIN_B0)==0)    // Exploramos sensor de entrada.-
  46.       {
  47.          output_a(0b10000000);   // Si entra alguien encendemos la luz.-
  48.          ++Personas;             // y contamos la gente que entra.-
  49.       }
  50.       if(input(PIN_B1)==0)    // Exploramos sensor de salida.-
  51.       {
  52.          Personas--;                // Contamos la gente que sale.-
  53.          if(Personas ==0)           // Si no queda nadie.-
  54.             output_a(0b00000000);   // Apagamos luces.-
  55.       }
  56.    }
  57.    while(1);
  58. }
Gracias y un saludo a todos.

Miquel_S
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado bmb

  • PIC18
  • ****
  • Mensajes: 423
Re: No me incrementa variable
« Respuesta #1 en: 01 de Mayo de 2011, 21:34:05 »
Hola Miguel_S, acabo de simular el código y corre perfecto; yo buscaría el problema en el circuito o simulador que estás usando.

Saludos!

Desconectado hector.ar

  • PIC10
  • *
  • Mensajes: 22
Re: No me incrementa variable
« Respuesta #2 en: 01 de Mayo de 2011, 22:08:41 »
Ese código tiene un pequeño defecto:
Es extremadamente sensible al ancho del pulso de conteo. Si cuando pasa una persona se genera un pulso demasiado angosto, no la cuenta y si es un poco mas ancho de lo necesario, la puede contar repetidas veces.

Saludos!
Héctor

Desconectado bmb

  • PIC18
  • ****
  • Mensajes: 423
Re: No me incrementa variable
« Respuesta #3 en: 01 de Mayo de 2011, 22:41:47 »
Hola hector.ar , el primer caso: "Si cuando pasa una persona se genera un pulso demasiado angosto", no creo que se llegue a dar (tendría que pasar la persona demasiado rápido  :shock:), en cambio en el segundo caso tienes toda la razón y si se puede dar; e incluso si la persona se queda parada frente al sensor, la variable se incrementaría en cada ciclo del programa desbordando la variable y empezando de nuevo desde 0.  Bueno, eso es algo que Miquel_S puede corregir facilmente.

Saludos!

Desconectado hector.ar

  • PIC10
  • *
  • Mensajes: 22
Re: No me incrementa variable
« Respuesta #4 en: 01 de Mayo de 2011, 22:54:31 »
Citar
no creo que se llegue a dar (tendría que pasar la persona demasiado rápido  )

No conocemos el circuito como para afirmarlo, quizas puso algún monoestable o un pequeño capacitor en serie, para que sólo se produzca un pulso.
Saludos!
Héctor

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re: No me incrementa variable
« Respuesta #5 en: 02 de Mayo de 2011, 03:28:15 »
Gracias a los dos, efectivamente como dice hector.ar tengo un pequeño condensador para evitar rebotes, por lo demas tendre que revisar la simulacion para ver el porque no funciona.
Tengo dos pulsadores que simulan los sensores A y B, pero aunque cuente tres pulsaciones en A, al darle una vez al B se me apaga el led.
Os dejo la simulacion.

Saludos.
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado hector.ar

  • PIC10
  • *
  • Mensajes: 22
Re: No me incrementa variable
« Respuesta #6 en: 02 de Mayo de 2011, 08:42:13 »
Entonces el problema es claro, tu no puedes con el pulsador en forma manual generar un pulso de unos pocos microsegundos, minimamente serán milisegundos, por lo tanto cada vez que accionas un pulsador contaras miles de personas, pero cuando restas con el segundo pulsador, por la forma que hicistes el programa no puedes tener numeros negativos y queda en cero.
Saludos!
Héctor

Desconectado bmb

  • PIC18
  • ****
  • Mensajes: 423
Re: No me incrementa variable
« Respuesta #7 en: 02 de Mayo de 2011, 09:44:05 »
Entonces el problema es claro, tu no puedes con el pulsador en forma manual generar un pulso de unos pocos microsegundos, minimamente serán milisegundos, por lo tanto cada vez que accionas un pulsador contaras miles de personas, pero cuando restas con el segundo pulsador, por la forma que hicistes el programa no puedes tener numeros negativos y queda en cero.
Saludos!
Héctor

Hola, con lo que dices al principio me estás dando la razón.  Por otra parte, si a la variable Personas que es de tipo int le restas con el segundo pulsador, al llegar a cero no se queda allí, sino que pasa a 255 y sigue restando.

Miguel_S, en la simulación que subiste efectivamente se apaga el LED al pulsar el botón B. Para evitar esto y que puedas observar el funcionamiento simplemente insértale unos delays después de cada incremento y decremento de la variable así:

Código: C
  1. .
  2.    Personas++;
  3.    delay_ms(100);
  4.    .
  5.    .
  6.    .
  7.    Personas--;                 // Contamos la gente que sale.-        
  8.    delay_ms(100);
  9.    .

Ahí si podrás ver el funcionamiento correcto, excepto en el caso que dejes activado uno de los pulsadores, cosa que puedes solucionar muy facilmente con software como te dije antes.

Saludos!

Desconectado hector.ar

  • PIC10
  • *
  • Mensajes: 22
Re: No me incrementa variable
« Respuesta #8 en: 02 de Mayo de 2011, 10:51:07 »
Citar
Hola, con lo que dices al principio me estás dando la razón.  Por otra parte, si a la variable Personas que es de tipo int le restas con el segundo pulsador, al llegar a cero no se queda allí, sino que pasa a 255 y sigue restando.
Si la variable Personas puede tomar valores negativos, pero no se encenderá el led y seguirá estando apagado.
Saludos!
Héctor

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re: No me incrementa variable
« Respuesta #9 en: 02 de Mayo de 2011, 12:26:31 »
Gracias de nuevo, ya habia probado lo del delay, lo que queria era que funcionara sin el. Por eso habia hecho el circuito antirrebotes.
Pero por lo visto en la simulacion no funciona  8)

Miquel_S
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado bmb

  • PIC18
  • ****
  • Mensajes: 423
Re: No me incrementa variable
« Respuesta #10 en: 02 de Mayo de 2011, 19:30:31 »
Gracias de nuevo, ya habia probado lo del delay, lo que queria era que funcionara sin el. Por eso habia hecho el circuito antirrebotes.
Pero por lo visto en la simulacion no funciona  8)

Miquel_S

Bueno, creo que aquí hubo un malentendido, porque lo de los delays era para que vieras que la variable si se incrementaba (Titulo del hilo).  Con respecto a lo que mencionas:

... cosa que puedes solucionar muy facilmente con software como te dije antes.

Por aquí te dejo una manera de solucionarlo con banderas y eliminando los delays:

Código: C
  1. #include <16F88.h> /* ** Configuracion de los Fuses del microcontrolador ** */
  2.  
  3. #fuses INTRC,NOWDT,PUT,NOBROWNOUT,NOLVP,NOCPD,NOWRT,NODEBUG,NOPROTECT,MCLR
  4.  /* ** Frecuencia del oscilador ** */
  5. #use delay(clock=4000000)
  6.  /* ** Configuracion de puertos ** */
  7. #use fast_io(a)
  8. #use fast_io(b)
  9.  /* ** Include para el USART ** */ //
  10. #use rs232(baud=19200,xmit=PIN_B5,rcv=PIN_B2)
  11.  
  12.  /* ** Variables de uso global ** */
  13.  
  14. int Personas = 0;     // Variable personas que entran o salen.
  15. int1 prev_entra = false, prev_sale = false;
  16.  
  17. void main()
  18. {  
  19.    set_tris_a(0x00);  
  20.    set_tris_b(0b00000011);  
  21.    
  22.    do  
  23.    {      
  24.       if(!input(PIN_B0) && !prev_entra)   // Exploramos sensor de entrada.-      
  25.       {        
  26.          output_a(0b10000000);            // Si entra alguien encendemos la luz.-        
  27.          Personas++;                      // y contamos la gente que entra.-      
  28.          prev_entra = true;
  29.       }
  30.       else if(input(PIN_B0) && prev_entra)
  31.          prev_entra = false;
  32.          
  33.       if(!input(PIN_B1) && !prev_sale)    // Exploramos sensor de salida.-      
  34.       {        
  35.          Personas--;                      // Contamos la gente que sale.-
  36.          if(Personas == 0)                // Si no queda nadie.-            
  37.             output_a(0b00000000);         // Apagamos luces.-      
  38.            
  39.          prev_sale = true;
  40.       }
  41.       else if(input(PIN_B1) && prev_sale)
  42.          prev_sale = false;
  43.            
  44.    }   while(1);
  45. }

Me queda la curiosidad de como manejaras lo del sensor de entrada y el de salida en la puerta de una habitación, para que cada sensor 'sepa' que la persona entra o sale?  A menos que la habitación tenga una puerta de entrada y otra de salida!

Saludos!

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re: No me incrementa variable
« Respuesta #11 en: 03 de Mayo de 2011, 04:07:00 »
Gracias por tu respuesta bmb, referente a como manejare lo de los sensores, la idea es que si primero detecta A y luego B entras y si detecta B y luego A sales.
Pille la idea en el foro  :D

Saludos.
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado bmb

  • PIC18
  • ****
  • Mensajes: 423
Re: No me incrementa variable
« Respuesta #12 en: 03 de Mayo de 2011, 08:34:26 »
Gracias por tu respuesta bmb, referente a como manejare lo de los sensores, la idea es que si primero detecta A y luego B entras y si detecta B y luego A sales.
Pille la idea en el foro  :D

Saludos.

Ahh, que bien.  Sería interesante ajustar el programa para que interprete esas secuencias.

Saludos!

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re: No me incrementa variable
« Respuesta #13 en: 03 de Mayo de 2011, 10:55:21 »
En eso estamos bmb, en eso estamos  :D

Miquel_S
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.


 

anything