TODOPIC

Otros Microcontroladores / Dispositivos programables => Microcontroladores ARM => Mensaje iniciado por: cicloide2 en 10 de Mayo de 2012, 19:14:04

Título: Tengo una pregunta sobre Freescale, como testeo un pulsador y prendo un led?
Publicado por: cicloide2 en 10 de Mayo de 2012, 19:14:04
Hola eso, como serian las lineas simples de codigo para testear un pulsador en el pinX de un puerto y en funcion de esta respuesta encender un led, en C?

Con los PIC y en asm lo se hacer pero con los Freescale y en C no, se como configurar los pines como entradas y salidas con PTXDD pero no se como atender a un pulsador, como hago esto que debe ser tan simple para lapersona que quiera responder?

Gracias. :-/ :-/ :( :-/ :-/
Título: Re: Tengo una pregunta sobre Freescale, como testeo un pulsador y prendo un led?
Publicado por: RICHI777 en 10 de Mayo de 2012, 20:20:35
Hola, siempre referite al archivo H correspondiente a tu familia. Suponete que el PORTB0 es el port de manejo del led y PORTB1 el pulsador

Código: [Seleccionar]
if ( PTBD_PTBD1 )
 {
    PTBD_PTBD0 = 1; // Prende
 }
 else
 {
    PTBD_PTBD0 = 0; // Apaga
 }

Saludos !
Título: Re: Tengo una pregunta sobre Freescale, como testeo un pulsador y prendo un led?
Publicado por: cicloide2 en 10 de Mayo de 2012, 20:38:46
Gracias RICHI777, si que sos rapido y se agradeces, ya lo estoy probando.

Muchisimas pero muchicimas  gracias, (soy novato y esto es oro, va a ser mi segunda practica). ((:-))

Estoy haciendo pruevas con el MC9S08SH8, sin cristal externo, logre hacer parpadear un led sin precicion (con la sentencia for), espero poder seguir abanzando y lograr hacerlas con precicion utilizando los TIM, con info de la web y de foros.

Salu2 y espero no te moleste si te hago alguna pregunta. :-/ :mrgreen: :-/  
Título: Re: Tengo una pregunta sobre Freescale, como testeo un pulsador y prendo un led?
Publicado por: cicloide2 en 10 de Mayo de 2012, 20:47:25
RICHI777, cuando te refieres a que me refiera (valga la redundancia) al archivo H de la familia de micro que este utilizando es la que coloca Code Warrior como #include <hidef.h> o a la #include "derivative.h" ?

Si es asi, que es lo que tengo que buscar precisamente en esta .h y como accedo a su contenido, yo probe parandome sobre ellas , boton derecho del mouse >preproces (y aparecen un monton de lineas de codigo) y las mismas cosas tanto para #include <hidef.h> como para #include "derivative.h".
Gracias.
Título: Re: Tengo una pregunta sobre Freescale, como testeo un pulsador y prendo un led?
Publicado por: RICHI777 en 10 de Mayo de 2012, 21:01:01
Hola. No, ese no. Es el que corresponde a la familia de micro que estas usando. Ejemplo, en este momento estoy usando un HCs08GW, entonces el archivo H que incluye toda la definición de ports, etc es MC9S08GW64.h

Normalmente los encontras en este folder.

..\Program Files\Freescale\CodeWarrior for Microcontrollers V6.1\lib\hc08c\device\include

Saludos !
Título: Re: Tengo una pregunta sobre Freescale, como testeo un pulsador y prendo un led?
Publicado por: cicloide2 en 10 de Mayo de 2012, 21:10:26
YA ME ESTOY FIJANDO GRACIAS. YO TENGO LA V6.3 DE CODE WARRIOR.

PERO YA ME FIJO Y COMENTO.

GRACIAS. :-/
Título: Re: Tengo una pregunta sobre Freescale, como testeo un pulsador y prendo un led?
Publicado por: cicloide2 en 10 de Mayo de 2012, 21:18:29
AHORA SI VOS DECIS, EN LA VENTANA QUE CONTIENE EL ARBOL CON TODO LO CONTENIDO EN EL PROYECTO (NORMALMENTE LA SUB VENTANA QUE CODE WARRIOR DESPLIEGA A LA IZQUIERDA DE LA VENTANA DEL CODIGO, AHI ENCONTRE EL .h QUE EN MI CASO ES main.c>derivative.h> MC9S08SH8.h (NO ESTOY UTILIZANDO PROCES EXPERT ESTOY TRATANDO DE APRENDER SIN ESTA GUIA).

SALUDOS, GRACIAS. :-/
Título: Re: Tengo una pregunta sobre Freescale, como testeo un pulsador y prendo un led?
Publicado por: cicloide2 en 13 de Mayo de 2012, 13:13:07
RICHI777 aca dejo mi umilde codigo, gracias a ti :
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 main(void) {
  7.  
  8.    
  9.     PTBD_PTBD7=0 ; //inicializo PTB7 en 0
  10.     PTBDD_PTBDD7=1;//configuro PTB7 como salida
  11.     PTBDD_PTBDD0=0;//cofiguro  PTB0 como entrada
  12.  
  13.  
  14.   EnableInterrupts; /* enable interrupts */
  15.   /* include your code here */
  16.  for(;;){
  17.  
  18.  if (PTBD_PTBD0==0) //pregunto si PTB0 es igual a 0
  19.        
  20.        PTBD_PTBD7=1;//encender el led
  21.  
  22.   else
  23.        PTBD_PTBD7=0;//apagar el led
  24.   }
  25.    
  26.   /*La coneccion del pulsador es
  27.  
  28.   VCC
  29.    |
  30.    |
  31.    |                   ------------>PTB0 del micro
  32.     Resistencia 4.7K  |
  33.                       |
  34.                       |
  35.            Pulsador  |
  36.                       |
  37.                       |
  38.                       - GND
  39.                      
  40.    La coneccion del led es
  41.    
  42.     PTB7
  43.      |
  44.      |   anodo              
  45.     led  
  46.      |   catodo
  47.      |
  48.      _gnd
  49.                      
  50.   De la manera que conectete el pulsador el led deberia encender
  51.   solo cuando precione el pulsador .
  52.  Ahora quisiera agregarle un antirebote por sofware y aprender a utilizarlas Pull-Up intrnas en cuanto tenga algo lo subo :-/ :lol: :-/    Gracias.
  53.   */
  54.    }

              
Título: Re: Tengo una pregunta sobre Freescale, como testeo un pulsador y prendo un led?
Publicado por: cicloide2 en 13 de Mayo de 2012, 15:00:17
Aca el mismo codigo pero con dos led, solo esas modificaciones (todabia sin antirrebotes ni pull-up iternas), lo unico que cuando intento compilarlo me dice que falta una "{"
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 main(void) {
  7.  
  8.     PTCD_PTCD0=0 ; //inicializo PTC0 en 0
  9.     PTBD_PTBD7=0 ; //inicializo PTB7 en 0
  10.     PTBDD_PTBDD7=1;//configuro PTB7 como salida
  11.     PTCDD_PTCDD0=1;//configuro PTC0 como salida
  12.     PTBDD_PTBDD0=0;//cofiguro  PTB0 como entrada
  13.  
  14.  
  15.   EnableInterrupts; /* enable interrupts */
  16.   /* include your code here */
  17.  for(;;)
  18.  {
  19.  
  20.  if (PTBD_PTBD0==0) //pregunto si PTB0 es igual a 0
  21.        PTBD_PTBD7=1;//enciende el led
  22.        PTCD_PTCD0=0;//APAGA el led    
  23.   else                                                           //la falta de la llave "{" me dice que es aca
  24.                                                                    //eso significa que esta faltando en la linea anterior no?
  25.                                                                    //pero no estaria bien asi como esta , no es posible ejecutar
  26.                                                                    // este if, else asi como esta donde esta el verddero problema, Gracias. :-/
  27.        PTBD_PTBD7=0;//apaga led
  28.        PTCD_PTCD0=1;//ENCIENDE el led
  29.  }
  30.  
  31.   /*La coneccion del pulsador es
  32.  
  33.   VCC
  34.    |
  35.    |
  36.    |                   ------------>PTB0 del micro
  37.     Resistencia 4.7K  |
  38.                       |
  39.                       |
  40.            Pulsador  |
  41.                       |
  42.                       |
  43.                       - GND
  44.                      
  45.    La coneccion del led es
  46.    
  47.     PTB7
  48.      |
  49.      |   anodo              
  50.     led  
  51.      |   catodo
  52.      |
  53.      _gnd
  54.                      
  55.  */
  56.    }
               
Título: Re: Tengo una pregunta sobre Freescale, como testeo un pulsador y prendo un led?
Publicado por: cicloide2 en 13 de Mayo de 2012, 16:09:27
Correccion para que el codigo anterior funcione, lo que yo no entendia era por que con una sola intruccion luego de la sentencia  compilaba  y si funcionaba, o sea el caso anterior en el que tenia un solo LED.
Prueba y error, descubri que para que resuelva varias condiciones lugo del for o el else estas no pueden estar sin ser agrupadas dentro de un par de llaves "{}".
Con el ejemplo anterior no fue necesario pues era una sola intruccion luego de la sentencia, pero en este caso son dos intrucciones luego de la sentencia, (me gustaria que alguien abanzado pueda decirme por que esto y si es correcto lo que deduge )

Aca el codigo:
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 main(void) {
  7.  
  8.     PTCD_PTCD0=0 ; //inicializo PTC0 en 0
  9.     PTBD_PTBD7=0 ; //inicializo PTB7 en 0
  10.     PTBDD_PTBDD7=1;//configuro PTB7 como salida
  11.     PTCDD_PTCDD0=1;//configuro PTC0 como salida
  12.     PTBDD_PTBDD0=0;//cofiguro  PTB0 como entrada
  13.  
  14.  
  15.   EnableInterrupts; /* enable interrupts */
  16.   /* include your code here */
  17.    for(;;){
  18.  if   (PTBD_PTBD0==0) //pregunto si PTB0 es igual a 0
  19.       {
  20.        PTBD_PTBD7=1;   //enciende el led  
  21.        PTCD_PTCD0=0;   //APAGA el led  
  22.        }
  23.  
  24.   else {
  25.        PTBD_PTBD7=0;   //apaga led    
  26.        PTCD_PTCD0=1;   //ENCIENDE el led
  27.       }
  28.      }
  29.     }
  30.   /*La coneccion del pulsador es
  31.  
  32.   VCC
  33.    |
  34.    |
  35.    |                   ------------>PTB0 del micro
  36.     Resistencia 4.7K  |
  37.                       |
  38.                       |
  39.            Pulsador  |
  40.                       |
  41.                       |
  42.                       - GND
  43.                      
  44.    La coneccion del led es
  45.    
  46.     PTB7
  47.      |
  48.      |   anodo              
  49.     led  
  50.      |   catodo
  51.      |
  52.      _gnd
  53.                      
  54.  */
                  Gracias. :lol:  
Título: Re: Tengo una pregunta sobre Freescale, como testeo un pulsador y prendo un led?
Publicado por: RICHI777 en 13 de Mayo de 2012, 17:59:33
Felicitaciones, una cosita para decirte. Cuando pegas código te conviene poner la porción del mismo encerrado entre estos tags, de esta manera el visualizar del foro te lo formatea.

Lo escribo textual ...
"Abrir corchete" + code=c  + "Cerrar corchete"
....
"Abrir corchete" + /code  + "Cerrar corchete"

Saludos !
Título: Re: Tengo una pregunta sobre Freescale, como testeo un pulsador y prendo un led?
Publicado por: cicloide2 en 13 de Mayo de 2012, 18:24:59
  Gracias RICHI77, si hago como tu dices me aparecera como a ti? asi con fondo gris y por ejemplo el ciclo infinito For no se confundira con un emoticon?

Corchetes     [copiado de code warrior]  asi? o debo incluir los signos "+"

Saludos y gracias  :-/        
Título: Re: Tengo una pregunta sobre Freescale, como testeo un pulsador y prendo un led?
Publicado por: juanml en 14 de Mayo de 2012, 01:50:37
Capaz que esto te sirve. Son unos ejemplos básicos:

http://vloox.com/566/manejo-de-puertos-de-es-parte-2/
http://vloox.com/619/manejo-de-puertos-de-es-parte-3/
Título: Re: Tengo una pregunta sobre Freescale, como testeo un pulsador y prendo un led?
Publicado por: cicloide2 en 14 de Mayo de 2012, 19:45:14
Sin palabras  ((:-)) justo lo que intentaba hacer yo por mis propios medios , si me sirve? pero, claro estoy aprendiendo toda informacion, correccion o sugerencia  al respecto es bienvenida.
Tal vez para personas mas abanzadas esto sea una pabada, pero yo no se de C y muy poco de ASM en PIC, por lo tanto boy a estudiar ese codigo y quisa les tenga que hacer algunas preguntas a ustedes que son los que saben.

Gracias juanml. :-/
Título: Re: Tengo una pregunta sobre Freescale, como testeo un pulsador y prendo un led?
Publicado por: Suky en 14 de Mayo de 2012, 19:47:48
  Gracias RICHI77, si hago como tu dices me aparecera como a ti? asi con fondo gris y por ejemplo el ciclo infinito For no se confundira con un emoticon?

Corchetes     [copiado de code warrior]  asi? o debo incluir los signos "+"

Saludos y gracias  :-/         

Utilizando: (http://www.todopic.com.ar/foros/Themes/babylon/images/bbc/code.gif)
Título: Re: Tengo una pregunta sobre Freescale, como testeo un pulsador y prendo un led?
Publicado por: cicloide2 en 14 de Mayo de 2012, 20:11:40
Perdon SUKY, no te entiendo el en respuesta a cual de mis dudas el #?
Título: Re: Tengo una pregunta sobre Freescale, como testeo un pulsador y prendo un led?
Publicado por: cicloide2 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--);     
Título: Re: Tengo una pregunta sobre Freescale, como testeo un pulsador y prendo un led?
Publicado por: Suky 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  ;-)
Título: Re: Tengo una pregunta sobre Freescale, como testeo un pulsador y prendo un led?
Publicado por: juanml 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.
Título: Re: Tengo una pregunta sobre Freescale, como testeo un pulsador y prendo un led?
Publicado por: cicloide2 en 15 de Mayo de 2012, 19:32:53
Gracias suky.
Título: Re: Tengo una pregunta sobre Freescale, como testeo un pulsador y prendo un led?
Publicado por: cicloide2 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.



Título: Re: Tengo una pregunta sobre Freescale, como testeo un pulsador y prendo un led?
Publicado por: RICHI777 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 !
Título: Re: Tengo una pregunta sobre Freescale, como testeo un pulsador y prendo un led?
Publicado por: cicloide2 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?
Título: Re: Tengo una pregunta sobre Freescale, como testeo un pulsador y prendo un led?
Publicado por: cicloide2 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 .
Título: Re: Tengo una pregunta sobre Freescale, como testeo un pulsador y prendo un led?
Publicado por: juanml 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.
Título: Re: Tengo una pregunta sobre Freescale, como testeo un pulsador y prendo un led?
Publicado por: ema 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
Título: Re: Tengo una pregunta sobre Freescale, como testeo un pulsador y prendo un led?
Publicado por: cicloide2 en 16 de Mayo de 2012, 18:37:05
Gracias Juanml voy hacer lo que me dices y comento.
Gracias ema.

Saludos. :-/
Título: Re: Tengo una pregunta sobre Freescale, como testeo un pulsador y prendo un led?
Publicado por: cicloide2 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.
Título: Re: Tengo una pregunta sobre Freescale, como testeo un pulsador y prendo un led?
Publicado por: cicloide2 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  :) :-/ :)  
Título: Re: Tengo una pregunta sobre Freescale, como testeo un pulsador y prendo un led?
Publicado por: diguito_69 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.
Título: Re: Tengo una pregunta sobre Freescale, como testeo un pulsador y prendo un led?
Publicado por: cicloide2 en 22 de Mayo de 2012, 22:45:18
Gracias diguito_69 , hice eso aca pongo el codigo, utilice la rutina antirrebote del codigo que subio Juanml; pero con antirrebote o sin antirrebote me falla. La falla es que a beses llega a la cuenta, a beses se pasa, que podra ser?

