Autor Tema: Problema con el 16f84 y bus I2C  (Leído 4258 veces)

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

Desconectado dunkelheit

  • PIC10
  • *
  • Mensajes: 15
Problema con el 16f84 y bus I2C
« 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.

Desconectado tannke

  • PIC16
  • ***
  • Mensajes: 176
Re: Problema con el 16f84 y bus I2C
« Respuesta #1 en: 01 de Julio de 2011, 13:54:19 »
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

Desconectado dunkelheit

  • PIC10
  • *
  • Mensajes: 15
Re: Problema con el 16f84 y bus I2C
« Respuesta #2 en: 01 de Julio de 2011, 13:58:18 »


Uploaded with ImageShack.us

cada vez que presiono cuenta 08

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: Problema con el 16f84 y bus I2C
« Respuesta #3 en: 01 de Julio de 2011, 14:19:04 »
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
"Nada es imposible, no si puedes imaginarlo"

Desconectado dunkelheit

  • PIC10
  • *
  • Mensajes: 15
Re: Problema con el 16f84 y bus I2C
« Respuesta #4 en: 01 de Julio de 2011, 14:30:54 »
gracias por responder. este es mi codigo


Código: [Seleccionar]
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.


Desconectado dunkelheit

  • PIC10
  • *
  • Mensajes: 15
Re: Problema con el 16f84 y bus I2C
« Respuesta #5 en: 01 de Julio de 2011, 14:47:32 »
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
« Última modificación: 01 de Julio de 2011, 14:50:07 por dunkelheit »

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: Problema con el 16f84 y bus I2C
« Respuesta #6 en: 01 de Julio de 2011, 14:57:53 »
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
"Nada es imposible, no si puedes imaginarlo"

Desconectado dunkelheit

  • PIC10
  • *
  • Mensajes: 15
Re: Problema con el 16f84 y bus I2C
« Respuesta #7 en: 01 de Julio de 2011, 15:38:19 »
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.

Código: [Seleccionar]
#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



 

anything