TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: ramirez 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
}
-
delay_ms(10000000); :shock: :shock:
el retardo para antirrebotes debe estar entre 30 y 100ms, cámbialo a uno de estos valores
-
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
-
hay que leer las limitaciones que tiene cada función:
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.
-
Perdona Suky, pero no entiendo esta limitación, te importaría explicarla para poder entender el funcionamiento del programa.
Gracias de nuevo
-
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:
-
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
-
Esto lo tienes así o así
-
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
-
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 :(
-
Gracias Suky, efectivamente funciona bien, elproblema lo tenía en el compilador que no funcionaba correctamente y siempre ejecutaba el mismo fichero.
-
Efectivamente el programa lo has debido de copiar mal. Debe decir
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)
-
creo que debe decir:
output_b(tabBCD[i]);
es que si es escribe [ i] todo junto el editor de texto del foro lo toma como CURSIVA