Autor Tema: No consigo apagar el LED  (Leído 9920 veces)

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

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
No consigo apagar el LED
« en: 05 de Mayo de 2011, 18:08:27 »
Hola compañeros; sigo intentando aprender el control de los PICs. Tengo un programa bastante simple y no consigo que funcione al 100%, el problema lo tengo en el ultimo while, a la hora de apagar el led  por muchas combinaciones que le haga no se apaga.
Código: CSS
  1. void main()
  2. {
  3.    set_tris_a(0b00000000);
  4.    set_tris_b(0b00000011);
  5.    output_low(PIN_B3);
  6.    
  7.    while(input(PIN_B0)==0 && input(PIN_B1)==0)
  8.    {
  9.       output_low(PIN_B3);
  10.    }
  11.    
  12.    while(input(PIN_B0)==1)
  13.    {
  14.       if(input(PIN_B1)==1)
  15.          output_high(PIN_B3);
  16.    }
  17.    
  18.    sleep();
  19.    
  20.    while(input(PIN_B1)==1)
  21.    {
  22.       if(input(PIN_B0)==1)
  23.          output_low(PIN_B3);
  24.    }
  25. }
Alguien puede decirme que hago mal.

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

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: No consigo apagar el LED
« Respuesta #1 en: 05 de Mayo de 2011, 19:10:10 »
  Antes que nada aclaro que no uso CCS y además que sé muy poco de dicho compilador. Veo que antes del último while hacés una llamada a la función sleep(); ¿No será que el PIC está entrando en modo sleep y al no salir de allí nunca procesará tu último while?
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado AKENAFAB

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3227
Re: No consigo apagar el LED
« Respuesta #2 en: 05 de Mayo de 2011, 19:44:17 »
Sino tienes alguna interrupción activada no saldrás del sleep como ya te comento Angelcris.

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: No consigo apagar el LED
« Respuesta #3 en: 06 de Mayo de 2011, 01:47:13 »
Además de eso, has puesto como condición para salir del primer while la pulsación de cualquiera de las dos teclas. Sin embargo, en el segundo while, sólo se encenderá el led si tienes las dos teclas pulsadas simultáneamente.
Sólo si fueras capaz de pulsarlas en el mismo microsegundo tu programa funcionaría bien, lo cual es prácticamente imposible. Creo que cuando quites el sleep, te encontrarás con que el led jamás enciende.

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re: No consigo apagar el LED
« Respuesta #4 en: 06 de Mayo de 2011, 04:01:56 »
Gracias a todos por responder, perdon por el sleep se me olvido quitarlo de cuando hacia pruebas pero aun asi no se apaga, referente a lo que comenta Manolo intentare explicar como lo razono yo.

Código: CSS
  1. while(input(PIN_B0)==0 && input(PIN_B1)==0)
Mientras el PIN_B0 sea 0 y PIN_B1 sea 0
Código: CSS
  1. output_low(PIN_B3);
El Led conectado al PIN_B3 estara apagado
Código: CSS
  1. while(input(PIN_B0)==1)
  2.    {
  3.       if(input(PIN_B1)==1)
  4.          output_high(PIN_B3);
  5.    }
Mientras el PIN_B0 esta pulsado si pulsamos el PIN_B1 encendemos el Led, hasta aqui funciona, el problema es a la hora de apagarlo
Código: CSS
  1. while(input(PIN_B1)==1)
  2.    {
  3.       if(input(PIN_B0)==1)
  4.          output_low(PIN_B3);
  5.    }
Mientras tengamos pulsado el PIN_B1 si pulsamos el PIN_B0 apagamos el Led, aqui no se apaga permanece encendido y no entiendo el porque.

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

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: No consigo apagar el LED
« Respuesta #5 en: 06 de Mayo de 2011, 04:44:58 »
Tienes razón, confundí mi razonamiento y debe funcionar como tú dices.
En este caso, no creo que no se apague, sino que vuelve a encenderse tan rápido que no te das ni cuenta.
Ponle un while (1); al final para que el PIC no se reinicie y verás cómo se apaga.

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re: No consigo apagar el LED
« Respuesta #6 en: 06 de Mayo de 2011, 05:54:09 »
Gracias Manolo pero el problema persiste, seguire investigando y os cuento.

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

Desconectado pablomanieri

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 639
Re: No consigo apagar el LED
« Respuesta #7 en: 06 de Mayo de 2011, 09:25:55 »
Hola, como tienes conectados los pulsadores o teclas, con resistencias pull-up o con resistencias pull-down?.

Puedes realizar las pruebas colocando unos delays de algunos milisegundos o segundos entre los distintos whiles, para asegurarte que ese comportamiento no se deba a los rebotes de los contactos.

Además te convendría, para poder repetir la secuencia, colocar un while( 1) antes del primer while y finalizarlo al final del main.

