Autor Tema: Tengo una pregunta sobre Freescale, como testeo un pulsador y prendo un led?  (Leído 13378 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado cicloide2

  • PIC18
  • ****
  • Mensajes: 359
Re: Tengo una pregunta sobre Freescale, como testeo un pulsador y prendo un led?
« Respuesta #15 en: 14 de Mayo de 2012, 20:11:40 »
Perdon SUKY, no te entiendo el en respuesta a cual de mis dudas el #?

Desconectado cicloide2

  • PIC18
  • ****
  • Mensajes: 359
Re: Tengo una pregunta sobre Freescale, como testeo un pulsador y prendo un led?
« Respuesta #16 en: 14 de Mayo de 2012, 20:40:09 »
Por que esta sentencia for no tiene condicional, me refiero a que se inicializa la variable y se le da el abance pero no tiene condicion es valido ? como es que funciona pues hasta ahora las habia bisto con condicionales <,>,>=,<= o = pero asi no, la saque del ejemplo aue posteo Juanml.

  while (PTAD_PTAD0) for (temp=100; temp; temp--);     

Desconectado Suky

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Tengo una pregunta sobre Freescale, como testeo un pulsador y prendo un led?
« Respuesta #17 en: 14 de Mayo de 2012, 21:02:56 »
Perdon SUKY, no te entiendo el en respuesta a cual de mis dudas el #?

 :tongue: Mira el siguiente post: http://www.todopic.com.ar/foros/index.php?topic=20332.msg153958#msg153958 Como publicar códigos, así no quedan un par de  8) en el medio  ;-)
No contesto mensajes privados, las consultas en el foro

Desconectado juanml

  • PIC10
  • *
  • Mensajes: 30
Re: Tengo una pregunta sobre Freescale, como testeo un pulsador y prendo un led?
« Respuesta #18 en: 14 de Mayo de 2012, 22:24:38 »
Por que esta sentencia for no tiene condicional, me refiero a que se inicializa la variable y se le da el abance pero no tiene condicion es valido ? como es que funciona pues hasta ahora las habia bisto con condicionales <,>,>=,<= o = pero asi no, la saque del ejemplo aue posteo Juanml.

  while (PTAD_PTAD0) for (temp=100; temp; temp--);     

Es una comparación lógica. Cuando temp tiene un valor, es verdadero. Cuando es 0 es falso.

Desconectado cicloide2

  • PIC18
  • ****
  • Mensajes: 359
Re: Tengo una pregunta sobre Freescale, como testeo un pulsador y prendo un led?
« Respuesta #19 en: 15 de Mayo de 2012, 19:32:53 »
Gracias suky.

Desconectado cicloide2

  • PIC18
  • ****
  • Mensajes: 359
Re: Tengo una pregunta sobre Freescale, como testeo un pulsador y prendo un led?
« Respuesta #20 en: 15 de Mayo de 2012, 19:51:16 »
Hola Juanml   

Es lo mismo si se escrivo esto:
 
Código: C
  1. for (temp=100; temp; temp--);

de estamanera o el efecto es totalmente diferente?

Código: C
  1. for (temp=0; temp<100; temp++);

Otra pregunta, es lo mismo :

Código: C
  1. while (PTAD_PTAD0)

que

Código: C
  1. while(PTAD_PTAD0==1)

Gracias.



« Última modificación: 15 de Mayo de 2012, 20:11:04 por cicloide2 »

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: Tengo una pregunta sobre Freescale, como testeo un pulsador y prendo un led?
« Respuesta #21 en: 15 de Mayo de 2012, 20:44:03 »
Hola, desde el punto de vista lógico son los mismo, ahora cuando utilizas las primeras expresiones ( del for y del if ) son mas eficientes a nivel código generado porque no es lo mismo comparar específicamente con un valor determinado ( en el caso del for pregunta si es menor que 100 y en el caso del if preguntar si es igual a 1 ) que directamente preguntar si es distinto de 0, a todos los micros lo segundo le cuesta menos.

Saludos !

Desconectado cicloide2

  • PIC18
  • ****
  • Mensajes: 359
Re: Tengo una pregunta sobre Freescale, como testeo un pulsador y prendo un led?
« Respuesta #22 en: 15 de Mayo de 2012, 23:25:06 »
 En tonces, es conveniente aplicar :

Código: C
  1. for (temp=100; temp; temp--);

y

Código: C
  1. 1.while (PTAD_PTAD0)

esta ultima siepre y cuando quiera compara contra 1 caso contrario debo escribir:

Código: C
  1. 1.while(PTAD_PTAD0==0)

Aca no hay alternativa o si?
« Última modificación: 23 de Mayo de 2012, 23:28:22 por cicloide2 »

Desconectado cicloide2

  • PIC18
  • ****
  • Mensajes: 359
Re: Tengo una pregunta sobre Freescale, como testeo un pulsador y prendo un led?
« Respuesta #23 en: 15 de Mayo de 2012, 23:37:33 »
Otra duda o mejo dicho, copie y probe el codigo que publico Juanml, y cada vez que precionava el pulsador fucionaba, pero al soltarlo y querer volver a actibar la secuencia de parpadeo fallaba, como que la secuencia de antirebote no terminaba, y por lo tanto no dejaba que el parpadeo comience de nuevo , al pulsar una tercera vez si tomaba al pulsador como buano.
Le hice una modificacion y asi cad vez que se preciona entra en el ciclo infinito espero ser corregido pues no se si esta bien lo que hice:

Original:
Código: C
  1. #include <hidef.h> /* for EnableInterrupts macro */        
  2. #include "derivative.h" /* include peripheral declarations */        
  3. #include <MC9S08SH8.h>
  4.  
  5.  
  6. void delay_100us(void) { //Retardo de aprox. 100ms        
  7. char cont;        
  8. cont=20;        
  9.  
  10. asm {          
  11.  
  12. loop:      nop //1 ciclo                
  13.      nop        
  14.      dbnz cont,loop //        
  15.  
  16.  }      
  17.  
  18. }          
  19.  
  20. void main(void) {        
  21.   int i;        
  22.   unsigned char parpadea=1;        
  23.   unsigned int temp;        
  24.   SOPT1 = 0x02; //Deshabilito watchdog        
  25.   ICSC1=0x14; //Reloj interno, divido por 4 (CLK=8Mhz,BUS_CLK=2Mhz)        
  26.   PTBDD_PTBDD0=1; //Configuro el bit 0 del puerto B como salida        
  27.   PTADD_PTADD0=0; //Configuro el bit 0 del puerto A como entrada        
  28.   PTAPE_PTAPE0=1; //Configuro la resistencia pull-up de PTAD0        
  29.   EnableInterrupts;        
  30.  
  31.   for(;;) {        
  32.   if (!parpadeo);        
  33.                    
  34.   {        
  35.  
  36.   PTBD_PTBD0=1; //Pongo el bit 0 del puerto B en 1        
  37.   for (i=0; i<3000; i++) //Espero aprox. 300ms        
  38.     {        
  39.   delay_100us(); //Llamo función de retardo        
  40.     }        
  41.   PTBD_PTBD0=0; //Pongo el bit 0 del puerto B en 0        
  42.   for (i=0; i<3000; i++) //Espero aprox. 300ms        
  43.       {        
  44.     delay_100us(); //Llamo función de retardo        
  45.     }        
  46.   }        
  47.   if (PTAD_PTAD0) //Chequeo si el switch está presionado        
  48.   {        
  49.   while (PTAD_PTAD0) for (temp=100; temp; temp--);        
  50.   parpadea=!parpadea;          
  51.   }        
  52.   } /* loop forever */        
  53.   /* please make sure that you never leave main */        
  54. }

Modificado:
       
 
Código: C
  1. #include <hidef.h> /* for EnableInterrupts macro */        
  2. #include "derivative.h" /* include peripheral declarations */        
  3. #include <MC9S08SH8.h>
  4.  
  5.  
  6. void delay_100us(void) { //Retardo de aprox. 100ms        
  7. char cont;        
  8. cont=20;        
  9.  
  10. asm {          
  11.  
  12. loop:      nop //1 ciclo                
  13.      nop        
  14.      dbnz cont,loop //        
  15.  
  16.  }      
  17.  
  18. }          
  19.  
  20. void main(void) {        
  21.   int i;        
  22.   unsigned char parpadea=0;         //inicialice la varible en cero
  23.   unsigned int temp;        
  24.   SOPT1 = 0x02; //Deshabilito watchdog        
  25.   ICSC1=0x14; //Reloj interno, divido por 4 (CLK=8Mhz,BUS_CLK=2Mhz)        
  26.   PTBDD_PTBDD0=1; //Configuro el bit 0 del puerto B como salida        
  27.   PTADD_PTADD0=0; //Configuro el bit 0 del puerto A como entrada        
  28.   PTAPE_PTAPE0=1; //Configuro la resistencia pull-up de PTAD0        
  29.   EnableInterrupts;        
  30.  
  31.   for(;;) {        
  32.   if (!parpadea)
  33.   while (PTAD_PTAD0) for (temp=100; temp; temp--); //recopie esta linea aca        
  34.   parpadea=!parpadea;                   //recopie esta linea aca
  35.   {        
  36.  
  37.   PTBD_PTBD0=1; //Pongo el bit 0 del puerto B en 1        
  38.   for (i=0; i<3000; i++) //Espero aprox. 300ms        
  39.     {        
  40.   delay_100us(); //Llamo función de retardo        
  41.     }        
  42.   PTBD_PTBD0=0; //Pongo el bit 0 del puerto B en 0        
  43.   for (i=0; i<3000; i++) //Espero aprox. 300ms        
  44.       {        
  45.     delay_100us(); //Llamo función de retardo        
  46.     }        
  47.   }        
  48.   if (PTAD_PTAD0) //Chequeo si el switch está presionado        
  49.   {        
  50.   while (PTAD_PTAD0) for (temp=100; temp; temp--);        
  51.   parpadea=!parpadea;          
  52.   }        
  53.   } /* loop forever */        
  54.     /* please make sure that you never leave main */
  55.          
  56. }
Cual es el objetivo de anular el watchdog y cual el de dejarlo activado

Gracias .
« Última modificación: 27 de Octubre de 2015, 11:09:38 por xocas »

Desconectado juanml

  • PIC10
  • *
  • Mensajes: 30
Re: Tengo una pregunta sobre Freescale, como testeo un pulsador y prendo un led?
« Respuesta #24 en: 16 de Mayo de 2012, 00:16:36 »
A mi me funciona perfecto el código. Podrá ser que pulsador que usás no esté en buen estado? Probá con distintos valores para la variable temp.

Desconectado ema

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1078
Re: Tengo una pregunta sobre Freescale, como testeo un pulsador y prendo un led?
« Respuesta #25 en: 16 de Mayo de 2012, 00:21:36 »
Código: C
  1. while(PTAD_PTAD0==0)
Aca no hay alternativa o si?

Si hay!
Código: C
  1. while(!PTAD_PTAD0)

Saludos
« Última modificación: 27 de Octubre de 2015, 11:10:05 por xocas »

Desconectado cicloide2

  • PIC18
  • ****
  • Mensajes: 359
Re: Tengo una pregunta sobre Freescale, como testeo un pulsador y prendo un led?
« Respuesta #26 en: 16 de Mayo de 2012, 18:37:05 »
Gracias Juanml voy hacer lo que me dices y comento.
Gracias ema.

Saludos. :-/

Desconectado cicloide2

  • PIC18
  • ****
  • Mensajes: 359
Re: Tengo una pregunta sobre Freescale, como testeo un pulsador y prendo un led?
« Respuesta #27 en: 16 de Mayo de 2012, 19:30:56 »
A mi me funciona perfecto el código. Podrá ser que pulsador que usás no esté en buen estado? Probá con distintos valores para la variable temp.

Probe aumentando y bajando y me falla, cambie el pulsador y me falla.

Cuando apretas y soltas rapidmente o con intervalos cortos entre pulsacion no te pasa nada?

Lo depure con balores muy bajos y paso a paso y funciona pero cuando lo hago correr me falla asi :
1)Energizo el micro y en ese momento el led destella una vez.
2) Preciono el pulsador, el led entra en el bucle parpadea, lo suelto y rapidamente lo aprieto y no entra en el ciclo y lo buelvo a apretar y entra, es como una falla intermitente, seguire probando cualquier cosa abiso

