TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Miquel_S en 05 de Mayo de 2011, 18:08:27

Título: No consigo apagar el LED
Publicado por: Miquel_S 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
Título: Re: No consigo apagar el LED
Publicado por: AngelGris 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?
Título: Re: No consigo apagar el LED
Publicado por: AKENAFAB 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.
Título: Re: No consigo apagar el LED
Publicado por: Nocturno 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.
Título: Re: No consigo apagar el LED
Publicado por: Miquel_S 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
Título: Re: No consigo apagar el LED
Publicado por: Nocturno 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.
Título: Re: No consigo apagar el LED
Publicado por: Miquel_S en 06 de Mayo de 2011, 05:54:09
Gracias Manolo pero el problema persiste, seguire investigando y os cuento.

Saludos.
Título: Re: No consigo apagar el LED
Publicado por: pablomanieri 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
Título: Re: No consigo apagar el LED
Publicado por: Miquel_S en 06 de Mayo de 2011, 12:30:01
 :5] :5] :5] :5] :5] :5] :5] :5] :5] :5] :5]
 :D
Título: Re: No consigo apagar el LED
Publicado por: gera 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
Título: Re: No consigo apagar el LED
Publicado por: Miquel_S en 06 de Mayo de 2011, 12:57:47
Que malo que eres  :D
Título: Re: No consigo apagar el LED
Publicado por: asysxx 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.
Título: Re: No consigo apagar el LED
Publicado por: Miquel_S 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
Título: Re: No consigo apagar el LED
Publicado por: Suky en 06 de Mayo de 2011, 15:00:26
No se ve nada raro.. Lo estas simulando o probando en hardware real?
Título: Re: No consigo apagar el LED
Publicado por: Miquel_S 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.
Título: Re: No consigo apagar el LED
Publicado por: PalitroqueZ en 06 de Mayo de 2011, 15:43:00
¿y funciona sin el retardo anti-rebote?
Título: Re: No consigo apagar el LED
Publicado por: Miquel_S en 06 de Mayo de 2011, 16:07:42
Si, lo tengo montado por hardware, resistencia y condensador.
Título: Re: No consigo apagar el LED
Publicado por: Miquel_S 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.
Título: Re: No consigo apagar el LED
Publicado por: bmb 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!
Título: Re: No consigo apagar el LED
Publicado por: gera 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?
Título: Re: No consigo apagar el LED
Publicado por: Miquel_S 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.
Título: Re: No consigo apagar el LED
Publicado por: bmb 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!
Título: Re: No consigo apagar el LED
Publicado por: Miquel_S en 07 de Mayo de 2011, 11:28:07
Os paso el esquema de como lo tengo montado en la realidad.
Título: Re: No consigo apagar el LED
Publicado por: bmb 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!
Título: Re: No consigo apagar el LED
Publicado por: Miquel_S 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
Título: Re: No consigo apagar el LED
Publicado por: asysxx 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.
Título: Re: No consigo apagar el LED
Publicado por: bmb 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!
Título: Re: No consigo apagar el LED
Publicado por: DaYeS 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.
Título: Re: No consigo apagar el LED
Publicado por: Miquel_S 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
Título: Re: No consigo apagar el LED
Publicado por: bmb 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!
Título: Re: No consigo apagar el LED
Publicado por: bmb en 08 de Mayo de 2011, 16:25:39
Hola Miguel_S, he descubierto un problema al simularlo con tu archivo de Proteus.  Las resistencias pullup no pueden ser genéricas.  Te adjunto un archivo comprimido con la simulación y el código fuente.

Saludos!
Título: Re: No consigo apagar el LED
Publicado por: Miquel_S en 08 de Mayo de 2011, 16:49:23
Hola bmb, primeramente darte las gracias por el enfasis que pones en esto, ya que como comente anteriormente lo hago sin ánimo de lucro, o sea por pasar un rato con todos vosotros.
La verdad es que respondo a este mensaje sin haber leido tu ejemplo, pero por complicar un poco las cosas, de ahi mis pruebas, no puedes poner los sensores tan separados para que no esten activos los dos a la vez en un momento dado. La idea es montarlos en una cajita de estas universales que miden unos 6cm x 6cm " A ojo de buen cubero " o sea activaras A pero al activar B todavia estaras delante de A.
De todos modos sigo haciendo pruebas por mi cuenta sin perder la ilusion de conseguirlo.

Miquel_S
Título: Re: No consigo apagar el LED
Publicado por: bmb en 08 de Mayo de 2011, 16:55:53
Hola Miguel_S, es con mucho gusto y no te preocupes que yo también lo hago por las mismas razones.  La idea como te dije, es solamente que tomes ideas; con unos cambios leves podrás hacer que el programa que te envié, funcione de la manera que dices.

Saludos!
Título: Re: No consigo apagar el LED
Publicado por: DaYeS en 08 de Mayo de 2011, 17:04:34
Que tal Miguel, la verdad es que la solución ofrecida por bmb parece buena, a decir la verdad no lo he probado, así que te felicito bmb por encontrar soluciones tan rápido, pero si como dices lo que quieres es aprender, creo que será mejor como te dije, por interupciones, además que si el circuito lo vas a alimentas de baterías portatiles te consumira menos.

