Autor Tema: Tengo una pregunta sobre Freescale, como testeo un pulsador y prendo un led?  (Leído 13399 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 #30 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.  }
« Última modificación: 23 de Mayo de 2012, 23:27:41 por cicloide2 »

Desconectado cicloide2

  • PIC18
  • ****
  • Mensajes: 359
Re: Tengo una pregunta sobre Freescale, como testeo un pulsador y prendo un led?
« Respuesta #31 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  ;-) :-) ;-) ;-) ;-)
« Última modificación: 23 de Mayo de 2012, 23:27:11 por cicloide2 »