Código: C
  1. #include <hidef.h> /* for EnableInterrupts macro */        
  2. #include "derivative.h" /* include peripheral declarations */                
  3. void delay_100us(void) { //Retardo de aprox. 100ms        
  4. int cont;        
  5. cont=15;        
  6.  
  7. asm {          
  8.  
  9. loop:      nop //1 ciclo        
  10.     nop        
  11.     nop        
  12.     nop        
  13.     dbnz cont,loop //7 ciclos        
  14.  
  15.  }        
  16.  
  17. }        
  18.  
  19.  
  20. void main(void) {        
  21.   int i,cuenta;
  22.   cuenta=10;            
  23.  ;        
  24.   SOPT1 = 0x02; //Deshabilito watchdog        
  25.   ICSC1=0x014; //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 (!PTAD_PTAD0)
  33.  {  
  34. for (i=0; i<1000; i++) //Espero aprox. 300ms    
  35.   delay_100us(); //Llamo función de retardo      
  36.   cuenta-=1;
  37.  
  38.   }  if  (cuenta==0){
  39.    PTBD_PTBD0=1;
  40.    
  41.   }
  42.   while (!PTAD_PTAD0);
  43.  }
  44.  }
Título: Re: Tengo una pregunta sobre Freescale, como testeo un pulsador y prendo un led?
Publicado por: cicloide2 en 23 de Mayo de 2012, 23:23:02
Bueno logre que funcione, ajustando las demoras de antirrebote, y agregandolas anticipadamente. El problema que tenia era que en algunas pulsaciones me contaba al apretar y soltar, por lo tanto, me contaba (a veses, doble pulso al apretar el pulsador), como me di cuenta?, agregue una salida mas con otro led para que se prendiera y apagara cada vez que pulsaba el pulsador e inmeditamente antes de que se produzca la cuenta y es justo cuando lo veia parpadear erraticamente .

