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

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

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5474
    • Electrónica Didacta
Re: No consigo apagar el LED
« Respuesta #15 en: 06 de Mayo de 2011, 15:43:00 »
¿y funciona sin el retardo anti-rebote?
La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re: No consigo apagar el LED
« Respuesta #16 en: 06 de Mayo de 2011, 16:07:42 »
Si, lo tengo montado por hardware, resistencia y condensador.
« Última modificación: 06 de Mayo de 2011, 17:05:00 por Miquel_S »
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re: No consigo apagar el LED
« Respuesta #17 en: 06 de Mayo de 2011, 17:15:12 »
Si, lo tengo montado por hardware, resistencia y condensador.
Me autorespondo, estoy dudando del circuito antirrebotes que tengo montado, segun esta formula:

http://www.kedo.com.mx/modules/newbb/viewtopic.php?topic_id=25&post_id=34#forumpost34

Tengo un tiempo de carga de 2000us y un tiempo de descarga de 1000us, excesivos creo, voy a revisar primeramente este apartado.

PD: Los resultados de las formulas del enlace que expongo mas arriba son erroneos, los 20ms y los 10ms deben us.

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

Desconectado bmb

  • PIC18
  • ****
  • Mensajes: 423
Re: No consigo apagar el LED
« Respuesta #18 en: 06 de Mayo de 2011, 20:54:51 »
Hola Miguel_S, siguiendo la sugerencia que te habían hecho pablomanieri y asysxx, le cambié la posición al do while(), para que abarque todas las instrucciones while(), lo simulé y funciona bien según la lógica que expusiste antes.

Código: C
  1. void main()
  2. {  
  3.    set_tris_a(0b00000000);  
  4.    set_tris_b(0b00000011);  
  5.    output_low(PIN_B3);          
  6.    do
  7.    {  
  8.       while(input(PIN_B0)==1 && input(PIN_B1)==1)      
  9.       {        
  10.          output_low(PIN_B3);      
  11.       }        
  12.      
  13.       while(input(PIN_B0)==0)      
  14.       {        
  15.          if(input(PIN_B1)==0)            
  16.             output_high(PIN_B3);          
  17.       }
  18.              
  19.       while(input(PIN_B1)==0)      
  20.       {        
  21.          if(input(PIN_B0)==0)            
  22.             output_low(PIN_B3);      
  23.       }
  24.    }
  25.    while(TRUE);
  26. }

Este es el código para detectar la secuencia de los sensores del otro hilo?

Saludos!
« Última modificación: 06 de Mayo de 2011, 20:58:42 por bmb »

Desconectado gera

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2188
Re: No consigo apagar el LED
« Respuesta #19 en: 06 de Mayo de 2011, 21:32:25 »
Pero para que finalice el programa no es mas facil no poner el while principal y listo?

"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 #20 en: 07 de Mayo de 2011, 04:58:51 »
Hola bmb, lo del do while() tambien lo habia probado pero sin el resultado correcto, ya que el led enciende pero no permanece encendido, aunque con Proteus si funciona con hardware real no es asi.
Pero para que finalice el programa no es mas facil no poner el while principal y listo?
Hola gera, perdon pero no entiendo muy bien tu pregunta, ya que si quitamos el while principal el bucle no se repite.

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

Desconectado bmb

  • PIC18
  • ****
  • Mensajes: 423
Re: No consigo apagar el LED
« Respuesta #21 en: 07 de Mayo de 2011, 10:03:28 »
Hola Miguel_S, la simulación la había hecho con MPLAB SIM, para poder ver el comportamiento de los registros y como te comenté funciona de acuerdo a la lógica que quieres.  Ahora que mencionaste al Proteus, acabo de montar la simulación también en ese programa y una vez más funciona muy bien.  Creo que lo mejor sería que subieras el diagrama del circuito con el que estás trabajando, porque por software no presenta ningún problema.

Saludos!

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re: No consigo apagar el LED
« Respuesta #22 en: 07 de Mayo de 2011, 11:28:07 »
Os paso el esquema de como lo tengo montado en la realidad.
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado bmb

  • PIC18
  • ****
  • Mensajes: 423
Re: No consigo apagar el LED
« Respuesta #23 en: 07 de Mayo de 2011, 11:56:41 »
Hola Miguel_S, al circuito que subiste (no subiste el .hex ó el .cof) le cambio los pulsadores por switches (para el caso en que se deben tener los dos accionados a la vez), le pongo el .hex del código que te mostré el un post anterior y funciona!

