TODOPIC

Microcontroladores PIC => Lenguaje Basic para microcontroladores PIC => Mensaje iniciado por: maggy en 15 de Mayo de 2009, 21:11:00

Título: COMO CONTROLO UN TECLADO EN BASIC
Publicado por: maggy en 15 de Mayo de 2009, 21:11:00
Hola que tal amigos, fijense que tengo un trabajo del cole, nos dejaron manipular un teclado con un pic específicamente con 648,  la idea es ésta: que el puerto A reconozca un dígito, antes de que pase un tiempo aprox 1 seg, reconozca el otro, luego el otro y el otro.

Hasta ahora  puedo leer un número, de ésta manera,   ya que tiene que llegar en binario, pues viene de un 74LS147

      If PORTA = %00000111 Then
            RB.3 = 1
               
este sería para detectar un 7 por ejemplo,  pero mi duda es como hacer una rutina para que acepte el 7 y luego el siguiente y luego el siguiente.

algo así como:

Si detectaste el 7y despues un 4 y despues un 1 y despues un 8, en menos de 4 segundos entonces hacé XXX cosa

esta es mi gran duda, disculpen yo se que no puedo pedir que me hagan  la tarea, pero que me indiquen mas o menos cómo vá.

De antemano muchsimas gracias por responder
Título: Re: COMO CONTROLO UN TECLADO EN BASIC
Publicado por: alexysar en 15 de Mayo de 2009, 22:06:15
Fijate si te sirve esto, te explican bastante facil Basic para Pic's (http://www.electronicaestudio.com/docs/09basic.pdf)
Título: Re: COMO CONTROLO UN TECLADO EN BASIC
Publicado por: maggy en 16 de Mayo de 2009, 20:10:50
Gracias por el link, pero esa parte creo que ya la domino,  mi poblema es hacer que acepte sólo un codigo, pero como lo estoy haciendo, me acepta el código y tambien los números del codigo, es decir no importa el orden,  tambien tengo problemas con el que me lo haga en menos de 4 segs.

Saludos
Título: Re: COMO CONTROLO UN TECLADO EN BASIC
Publicado por: alexysar en 16 de Mayo de 2009, 22:49:23
Bueno, no se si entendí bien. Yo lo que saco es que te entran datos por el puerto A en forma asincrónica, es decir, que te viene la presión de la tecla pero no sabes cuando. Y que tenes que reflejar el estado en la salida, por ejemplo con un led. Si es así, deberías hacer algo similar a esto


Código: Visual Basic
  1. AllDigital
  2. DIM ESTADO_ANTERIOR AS BYTE
  3.  
  4. 'Define tolos los bits del Puerto B como salida
  5. TrisB=%00000000  
  6.  
  7. 'Inicializa todos los bit del PortB en 0
  8. PortB=0
  9.  
  10. 'Define todos los bit del port A como entrada            
  11. TrisA=%111111111  
  12.  
  13. INICIO:
  14.  
  15.         IF (PortA <> ESTADO_ANTERIOR) AND (PortA<>0) THEN ESTADO_ANTERIOR=0
  16.        
  17.        
  18.        
  19.         IF (PORTA = %00000001) AND (ESTADO_ANTERIOR=0) THEN
  20.                         PortB=0
  21.                         RB.0= 1
  22.                         ESTADO_ANTERIOR=%00000001
  23.         ENDIF
  24.  
  25.         IF (PORTA = %00000010) AND (ESTADO_ANTERIOR=0) THEN
  26.                         PortB=0
  27.                         RB.1= 1
  28.                         ESTADO_ANTERIOR=%00000010
  29.         ENDIF
  30.  
  31.         IF (PORTA = %00000011) AND (ESTADO_ANTERIOR=0) THEN
  32.                         PortB=0
  33.                         RB.2= 1
  34.                         ESTADO_ANTERIOR=%00000011
  35.         ENDIF
  36.  
  37. ' y asi siguiendo para todos los estados       
  38.        
  39.  
  40. Goto INICIO
