Autor Tema: No funciona el retardo para un antirrebotes  (Leído 3007 veces)

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

Desconectado ramirez

  • PIC16
  • ***
  • Mensajes: 195
No funciona el retardo para un antirrebotes
« en: 10 de Mayo de 2009, 14:47:00 »
Buenas tardes a todos, estoy practicando con algunos de los ejemplos que existen en el foro y me encuentro con el siguiente problema, el retardo para el antirrebotes no funciona correctamente, y si doy un tiempo alto como se puede ver en el ejemplo y mantengo pulsado el pulsador, el tiempo para el contaje es muy corte y no corresponde con el que pongo. ¿Qué es lo que ocurre?

Gracias a todos por vuestra colaboración-

////////////////////////////////////////////////////////////////////////////////////
//                     VsZeNeR'05
//                     22/Agosto/05
//                     vszener@gmail.com
//   Programa:   Contador 0-9 display BDC & Boton
//   Version:   0.0
//
//   Dispositivo: PIC 16F648A         Compilador:    CCS vs3.227
//   Entorno IDE: MPLAB IDE v7.20      Simulador:    Proteus 6.7sp3
//
//   Notas: Contador 0 al 9 cada vez que pulsemos el boton y vuelta a empezar. Tener
//         en cuenta que hay que poner la directiva NOLVP para que el pin B4 sea de
//         salida. Cuando agregamos un boton a nuestro circuito hay que tener en cuenta
//         que este dispositivo genera 'rebotes' que hay que ser eliminados para
//         una correcta visualizacion en el display del digito seleccionado. Esta vez
//         la eliminacion de 'los rebotes' se ha realizado mediante software.
//         Cuando por el pin A0 del porta se introduce un '0' logico(low), se
//         incrementa un digito en el display BCD.
//
//   Conexiones:      A0 -> boton
//               B0 -> a
//               B1 -> b
//               B2 -> c
//               B3 -> d
//   BCD:
//            d c b a   NUM
//            0 0 0 0    0
//            0 0 0 1    1
//            0 0 1 0    2
//            0 0 1 1    3
//            0 1 0 0    4
//            0 1 0 1    5
//            0 1 1 0    6
//            0 1 1 1    7
//            1 0 0 0    8
//            1 0 0 1    9
//////////////////////////////////////////////////////////////////////////////////

#include <16f648a.h>            //pic a utilizar
#fuses XT,NOWDT,NOPROTECT,PUT,NOLVP      //ordenes para el programador
#use delay (clock=4000000)         //Fosc=4Mhz
#use fixed_io(b_outputs=PIN_B0,PIN_B1,PIN_B2,PIN_B3)
#use standard_io(A)

///PROGRAMA
void main(void)
{
   char i=0;   //contador para tabla BCD
   int tabBCD[10]={0b0000,0b0001,0b0010,0b0011,0b0100,0b0101,0b0110,0b0111,0b1000,0b1001};   //BCD 0-9

   set_tris_a(0xFF);            //porta como entrada
   disable_interrupts(GLOBAL);      //todas las interrupciones desactivadas

   output_b(tabBCD);         //inicializa displayBCD digito 0

   for(;;){                  //bucle...
      if(!input(PIN_A0))         //¿se ha pulsado el boton?
         {
            delay_ms(10000000);      //SI -> retardo para evitar los rebotes
            i++;            //incremento contador indice tabBCD
            if(i>9)            //¿se ha mostrado digito 9?
               i=0;         //SI -> restaura valor indice(para mostrar digito 0)
            output_b(tabBCD); //muestra por portb digito 7 segmentos
         }
      }                     //...infinito
}

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: No funciona el retardo para un antirrebotes
« Respuesta #1 en: 10 de Mayo de 2009, 14:52:04 »
delay_ms(10000000); :shock: :shock:

el retardo para antirrebotes debe estar entre 30 y 100ms, cámbialo a uno de estos valores
.

Desconectado ramirez

  • PIC16
  • ***
  • Mensajes: 195
Re: No funciona el retardo para un antirrebotes
« Respuesta #2 en: 10 de Mayo de 2009, 15:14:01 »
He probado con este intervalo y tampoco funciona correctamente. El poner un valor tan alto, es por si dejo pulsado el pulsador y debe de contar con este tiempo, y tampoco lo hace.