Saludos!

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re: No consigo apagar el LED
« Respuesta #24 en: 07 de Mayo de 2011, 12:41:51 »
Si es verdad con switches funciona pero asi no vale  :mrgreen: ya que a la entrada de la habitacion tendras dos sensores de infrarrojos, los cuales una vez que hayas pasado no sera como un switch que se queda cerrado y siempre pasa la corriente hasta que se vuelva a abrir, por eso uso pulsadores para simular los sensores.

Y parecia facil eso de encender y apagar un led :D :D

Miquel_S
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 #25 en: 07 de Mayo de 2011, 19:27:25 »
Hola Miguel, la otra vez que vi tu post en realidad estaba super-apurado y no tuve tiempo de analizar tu algoritmo, solo se me ocurrió sugerirte que repitieras el test que validen los ciclos while. Ahora con un poco mas de tiempo trato de encontrarle un sentido a tu programa y me parece que está mal enfocado. En primer lugar tienes varios ciclos while, que en realidad no trabajan como tal, porque le haces que repita haciendo lo mismo todo el tiempo.
Te explico, cuando pones un ciclo while es para que durante todas las veces que se cumpla la condición haga algo, si lo que hace no es diferente siempre bastaba ponerle un if ...then.
Ahora si tienes un proceso que en el tiempo van sucediendo los eventos, tendrías que encadenar ciclos while, es decir whiles dentro de otros while asegurándose de que las condiciones se cumplan siempre y no te salgas de los ciclos.

Prender y apagar un led es muy fácil, el problema es hacer el diagrama de flujo en el tiempo de nuestro proceso, y luego traducirlo al c. Allí vas a ver que tu enfoque está dejando de tener en cuenta que el micro realiza millones de operaciones por segundo.  Una solución posible es manejar variables que guarden en que parte de tu proceso se encuentra un evento como pulsar un botón, así cuando realices la comparación tengas en cuenta en que parte del proceso estás.

Trata de explicar un poco mas claro lo que deseas realizar, que yo trabajo en alarmas y te puedo dar una mano con los sensores.

Desconectado bmb

  • PIC18
  • ****
  • Mensajes: 423
Re: No consigo apagar el LED
« Respuesta #26 en: 07 de Mayo de 2011, 20:43:51 »
Si es verdad con switches funciona pero asi no vale  :mrgreen: ya que a la entrada de la habitacion tendras dos sensores de infrarrojos, los cuales una vez que hayas pasado no sera como un switch que se queda cerrado y siempre pasa la corriente hasta que se vuelva a abrir, por eso uso pulsadores para simular los sensores.

Y parecia facil eso de encender y apagar un led :D :D

Miquel_S

Hola Miguel_S,  yo creo que debería valer.  Entiendo que son dos sensores infrarojos, pero no importa que tipo de dispositivo active las entradas del PIC. Según la forma en que planteas tu código, habrá momentos en que estén activos a la vez.  A mi entender cuando dices en el segundo while():

Código: C
  1. while(input(PIN_B0)==0)      
  2.       {        
  3.          if(input(PIN_B1)==0)            
  4.             output_high(PIN_B3);          
  5.       }

... estás diciendo que si mientras está a 0 la entrada en RB0, también se pone a 0 la segunda entrada en RB1 (los dos sensores a la vez!) es cuando se encenderá el LED.  Lo de los switches es solo porque no encontré la forma de tener presionados los dos pulsadores a la vez en proteus.  Lo mismo aplicaría para el caso del tercer while().

De todos modos yo te sugeriría que intentes resolverlo de otra manera, porque ese tipo de programación en donde dejas detenido el programa con instrucciones while() anidadas no es muy recomendable si el microcontrolador tuviese que estar pendiente de otras tareas.

Saludos!

Desconectado DaYeS

  • PIC16
  • ***
  • Mensajes: 119
Re: No consigo apagar el LED
« Respuesta #27 en: 07 de Mayo de 2011, 21:51:43 »
Que tal Miguel, no se si habrás solucionado el problema ya, pero viendo para que quieres el código yo te sugiero que lo hagas con interrupciones, de esta manera podrás dejar el micro dormido, o profundamente dormido.

No me acuerdo que micro estabas utilizando, pero mira si tiene deep sleep, te consumira en torno de nA, y con la posibilidad de que cuando tengas una interrupción, en este caso el flanco da lo mismo, que se reinicie el micro, su funcionamiento normal en deep.

De esta manera soló deberas poner las condiciones al principio del programa, despues el deep y ya esta. No hará falta que dejes el micro trabajando dentro de un while.

Lo único que no me acuerdo de cabeza si el deep sleep al entrar en el deja las salidas en el estado que estaban, sino en sleep consumira un poco más, unos 5 o 6 microA, y el sleep seguro que si que te deja el estado.