Quisa le sirba a alguien y tal vez quiera postear otra alternativa reduciendo el codigo o agreganodo alguna linea que nos permita abanzar a los novatos al menos.

El codigo cuenta hasta 10 (un pulso una cuenta) prende el led en PTBDD_PTBDD0=1 y cuando la cuenta llega a 12 el led se apaga y el contador se resetea a cero.

Código: C
  1. #include <hidef.h> /* for EnableInterrupts macro */        
  2. #include "derivative.h" /* include peripheral declarations */                
  3. void delay_100us(void) { //Retardo de aprox. 100ms        
  4. char cont;        
  5. cont=25;        
  6.  
  7. asm {          
  8.  
  9. loop:       nop //1 ciclo        
  10.             nop
  11.             nop
  12.             nop        
  13.             nop        
  14.             dbnz cont,loop //7 ciclos        
  15.  
  16.  }        
  17.  
  18. }        
  19.  
  20.  
  21. void main(void) {        
  22.   int i, cuenta;
  23.   cuenta=0;            
  24.   SOPT1 = 0x02; //Deshabilito watchdog        
  25.   ICSC1=0x014; //Reloj interno, divido por 4 (CLK=8Mhz,BUS_CLK=2Mhz)
  26.   PTBDD_PTBDD1=1; //Configuro el bit 1 del puerto B como salida, en este pin conecte el led testigo        
  27.   PTBDD_PTBDD0=1; //Configuro el bit 0 del puerto B como salida        
  28.   PTADD_PTADD0=0; //Configuro el bit 0 del puerto A como entrada        
  29.   PTAPE_PTAPE0=1; //Configuro la resistencia pull-up de PTAD0        
  30.   EnableInterrupts;        
  31.  
  32.   for(;;) {
  33.    for(i=100;i;i--){
  34.    delay_100us();
  35.    }
  36.    if (!PTAD_PTAD0) {
  37.   PTBD_PTBD1=1;
  38.     delay_100us();
  39.   PTBD_PTBD1=0;
  40.    cuenta+=1;
  41.    if (cuenta==10)
  42.    PTBD_PTBD0=1;
  43.    for(i=100;i;i--){
  44.    delay_100us();
  45.    }
  46.    if (cuenta==12){
  47.    PTBD_PTBD0=0;
  48.    cuenta=0 ;
  49.    }
  50.   while (!PTAD_PTAD0);
  51.    }
  52.     }
  53.       }

Saludos y gracias  ;-) :-) ;-) ;-) ;-)