Título: Re: COMO CONTROLO UN TECLADO EN BASIC
Publicado por: maggy en 18 de Mayo de 2009, 14:58:57
Gracias Alexysar, por tomarte la molestia.   Pero fijate que es para una alarma de 4 dígitos, y debe de obdecer sólo a esos cuatro digitos, pero ahora el problema que tengo es que me obedece  a los cuatro números pero sin importar el orden,  osea que si el codigo es 2-3-7-8  me activa el Relay  con cualquier combinación de estos 4 dígitos también, el otro reto, es que si te tardas mas de 4 segs, en ingresarlo, no te lo valida.  lo otro, es que se pueda cambiar el código, ingresando el código anterior, presionando un boton mientras se presiona el código nuevo.  te voy a enseñar lo que he hecho hasta ahora

 Dim pulso As Word  'declaración de variables
Dim a As Byte
Dim b As Byte
Dim d As Byte


TRISA = %11111111
TRISB = %00000000
CMCON = %00000111

PORTB = 0
a = 0
b = 0
d = 0

primeraparte:

         If PORTA = %00000101 And a = 0 Then  'detecta la primer tecla  (5)
   
            a = 1
            
         Endif

         
         If PORTA = %00000111 And a = 1 Then  'si se presionó la primera (5) y ahora se presiona la segunda (7)

            b = 1

         Endif

         If PORTA = %00000010 And a = 1 And b = 1 Then  'si se presionó la primera y la segunda y ahora la tercera  (2)
            
            d = 1

         Endif

         If PORTA = %00001001 And a = 1 And b = 1 And d = 1 Then  'si se presionaron las tres anteriores y ahora el 9 entonces

         PORTB.0 = 1  ' activo relay            
         WaitMs 500

                                                endif

goto primeraparte




Saludos
Título: Re: COMO CONTROLO UN TECLADO EN BASIC
Publicado por: alexysar en 18 de Mayo de 2009, 18:42:33
Entonces tenes que hacer una máquina de estado, fijate algo asi:

Código: Visual Basic
  1. Dim pulso As Word  'declaración de variables
  2.  
  3. Dim estado As Byte
  4. Dim contador_flag As BIT
  5. Dim contador As LONG
  6.  
  7.  
  8. TRISA = %11111111
  9. TRISB = %00000000
  10. CMCON = %00000111
  11.  
  12. PORTB = 0
  13. estado = 0
  14. contar_flag=0
  15. contador=0
  16.  
  17. primeraparte:
  18.  
  19.         If contar_flag=1 Then contador=contador+1
  20.  
  21.         If contador>500 then goto bloqueo       'aqui va el tiempo que queres, en este caso 500 . Ojo no son 500 seg, sino que tenes que probar depende del timer
  22.        
  23.        
  24.         If PORTA>0 Then
  25.  
  26.                 If Estado = 0 Then
  27.                         If PORTA = %00000101  Then  'detecta la primer tecla  (5)
  28.                                         contar_flag = 1
  29.                                         estado = 1
  30.                                 Else
  31.                                         estado = 0
  32.                                 Endif
  33.                 Endif
  34.  
  35.                 If estado = 1 Then  
  36.                         If PORTA = %00000111 Then  'si se presionó la primera (5) y ahora se presiona la segunda (7)
  37.                                 estado = 2
  38.                         Else
  39.                                 estado = 0
  40.                         Endif
  41.                 Endif
  42.  
  43.                 If Estado = 2 Then  
  44.                         If PORTA = %00000010 then  'si se presionó la primera y la segunda y ahora la tercera  (2)
  45.                                 estado = 3
  46.                         Else
  47.                                 estado = 0
  48.                         Endif
  49.                 Endif
  50.  
  51.                If Estado = 3 Then
  52.                         If PORTA = %00001001 Then  'si se presionaron las tres anteriores y ahora el 9 entonces
  53.                                 PORTB.0 = 1  ' activo relay            
  54.                                 WaitMs 500
  55.                                 estado=0
  56.                         Else
  57.                                 estado = 0
  58.                         Endif
  59.                Endif
  60.        
  61.         Endif
  62.        
  63.  
  64. goto primeraparte
  65.  
  66. bloqueo:
  67.                 PORTB.1 = 1  'aca podes hacer sonar la alarma
  68.         goto bloqueo


Esto sirve si cuando no apretas tecla ingresa un 0 en el port a (es decir pull-down), sino tenes que cambiar el If PORTA>0 THEN  (Línea 25) por algo que se adapte a tu circuito
En la línea 22 no te olvides de probar con distintos tiempos
Título: Re: COMO CONTROLO UN TECLADO EN BASIC
Publicado por: maggy en 18 de Mayo de 2009, 21:54:00
gracia, pruebo y comnto.