Gracias

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: No funciona el retardo para un antirrebotes
« Respuesta #3 en: 10 de Mayo de 2009, 15:37:09 »
hay que leer las limitaciones que tiene cada función:

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

Note: Previous compiler versions ignored the upper byte of an int16, now the upper byte affects the time.

 
No contesto mensajes privados, las consultas en el foro

Desconectado ramirez

  • PIC16
  • ***
  • Mensajes: 195
Re: No funciona el retardo para un antirrebotes
« Respuesta #4 en: 10 de Mayo de 2009, 15:42:40 »
Perdona Suky, pero no entiendo esta limitación, te importaría explicarla para poder entender el funcionamiento del programa.

Gracias de nuevo

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: No funciona el retardo para un antirrebotes
« Respuesta #5 en: 10 de Mayo de 2009, 15:54:27 »
Delay_ms(), solo soporta un valor entre 0 y 65535. Entonces la máxima duración que puedes lograr es de 65.5 seg. :wink:
No contesto mensajes privados, las consultas en el foro

Desconectado ramirez

  • PIC16
  • ***
  • Mensajes: 195
Re: No funciona el retardo para un antirrebotes
« Respuesta #6 en: 10 de Mayo de 2009, 16:00:56 »
Muchas gracias Suky, pero si por ejemplo pongo 2000, y lo simulo con Proteus, al mantener el pulsador pulsado (a0), el display debería cambiar cada 2 segundos, y no lo hace así, ¿cual es el motivo?

De nuevo os doy las gracias por vuestro interés

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: No funciona el retardo para un antirrebotes
« Respuesta #7 en: 10 de Mayo de 2009, 16:34:01 »
Esto lo tienes así 
Código: C
  1. output_b(tabBCD);
o así
Código: C
  1. output_b(tabBCD[i]);
No contesto mensajes privados, las consultas en el foro

Desconectado ramirez

  • PIC16
  • ***
  • Mensajes: 195
Re: No funciona el retardo para un antirrebotes
« Respuesta #8 en: 10 de Mayo de 2009, 16:42:36 »
Hola Suky, no entiendo tu último mensaje, efectivamente, en el programa está puesta la segunda opción, pero cual es el fallo, para que no temporice.

Gracias

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: No funciona el retardo para un antirrebotes
« Respuesta #9 en: 10 de Mayo de 2009, 16:48:24 »
No, es que en código del primer mensaje no se ve.  :mrgreen: Estaba por agregar que yo lo simule, el mismo código y me funciona bien  :(
No contesto mensajes privados, las consultas en el foro

Desconectado ramirez

  • PIC16
  • ***
  • Mensajes: 195
Re: No funciona el retardo para un antirrebotes
« Respuesta #10 en: 10 de Mayo de 2009, 17:20:40 »
Gracias Suky, efectivamente funciona bien, elproblema lo tenía en el compilador que no funcionaba correctamente y siempre ejecutaba el mismo fichero.

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
Re: No funciona el retardo para un antirrebotes
« Respuesta #11 en: 10 de Mayo de 2009, 17:32:10 »
Efectivamente el programa lo has debido de copiar mal. Debe decir
Código: [Seleccionar]
output_b(tabBCD[i]) en las dos veces que aparece.

Otra cosilla. El delay_ms(500) no es una temporización para evitar los rebotes sino que es el tiempo de cadencia entre número y número en el caso de que mantengas pulsado permanentemente el pulsador, para los antirebotes con un delay_ms(7) va que se mata, o si es un contacto viejo puede que haga falta mas, como mucho delay_ms(20).

Lo que ocurre que en el programa el delay_ms(500) también de paso evita los rebotes, pero su función primordial es la que te he comentado.

El programa, tiene un defectillo y es que si por ejemplo mantienes pulsado el pulsador y ves aparecer al 4 (o otro numero), si sueltas en ese momento te aparece el 5, y no debiera.

Un saludo.

PD1. Cosa más rara, ha salido el texto en cursiva y el índice i de la tabla no aparece.

PD2. Se soluciona metiendo el output entre dos codes (simbolo de la almohadilla)
« Última modificación: 10 de Mayo de 2009, 17:40:04 por pocher »

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: No funciona el retardo para un antirrebotes
« Respuesta #12 en: 10 de Mayo de 2009, 17:37:24 »
creo que debe decir:

Código: [Seleccionar]
output_b(tabBCD[i]);
es que si es escribe [ i] todo junto el editor de texto del foro lo toma como CURSIVA
.