El código que te propongo, por lo que he podido entender por tú explicación es que los sensores distan entre si una distancia, llamemosla X, nose que micro querias utilizar, pero para ir aprendiendo y no tener muchas complicaciones, y para lo que pides que haga, vale y sobra con un 16f628a, que es como el conocido 16f84, pero con mejoras, más ram, osc interno...

En css no suelo programar, pero supongo que tienes alguna manera de meter codigo asm, en HIC es asm("xxx");, supongo que será mey parecido...
Para este caso que la interrupción sea por flanco de subida o bajada nos da lo msimo.

Para medir más o menos el tiempo podemos hacer las siguientes cuentas, con un clock de 4 mhz tardaría un ciclo por instrucción (dos las de salto) así que con el clock interno sería la mitad, por lo que 2 intrucciones cada 1 microsegundo...

Si me acurdo bien, s = v*t, como s la llamamos X, sería X=v*t, así que si sepearamos los sensores unos 2 cm (0,02 m) y desde que se produce una interrupción hasta que analiza otra podremos poner unas 10 lineas de codigo, serian unos 5 microseg, quedando v=0,02/0,000005 = 4000 m/s debe de ir el objeto para que no lo detectemos.

Así que analizado tood lo anterior:
Código: [Seleccionar]
FUSES (Habilitando interrupciones general, de RB0 y RB Port Change) + info pag. 26 datasheet (GIE, INTE, RBIE) *Nota: Uno de los sensores RB0 y otro de RB4:RB7
TRISB = 0x11;          //Todo salidas menos el 4 y 0 (sensores)
void main(){
while (1){                 //bucle infinito
  asm("SLEEP");          // (Hasta que no haya una interrupción no sigue el código, y las interrupciones solo pueden ser las habilitadas por nosotros)
  if (INTF==1){           //si la interrupción a sido por b0
      while(!RBIF);      //me quedo hasta que se haga también la interrupción de RB4-RB7
            LATB = 08;  //Enciendo b3
            INTF = 0;    //Bajo bandera rb0
            RBIF = 0;    //Bajo banderas de rb4-7
  }
  if (RBIF==1){           //si la interrupción a sido por b4:7
      while(!INTF);      //me quedo hasta que se haga también la interrupción de RB0
            LATB = 08;  //Enciendo b3
            INTF = 0;    //Bajo bandera rb0
            RBIF = 0;    //Bajo banderas de rb4-7
  }
} //cierro bucle infinito y vuelvo a sleep

}

*Nota, los RB4 al RB7 que no utilicemos deberemos llevarlos a gnd o ponerlos como salida para que no generen interrupciones falsas.
**Nota: Los pines no utilizados a gnd o salida para que no se dispare el consumo.

De esta manera bajas el consumo hasta que se detecta algo. El micro como leeras en datasheet tarda unos pocos ciclos en despertarse, estamos hablando de unos 100 o 200, eso quiere decir que para nuestro proposito sobra.

Ah!!! El isis no es capaz de simular el sleep!!!

Espero no haberte pegado mucho la chapa, creo que de esta manera aprenderas más, y te pegaras con más cosas del micro. El esquema de las interrupciones lo tienes en la figura 14-14 de la pag. 106.

Salu2
Título: Re: No consigo apagar el LED
Publicado por: asysxx en 09 de Mayo de 2011, 01:54:06
Hola, viendo la situación planteada realicé un diseño, a ver que te parece.

Título: Re: No consigo apagar el LED
Publicado por: Miquel_S en 10 de Mayo de 2011, 18:00:11
Gracias asysxx y DaYeS, cuando tenga un momento reviso vuestras ideas.

Miquel_S
Título: Re: No consigo apagar el LED
Publicado por: DaYeS en 14 de Mayo de 2011, 15:33:19
Hola, viendo la situación planteada realicé un diseño, a ver que te parece.

Muy buena solución, pero por pooling y un retardo de 300 ms, ufff...

Sigo pensando que lo mejor es utilizar interrupciones y llevarlo a sleep, así consume menos y seguro que no se te escapa, y no le tienes que hacer trabajar a lo tonto al micro..

Ahh!! y sobre tu código, no sería posible en ccs poner

Código: [Seleccionar]
#define pasillo portb=40;
de esta manera ahoras 3 o 4 líneas por función y bajar el delay a 2 ms ¿?¿?. Bueno de todas maneras, como suelen decir, si funciona no lo toques, jeje.

Salu2
Título: Re: No consigo apagar el LED
Publicado por: asysxx en 15 de Mayo de 2011, 16:53:44
Bueno es una forma de solución, seguramente existen otras tantas para perfeccionarlas. Esto salió en un momento, está en vuestras manos pulirlas para ahorrar energía, recursos, algunas líneas se pueden contraer mucho con data hexadecimal, en fin.
Espero haber contribuido en algo, solamente.
En el caso de los 300ms de pausa, si les parece mucho, no lo es tanto, es una fracción del tiempo por ejemplo que podemos estar pulsando un botón. Y esto puede cambiarse adaptándolo a las condiciones de un sensor, si no hay rebotes casi no se necesitan. Eso ya es cuestión de afinar según la aplicación. El retardo puesto allí es porque hasta el proteus te genera rebotes al simular un pulsador.