TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: dunkelheit en 01 de Julio de 2011, 13:36:26
-
buenas he estado intentando en mi simulador (proteus) conectar un teclado matricial (con resistencias distintas) por medio de un covertidor analogo/digital de voltaje (PCF8591) al pic 16f84a y visualizarlo al LCD.
la señal i2c que llega al pic emite 00 si no presiono nada, si presiono una tecla lleva la suma de las resistencia (fila + columna) convertido en hexadecimal por unos microsegundos y luego vuelve a 00, entonces lo que hice fue que solo haga mis instrucciones si es que la señal captada no es 00, pero el problema viene en eso de que al apretar dura unos microsegundos, ya que al hacer un contador de teclas presionadas ( como es un bucle infinito) suma todas las veces en que dura la señal apretar el boton ... nose si alguien podria sugerirme una solucion .
gracias.
-
Puedes publicar el circuito? Alomejor es que estoy un poco espeo ahora y no me ago a la idea de como lo tienes montado. Un saludo
-
(http://img231.imageshack.us/img231/3241/ckto.png) (http://imageshack.us/photo/my-images/231/ckto.png/)
Uploaded with ImageShack.us (http://imageshack.us)
cada vez que presiono cuenta 08
-
el problema que tienes es que detectas que tecla se presiono, pero como las instrucciones se vuelven a ejecutar mientras tienes presionada la tecla te suma lo valores.
puedes hacer varias cosas para solucionar esto, lo que se me ocurre es que cuando detectes que se presiono una tecla leas el valor y le des un retardo para esperar a que se quite el deo del boton.
tambien puedes hacer que siga sensando una vez que detecto que se presiono el boton, y que el programa se quede en "pausa" hasta que se suelkte la tecla
-
gracias por responder. este es mi codigo
Principal
call I2C_LeeByte ; Lee la entrada analógica.
call Visualiza
goto Principal
ServicioInterrupcion
; Subrutinas "Visualiza" ----------------------------------------------------------------
CBLOCK
Auxiliar
ContadorCaracteres
ENDC
Visualiza
movwf Auxiliar ; Lo guarda.
call LCD_Linea1 ; Se sitúa al principio de la primera línea.
movlw MensajeIntro ; Visualiza mensaje.
call LCD_Mensaje
movlw cero
subwf Auxiliar,W
btfsc STATUS,Z
goto IgualaCero
call LCD_Linea2 ; Se sitúa al principio de la segunda línea.
movf Auxiliar,W ; Recupera el dato a visualizar y lo
incf ContadorCaracteres,F ; Cuenta el número de teclas pulsadas.
movf ContadorCaracteres,W
call LCD_ByteCompleto
call Retardo_200ms
IgualaCero
return
he hecho lo que sugeriste, antes botaba 08 + 08 + 08 cada vez que hacia una tecla , cuando le puse retardo de 20ms bajo a 04 y de 100ms bajo hasta 03 pero ahora ia no baja mas lo que hace es retardar solo la señal de captacion es decir con 200ms primero hace el 01 luego de un ratito el 02 y luego de un ratito el 03. :S
nose si estoy haciendo algo malo en posicionar el retardado.
-
bueno logre solucionar en algo el problema como no tiene interrupcion el convertidor el retardo le puse despues de de capta la señal asi se demora en pedir el siguiente byte y lo que vuelve a recibir es 00 claro no es optimo porque demora un poco por el retardo, mi condicion de que no cuente es solo si lo que le llega a W de i2c sea distinto de 00 (que es cuando no presiono nada), mi problema es si esque tengo presionado el boton entonces seguira sumando hasta que lo suelte, como podria hacer que ya no vuelva a contar ? gracias ...
Principal
call I2C_LeeByte ; Lee la entrada analógica.
call Visualiza
goto Principal
ServicioInterrupcion
; Subrutinas "Visualiza" ----------------------------------------------------------------
CBLOCK
Auxiliar
ContadorCaracteres
ENDC
Visualiza
movwf Auxiliar ; Lo guarda.
call Retardo_40ms
call LCD_Linea1 ; Se sitúa al principio de la primera línea.
movlw MensajeIntro ; Visualiza mensaje.
call LCD_Mensaje
movlw cero
subwf Auxiliar,W
btfsc STATUS,Z
goto IgualaCero
call LCD_Linea2 ; Se sitúa al principio de la segunda línea.
movf Auxiliar,W ; Recupera el dato a visualizar y lo
incf ContadorCaracteres,F ; Cuenta el número de teclas pulsadas.
movf ContadorCaracteres,W
call LCD_ByteCompleto
IgualaCero
return
-
puedes hacer que en cuanto sea distinto de 0, es decir, que se presiono una tecla, que no incremente el valor, que se quede ahi, hasta que vuelva a ser 0 entonces lo preparas para volver a recibir, con eso aseguras que la tecla ya no siga presionada
-
gracias por responder... eso quizas lo pueda solucionar mas adelante, ahora mi principal problema es saber la longitud de una tabla para compararla con el incremento :S en un ejemplo vi que para eso se podia hacer esto.
#DEFINE LongitudClave (FinClaveSecreta-ClaveSecreta)
LeeClaveSecreta
addwf PCL,F
ClaveSecreta
DT 4h,5h,6h;
FinClaveSecreta
supuestamente deberia salir 3 pero no sale, y a cabo que voy aumentando un valor mas , sale distinto, como podria solucionarlo, necesito como una cerradura electronica, de que el contador de teclas cuente hasta el numero de digitos que este guardado.
gracias