Autor Tema: Ayuda con 12F508  (Leído 7104 veces)

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

Desconectado AKENAFAB

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3227
Re: Ayuda con 12F508
« Respuesta #15 en: 28 de Marzo de 2010, 19:37:36 »
Código: [Seleccionar]
#include <12F508.h>

#use delay(clock=4000000)

#fuses INTRC,NOWDT,NOPROTECT,NOMCLR
#use fast_io(B)

int iEntrada = 0;

void main()
{

//setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);

set_tris_b(0b001000);
output_b(0);



   while(1){
      if(!input(PIN_B3) )
      {
         // Esperar a que lse deje de pulsar el pulsador.
         while (!input(PIN_B3) ) {  }
        
         // Esperar un temps de precaucion per a evitar rebotes
         delay_ms(150);
        
         // Cambiar frecuencia
         iEntrada ++;
         if(iEntrada >3){
             iEntrada = 0;
         }

         //Indicar en els LEDs la frecuencia seleccionada
         switch(iEntrada){
            case 0x0:
               output_low(PIN_B5);
               output_high(PIN_B0);
               output_high(PIN_B1);
               output_high(PIN_B2);
            break;
            case 0x1:
               output_low(PIN_B0);
               output_high(PIN_B1);
               output_high(PIN_B2);
               output_high(PIN_B5);
            break;
            case 0x2:
               output_low(PIN_B1);
               output_high(PIN_B0);
               output_high(PIN_B2);
               output_high(PIN_B5);
            break;
            case 0x3:
               output_low(PIN_B2);
               output_high(PIN_B1);
               output_high(PIN_B0);
               output_high(PIN_B5);
            break;
         }
      }
  
      //Salidas de frecuencias
      switch(iEntrada)
      {
         case 0:
            output_high(PIN_B4); delay_ms(1000);
            output_low(PIN_B4); delay_ms(1000);
            break;
         case 1:
            output_high(PIN_B4); delay_ms(4000);
            output_low(PIN_B4); delay_ms(4000);
            break;
         case 2:
            output_high(PIN_B4); delay_ms(6000);
            output_low(PIN_B4); delay_ms(6000);
            break;
         case 3:
            output_high(PIN_B4); delay_ms(90000);
            output_low(PIN_B4); delay_ms(90000);
            break;
      }
   }  //while
}


En simulador si funciona

Ya se lo que pasa xD

Que cuando no presionas el boton sigue con el patron y se va al siguiente bloque has de presionar el boton cuando esta en los delays y como son grandes , en 1 segundo no leera los bootones en 3s , en 6 y en 9segundos
Código: [Seleccionar]
switch(iEntrada)
      {
         case 0:
            output_high(PIN_B4); delay_ms(1000);
            output_low(PIN_B4); delay_ms(1000);
            break;
         case 1:
            output_high(PIN_B4); delay_ms(4000);
            output_low(PIN_B4); delay_ms(4000);
            break;
         case 2:
            output_high(PIN_B4); delay_ms(6000);
            output_low(PIN_B4); delay_ms(6000);
            break;
         case 3:
            output_high(PIN_B4); delay_ms(90000);
            output_low(PIN_B4); delay_ms(90000);
            break;
      }

El pulsador debe estar con resistencia de pull-up

Desconectado musede

  • PIC10
  • *
  • Mensajes: 9
Re: Ayuda con 12F508
« Respuesta #16 en: 28 de Marzo de 2010, 19:42:18 »
AKENAFAB, el pulsador tiene la resistencia de pull-up y he comprovado que le llegan 4.85v y cuando pulso 0v.
he provado lo que decias en tu anterior post y nada...

Desconectado AKENAFAB

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3227
Re: Ayuda con 12F508
« Respuesta #17 en: 28 de Marzo de 2010, 19:50:20 »
Es que entra al switch case aunque no presiones nada y ahi se va cada segundo si es 0.

while(1){
      if(!input(PIN_B3) )
      {
         //Ejecuta todo esto si se presiono el boton
      }
   
--->//  SE PRESIONE O NO EL BOTON SIEMPRE ANDA EJECUTANDO LO SIGUIENTE  //<----

Y cuando ejecuta el DElay tarda 1s,3s,6,9s durante ese tiempo no se revisa el boton , espero haberme explicado.

Puede que dentro de los CASE revises el estado del boton y salgas del case en caso de que cambie.


      //Salidas de frecuencias
      switch(iEntrada)
      {
         case 0:
            output_high(PIN_B4); delay_ms(1000);
            output_low(PIN_B4); delay_ms(1000);
            break;
         case 1:
            output_high(PIN_B4); delay_ms(4000);
            output_low(PIN_B4); delay_ms(4000);
            break;
         case 2:
            output_high(PIN_B4); delay_ms(6000);
            output_low(PIN_B4); delay_ms(6000);
            break;
         case 3:
            output_high(PIN_B4); delay_ms(90000);
            output_low(PIN_B4); delay_ms(90000);
            break;
      }
   }  //while
}

Espero haberme explicado!

Saludos!

Desconectado musede

  • PIC10
  • *
  • Mensajes: 9
Re: Ayuda con 12F508
« Respuesta #18 en: 28 de Marzo de 2010, 19:59:38 »
Te has explicado perfectamente, no queria comprovarlo en los cases por no hacerlo perder tiempo y que fuese mas exacto.
Creo que hechare mano de los benditos samples de microchip y lo hare con otro pic con interrupciones...

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: Ayuda con 12F508
« Respuesta #19 en: 28 de Marzo de 2010, 20:46:12 »
No  es necesario usar otro pic.
En vez de usar delay_ms(xxxx), haz una funcion que llame a delay_ms(100) tantas veces como necesites y en medio de esa funcion comprueba el estado del boton, de paso ya tiene el antirrebotes armado y todo.
Cuando detectas el boton pulsado marcas un bit que utilizas como bandera, y esa bandera es la que compruebas en el While.
Cada vez que pases por el while reseteas esa bandera y ya deberia funcionar como quieres...

Es facil !!   ... escribirlo!! :D :D :D

Esa funcion seria algo asi:

Código: C
  1. int1 bandera_puls;      //variable tipo bit, va declaracion como global, antes del main...
  2.  
  3. //esta funcion permite temporizar segundos y a la vez detectar un boton en tiempos iguales siempre.
  4.  void delay_cent_sec (int secyfrac)        
  5.     {
  6.        int loops;
  7.        for (loops=0;loops<=secyfrac;loops++)
  8.            {
  9.                delay_ms(100);
  10.                bandera_puls=input(pin_B3);
  11.             }
  12.     }


Aqui se llama a la funcion:
Código: C
  1. delay_cent_sec (65);        // temporiza 6,5 segundos   (el maximo de delay_ms es 65535, por eso no pasar de 65


de la ayuda de CCS

Citar
Syntax:
 delay_ms (time)
 
Parameters:
 time - a variable 0-65535(int16) or a constant 0-65535
 

Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.