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

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

Desconectado bmb

  • PIC18
  • ****
  • Mensajes: 423
Re: No consigo apagar el LED
« Respuesta #30 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!

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re: No consigo apagar el LED
« Respuesta #31 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
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 #32 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!

Desconectado DaYeS

  • PIC16
  • ***
  • Mensajes: 119
Re: No consigo apagar el LED
« Respuesta #33 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
Si buscas resultados distintos, no hagas siempre lo mismo. Albert Einstein.

Desconectado asysxx

  • PIC10
  • *
  • Mensajes: 9
Re: No consigo apagar el LED
« Respuesta #34 en: 09 de Mayo de 2011, 01:54:06 »
Hola, viendo la situación planteada realicé un diseño, a ver que te parece.


Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re: No consigo apagar el LED
« Respuesta #35 en: 10 de Mayo de 2011, 18:00:11 »
Gracias asysxx y DaYeS, cuando tenga un momento reviso vuestras ideas.

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

Desconectado DaYeS

  • PIC16
  • ***
  • Mensajes: 119
Re: No consigo apagar el LED
« Respuesta #36 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
« Última modificación: 14 de Mayo de 2011, 15:45:49 por DaYeS »
Si buscas resultados distintos, no hagas siempre lo mismo. Albert Einstein.

Desconectado asysxx

  • PIC10
  • *
  • Mensajes: 9
Re: No consigo apagar el LED
« Respuesta #37 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.
« Última modificación: 15 de Mayo de 2011, 17:00:06 por asysxx »


 

anything