Salu2.
Si buscas resultados distintos, no hagas siempre lo mismo. Albert Einstein.

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re: No consigo apagar el LED
« Respuesta #28 en: 08 de Mayo de 2011, 04:27:56 »
Gracias a todos por vuestras respuestas, como lo que hago lo hago por la simple razon de que me gusta este mundo y me gusta aprender, no porque sea mi trabajo que la verdad me arrepiento voy a darle un nuevo enfoque y a empezarlo de cero.
Trata de explicar un poco mas claro lo que deseas realizar, que yo trabajo en alarmas y te puedo dar una mano con los sensores.
Primero quiero dejar claro que la idea no fue mia la cogi prestada del foro http://www.todopic.com.ar/foros/index.php?topic=34531.msg288568#msg288568 lo que estaba probando es muy simple, queremos encender la luz de una habitacion olvidandonos de los interruptores o conmutadores de toda la vida, por lo cual ponemos dos sensores A Y B a la entrada de dicha habitacion, si primero se activa A y despues B el micro sabra que estamos entrando encendera la luz e incrementara una variable y si primero se activa B y despues A sabra que estamos saliendo y decrementara dicha variable hasta que hayan salido los mismos que han entrado  y al estar esta a cero se apagara la luz.

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

Desconectado bmb

  • PIC18
  • ****
  • Mensajes: 423
Re: No consigo apagar el LED
« Respuesta #29 en: 08 de Mayo de 2011, 14:50:42 »
Hola Miguel_S, me gustaría dejarte una idea de como puedes hacer tu programa utilizando banderas.  He escrito un pequeño programa del que espero puedas tomar algunas ideas, en el que se asume que la persona al entrar a la habitación activa secuencialmente primero el sensor en RB0 y luego activa el sensor en RB1, pero nunca los dos sensores a la vez.  Luego para salir, la persona activa los sensores en secuencia contraria, nuevamente sin activar los dos a la vez.  A primera vista puede parecer algo complicado, pero si lo analizas con detenimiento, verás que no lo es tanto.

Código: C
  1. #include <16F88.h>
  2. #device adc=10
  3.  
  4. #FUSES NOWDT                    //No Watch Dog Timer
  5. #FUSES PUT                      //Power Up Timer
  6. #FUSES INTRC_IO
  7. #FUSES NOBROWNOUT               //No brownout reset
  8. #FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
  9. #FUSES NOFCMEN                  //Fail-safe clock monitor disabled
  10. #FUSES NOIESO                   //Internal External Switch Over mode disabled
  11.  
  12. #use delay(clock=4000000)
  13.  
  14. #define LED PIN_A7
  15.  
  16. #byte portb = 0x06
  17.  
  18. int personas = 0;
  19. int1 sensor_B0 = true, sensor_B1 = true;
  20. int1 anterior_1 = false, anterior_2 = false;
  21.  
  22. void main()
  23. {
  24.  
  25.    while(true)
  26.    {
  27.       switch(portb & 0x03)             // Revisar el estado de RB0 y RB1
  28.       {
  29.          case 2:
  30.          {
  31.             if(!anterior_2)
  32.             {
  33.                if(!sensor_B1)           // Si está saliendo una persona...
  34.                {
  35.                   personas--;
  36.                   sensor_B0 = true;
  37.                   sensor_B1 = true;
  38.                   anterior_1 = false;
  39.                   anterior_2 = true;
  40.                   break;
  41.                }
  42.  
  43.                sensor_B0 = false;
  44.             }
  45.             break;
  46.          }
  47.          case 1:
  48.          {
  49.             if(!anterior_1)
  50.             {
  51.                if(!sensor_B0)           // Si está entrando una persona...
  52.                {
  53.                   personas++;
  54.                   sensor_B0 = true;
  55.                   sensor_B1 = true;
  56.                   anterior_2 = false;
  57.                   anterior_1 = true;
  58.                   break;
  59.                }
  60.  
  61.                sensor_B1 = false;
  62.             }
  63.             break;
  64.          }
  65.          default:
  66.          {
  67.             anterior_1 = false;
  68.             anterior_2 = false;
  69.          }
  70.       }
  71.       if(personas == 0)
  72.          output_low(LED);
  73.       else
  74.          output_high(LED);      
  75.    }
  76. }

Si respetas las secuencias de entrada y salida, te funciona con la simulación que subiste en Proteus con los pulsadores.

Saludos!
« Última modificación: 08 de Mayo de 2011, 15:16:32 por bmb »