saludos.

Desconectado cicloide2

  • PIC18
  • ****
  • Mensajes: 359
Re: Tengo una pregunta sobre Freescale, como testeo un pulsador y prendo un led?
« Respuesta #28 en: 21 de Mayo de 2012, 21:43:57 »
HOLA SE ME OCURRIO EN HACER ESTA PRACTICA PERO NO SE ME OCURRE COMO HACERLA, PRECIONAR UN PULSADOR n veses y cuando el valor n sea alcanzado encende un led.

Pense en utilizar la sentencia if para chequear el pulsador y cuando este este precionado aumentar el valor de una variable en un punto (prebiamemente estaria inicializada en cero), pero de esta manera si dejo precionado el pulsador la variable se incrementaria descontroladamente y terminaria encendiendo el led de forma instantanea y lo que pretendo es que cada vez que el pulsador se precione la variable se incremente y si dejo precionado el pulsador sea tomado como un pulso y no como una sucecion de pulsos asi la tenga precionada (exajerando, un dia completo ) , basicamente una pulsacion por vez un incremento esto es lo que no logro decifrar.

Al que responda desde ya agradecido,(solo quiero un empujon no el codigo recuerden que estoy aprendiendo)

Saludos  :) :-/ :)  
« Última modificación: 22 de Mayo de 2012, 21:57:12 por cicloide2 »

Desconectado diguito_69

  • PIC16
  • ***
  • Mensajes: 136
Re: Tengo una pregunta sobre Freescale, como testeo un pulsador y prendo un led?
« Respuesta #29 en: 21 de Mayo de 2012, 23:36:29 »
Hola, tendrías que esperar a que se suelte el pulsador dentro del if, algo así
Código: [Seleccionar]
while(!PULSADOR) ; deberia funcionar.

Saludos.
"Carezco de un don especial. Sólo soy apacionadamente curioso". Albert Einstein.


 

anything