Saludos
Pablo
« Última modificación: 06 de Mayo de 2011, 09:30:02 por pablomanieri »

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re: No consigo apagar el LED
« Respuesta #8 en: 06 de Mayo de 2011, 12:30:01 »
 :5] :5] :5] :5] :5] :5] :5] :5] :5] :5] :5]
 :D
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado gera

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2188
Re: No consigo apagar el LED
« Respuesta #9 en: 06 de Mayo de 2011, 12:37:35 »
Yo creo que la forma mas facil de apagar el led es cortandole una de las patitas jajaja :D

"conozco dos cosas infinitas: el universo y la estupidez humana. Y no estoy muy seguro del primero." A.Einstein

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re: No consigo apagar el LED
« Respuesta #10 en: 06 de Mayo de 2011, 12:57:47 »
Que malo que eres  :D
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado asysxx

  • PIC10
  • *
  • Mensajes: 9
Re: No consigo apagar el LED
« Respuesta #11 en: 06 de Mayo de 2011, 13:53:15 »
En el código que muestras veo varios ciclos while, que hace que ciertas condiciones se repitan ciclicamente, pero ademas tienes que tener otro while global, para que el test se repita indefinidamente.

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re: No consigo apagar el LED
« Respuesta #12 en: 06 de Mayo de 2011, 14:05:25 »
Eso es lo que acabo de probar pero no funciona como deberia, la unica manera que funciona " AL 50% " o sea que enciende y apaga, pero apaga  sea cual sea el orden de los pulsadores  es de la manera que posteo el codigo.
Pero como es logico no se repite por falta del while global, pero me pasa que al poner while(TRUE){ antes del primer while y cerrar dicho while global despues del while(TRUE) del do deja de funcionar.
Código: CSS
  1. void main()
  2. {
  3.    set_tris_a(0b00000000);
  4.    set_tris_b(0b00000011);
  5.    output_low(PIN_B3);
  6.    
  7.       while(input(PIN_B0)==1 && input(PIN_B1)==1)
  8.       {
  9.          output_low(PIN_B3);
  10.       }
  11.    
  12.       while(input(PIN_B0)==0)
  13.       {
  14.          if(input(PIN_B1)==0)
  15.             output_high(PIN_B3);    
  16.       }
  17. do{        
  18.       while(input(PIN_B1)==0)
  19.       {
  20.          if(input(PIN_B0)==0)
  21.             output_low(PIN_B3);
  22.       }
  23. }while(TRUE);
  24. }
:x

Miquel_S
« Última modificación: 06 de Mayo de 2011, 14:33:50 por Miquel_S »
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: No consigo apagar el LED
« Respuesta #13 en: 06 de Mayo de 2011, 15:00:26 »
No se ve nada raro.. Lo estas simulando o probando en hardware real?
No contesto mensajes privados, las consultas en el foro

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re: No consigo apagar el LED
« Respuesta #14 en: 06 de Mayo de 2011, 15:42:05 »
Hola Suky, con hardware real.
Os dejo el codigo entero aunque no influye para nada.
Código: CSS
  1. /**************************************************************************************/
  2. /* ** Prueba de control Domotico para habitacion
  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 ----> RB3
  7. /* ** Si detecta SENSOR A / SENSOR B Entramos
  8. /* ** Si detecta SENSOR B / SENSOR A Salimos
  9. /* ** Autor: Miquel Servera
  10. /* ** Fecha: 30-Abril-2011
  11. /* ** Modelo de Micro: PIC16F88
  12.  
  13. /*************************************************************************************/
  14.  
  15. /* ** Archivo con definicion de registros y bits del microcontrolador elegido ** */
  16.  
  17. #include <16F88.h>
  18.  
  19. /* ** Configuracion de los Fuses del microcontrolador ** */
  20.  
  21. #fuses INTRC_IO,NOWDT,PUT,NOBROWNOUT,NOLVP,NOCPD,NOWRT,NODEBUG,NOPROTECT,MCLR
  22.  
  23. /* ** Frecuencia del oscilador ** */
  24.  
  25. #use delay(clock=4000000)
  26.  
  27. /* ** Configuracion de puertos ** */
  28.  
  29. #use fast_io(a)
  30. #use fast_io(b)
  31.  
  32. /* ** Include para el USART ** */
  33.  
  34. //#use rs232(baud=19200,xmit=PIN_B5,rcv=PIN_B2)
  35.  
  36. /* ** Variables de uso global ** */
  37.  
  38. //int Personas;     // Variable personas que entran o salen.-
  39.  
  40. void main()
  41. {
  42.    set_tris_a(0b00000000);
  43.    set_tris_b(0b00000011);
  44.    output_low(PIN_B3);
  45.    
  46.       while(input(PIN_B0)==1 && input(PIN_B1)==1)
  47.       {
  48.          output_low(PIN_B3);
  49.       }
  50.    
  51.       while(input(PIN_B0)==0)
  52.       {
  53.          if(input(PIN_B1)==0)
  54.             output_high(PIN_B3);    
  55.       }
  56. do{        
  57.       while(input(PIN_B1)==0)
  58.       {
  59.          if(input(PIN_B0)==0)
  60.             output_low(PIN_B3);
  61.       }
  62. }while(TRUE);
  63. }

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