Autor Tema: teclado 4x4  (Leído 4248 veces)

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

Desconectado mihjailovic

  • PIC10
  • *
  • Mensajes: 8
teclado 4x4
« en: 17 de Julio de 2010, 18:04:18 »
un saludo a todos

estoy iniciándome en la programación de pic, y he comenzado siguiendo un tutorial, pero me he encontrado con este programa y tengo la duda de como funciona la instruccion retlw, para hacer tablas, no se que funcion cumplen los NOP entre las instrucciones retlw (lo que se de ellos solo retardan un ciclo de maquina), porque he visto otros programas donde no los colocan, pero si los quito en este el programa no funciona. ademas que tendria que cambiar para leer un teclado 4x3


si alguien por favor me puede explicar se lo agradezco. el programa es el siguiente:

;este programa lee un tecaldo matricial 4x4 y muestra el valor en un display 7 segmentos

LIST           P=16F84A   

INCLUDE    P16F84.INC

TECLA    EQU    D'12'

ROTA     EQU    D'13'

FILAS     EQU    D'14'

RESET    ORG    0

GOTO    INICIO

            ORG    5

 TABLA ADDWF    PCL

            NOP

            RETLW    0;PRIMERA COLUMNA

            RETLW    1;SEGUNDA COLUMNA

            NOP

            RETLW    2;TERCERA COLUMNA

            NOP

            NOP           

            NOP

            RETLW    3;CUARTA COLUMNA

INICIO    BSF    STATUS,5

              CLRF    TRISA

              MOVLW    D'15'

              MOVWF    TRISB

              BCF    STATUS,5

              CLRF    PORTB

              CLRF    PORTA

              MOVLW    D'0' 

              MOVWF    TECLA

CICLO    SWAPF    TECLA,W

              MOVWF    PORTB


SCAN      CLRF        FILAS

              MOVLW    B'1110'

PROBAR    MOVFW    ROTA

                MOVWF    PORTA

                NOP;TIEMPO PARA ESTABILIDAD DE LAS LINEAS


LEER        MOVFW    PORTB

               ANDLW    D'15' ;ELIMINA LA PARTE ALTA DEL BYTE LEIDO

               XORLW    D'15' ;INVIERTE EL DATO LEIDO A VER SI HAY UN CERO

               BTFSS    STATUS,Z

               GOTO    SALIR

               BTFSS    ROTA,3 ;PREGUNTA SI VAN 4 ROTACIONES

               GOTO    SCAN

               BSF       STATUS,C ;COLOCA BIT CARRY EN 1

               RLF    ROTA

               MOVLW    4 ;CARGA W CON 4 PARA SUMARLO AL VALOR DE LAS FILAS

              ADDWF    FILAS,1

              GOTO    PROBAR

SALIR     CALL TABLA

             ADDWF    FILAS,W ;SUMA FILAS Y COLUMNAS PARA OBTENER DATO REAL

             MOVWF    TECLA ; MUESTRA DATO LEIDO EN DISPLAY

             GOTO    CICLO

              END


Desconectado gary_servin

  • PIC12
  • **
  • Mensajes: 65
Re: teclado 4x4
« Respuesta #1 en: 18 de Julio de 2010, 00:29:51 »
Que tal mihjailovic? la instrucción RETLW no solo se utiliza  para hacer tablas, esta instrucción lo que hace es retornar de una subrutina o llamada con un valor en el registro W.

Según el ejemplo que pusiste, los NOP están debido a la forma en que se decodifica la columna en la que se encuentra la tecla pulsada.  por ejemplo:

Si se pulsa la tecla en la columna 1 el valor del Puerto B seria 1110, luego de negar 0001 por lo tanto tendría que retornar con el valor en la 2da posición en la tabla

Si se pulsa la tecla en la columna 2 el valor del Puerto B seria 1101, luego de negar 0010 por lo tanto tendría que retornar con el valor en la 3ra posición en la tabla

Si se pulsa la tecla en la columna 3 el valor del Puerto B seria 1011, luego de negar 0100 por lo tanto tendría que retornar con el valor en la 5ta posición en la tabla

Si se pulsa la tecla en la columna 4 el valor del Puerto B seria 0111, luego de negar 1000 por lo tanto tendria que retornar con el valor en la 9na posición en la tabla

Espero que te sirva la explicación.!

EDITO: los nop están para "rellenar" los valores no usados en la tabla. En otros programas capaz no sean necesarios porque utilizan otros métodos para detectar y decodificar la tecla pulsada.
« Última modificación: 18 de Julio de 2010, 00:34:59 por gary_servin »

Desconectado mihjailovic

  • PIC10
  • *
  • Mensajes: 8
Re: teclado 4x4
« Respuesta #2 en: 18 de Julio de 2010, 04:25:24 »
hola gary, agradezco mucho tu ayuda, la verdad fue muy clara y me ayudo a entender la instruccion retwl.
ahora lo que puedo entender es que el registro pcl siempre tiene el valor de 1, corrigeme si no es asi, ademas en el programa se suma filas que lo analizo asi:
si rota=1110 entonces fila=0
si rota=1101 entonces fila=4
si rota=1011 entonces fila=8
si rota=0111 entonces fila=12
ahi me surge otra duda, cuando presiono una tecla, en ese instante w es diferente de 0 luego de la instruccion xorlw, por lo tanto la proxima rotacion no se realiza (ya que hay un goto a salir) y filas queda con el valor que tenia antes de la pulsacion, entonces no deberia existir un error en la instruccion  ADDWF    FILAS,W, (luego del retorno), si por ejemplo la tecla pulsada este en la primera fila y la rotacion haya quedado en una fila diferente

gracias

Desconectado gary_servin

  • PIC12
  • **
  • Mensajes: 65
Re: teclado 4x4
« Respuesta #3 en: 18 de Julio de 2010, 06:31:25 »
no, el registro pcl puede tener cualquier valor, ya que en este registro esta el byte bajo del contador de programa. cuando llamas a la subrutina TABLA, el PCL tiene el valor en el que se encuentra esa subrutina en la memoria de programa, pero como las siguientes instrucciones (nop,retlw 0,retlw 1,nop,nop, etc) estan en las siguientes direcciones de memoria, al sumarle un valor al PCL, "salto" w-direcciones de memoria, siendo w el ultimo valor en el registro W.
Cita de: mihjailovic
si rota=1110 entonces fila=0
si rota=1101 entonces fila=4
si rota=1011 entonces fila=8
si rota=0111 entonces fila=12
exactamente, lo que hace ahí es sumarle 4 para poder tener el primer valor de cada fila al analizarla.

Cita de: mihjailovic
ahi me surge otra duda, cuando presiono una tecla, en ese instante w es diferente de 0 luego de la instruccion xorlw, por lo tanto la proxima rotacion no se realiza (ya que hay un goto a salir) y filas queda con el valor que tenia antes de la pulsacion, entonces no deberia existir un error en la instruccion  ADDWF    FILAS,W, (luego del retorno), si por ejemplo la tecla pulsada este en la primera fila y la rotacion haya quedado en una fila diferente

A ver si me explico, realmente nunca se da la situación que dices, ya que el programa hace constantemente un chequeo de las filas, osea, si se presiona una tecla de cualquier fila, solamente cuando el programa analice esa fila (y si hay una tecla pulsada) decodificara en cual columna esta la tecla. en el ejemplo que das, si se pulsa una tecla en la primera columna pero rota=1011 no detectara ninguna tecla pulsada, ya que la fila 0 esta en 1, y la lectura de todas las columnas también sera 1 debido a la conexión en forma de matriz del teclado!

Espero te haya sido de ayuda! cualquier cosa pregunta nomas! :)

Desconectado mihjailovic

  • PIC10
  • *
  • Mensajes: 8
Re: teclado 4x4
« Respuesta #4 en: 18 de Julio de 2010, 18:05:22 »

hola gary mil gracias de nuevo.
en el ejemplo que me das, es decir, si yo presiona la tecla correspondiente a la fila 1 columna 2 (que es el 1), pero rota=1011, en ese momento no me detecta la tecla porque el cero no esta en la primera fila. ahora cuando el cero llegue a la primera fila ya abre soltado la tecla, entonces como se dara cuenta cual tecla se presiono para poder mostrar el 1, o simplemente por la velocidad del microcontrolador el cero llegara antes de que yo la suelte y por esa razon la detecta. porque de lo que entiendo el programa no sigue con la rotacion hasta que no suelto la tecla.
gracias


Desconectado gary_servin

  • PIC12
  • **
  • Mensajes: 65
Re: teclado 4x4
« Respuesta #5 en: 18 de Julio de 2010, 18:36:51 »
Cita de: mihjailovic
o simplemente por la velocidad del microcontrolador el cero llegara antes de que yo la suelte y por esa razon la detecta.
exactamente, calcula que cada instrucción en assembler tarda un ciclo de maquina en ejecutarse, con un cristal de 4 MHz, esto seria 1 micro segundo por cada instrucción normal y 2 para instrucciones goto o call. normalmente cuando presionas un pulsador, lo presionas por 500 mili segundos o mas, y debido a la velocidad de ejecución, el micro podrá detectar la tecla. Otra opción para realizar la detección de la tecla por medio de interrupciones, seguro buscando en el foro encontraras mas información. Espero haber ayudado! Saludos!

Desconectado mihjailovic

  • PIC10
  • *
  • Mensajes: 8
Re: teclado 4x4
« Respuesta #6 en: 19 de Julio de 2010, 00:46:08 »
hola gary, esta vez solo quiero agradecerte por tu ayuda, la verdad cada participacion fue muy aclarativa y me ayudo a enterder el tema, ademas fuiste muy paciente a la hora de resolver mis dudas, ahora ya puedo continuar mi aprendizaje. cuidate saludos

Desconectado pibe

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 635
Re: teclado 4x4
« Respuesta #7 en: 19 de Julio de 2010, 04:57:53 »
Alguno micros traen interrupciones por cambio de estado en los pines RB4 al RB7.
Con estas 4 lineas/ columnas ya puedes utilizar tu teclado por interrupciones.
Mi jefe mirando el prototipo que estoy creando: "Y eso va a funcionar?"

Desconectado gary_servin

  • PIC12
  • **
  • Mensajes: 65
Re: teclado 4x4
« Respuesta #8 en: 19 de Julio de 2010, 17:56:18 »
hola gary, esta vez solo quiero agradecerte por tu ayuda, la verdad cada participacion fue muy aclarativa y me ayudo a enterder el tema, ademas fuiste muy paciente a la hora de resolver mis dudas, ahora ya puedo continuar mi aprendizaje. cuidate saludos

No hay problemas mihjailovic, fue un placer haber podido ser de ayuda!  :mrgreen:

Alguno micros traen interrupciones por cambio de estado en los pines RB4 al RB7.
Con estas 4 lineas/ columnas ya puedes utilizar tu teclado por interrupciones.

Si, justamente a eso me refería en el post anterior, ya que cuando lo hice fue de esa manera! jajaja ;-)

Desconectado mihjailovic

  • PIC10
  • *
  • Mensajes: 8
Re: teclado 4x4
« Respuesta #9 en: 20 de Julio de 2010, 02:23:11 »
gracias pibe, tienes mucha razon el lo que dices y quizas sea  mas sencillo, solo que como mencionaba  antes apenas me inicio en la programacion y estoy siguiendo un pequeño tutorial donde encuentro ejemplos y trato de entenderlos para ir adquiriendo la logica ademas de ir conociendo los registros y como manejarlos.
aun no he llegado a la parte de interrupciones, cuando lo haga entendere lo que me tratan de explicar gary y tu y podre usar ese metodo.

agradezco mucho tu aporte

Desconectado pibe

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 635
Re: teclado 4x4
« Respuesta #10 en: 20 de Julio de 2010, 06:01:25 »
De manera somera y callejera (que es como yo mejor entiendo las cosas  :mrgreen:) las interrupciones hacen que el micro deje de hacer lo que estaba haciendo en el programa principal y salte a una rutina especial. Al acabar la rutina especial vuelve exactamente desde donde salió del programa principal y continúa lo que estaba haciendo.

Hay distinto tipos de interrupciones, y hay micros que tienen mas o menos tipos y cantidades de interrupciones.
Una interrupción puede ser causada por un factor externo o interno.
Un factor externo podría ser que un pin especial del micro cambie de estado.
Un factor interno podría ser que un contador haya llegado a su fin.

Eso es, a grosso modo lo que son las interrupciones.

Y son muy pero que muy útiles, ya que si por ejemplo tienes un programa que deba estar mostrando por display, rastreando el teclado, activando salidas etc etc.-. pues.... imagina cuanta tarea tiene de rastrear toooooooodo y volver a empezar .
Con las interrupciones, por ejemplo en el teclado, pues el micro se ocuparía de activar salidas y mostrar el display, despreocupándose de rastrear el teclado. Cuando se active una tecla del teclado pues saltará a esa rutina que tienes para leer el teclado, guardas el dato y vuelves al programa principal.
Guay, no?  :D

Mi jefe mirando el prototipo que estoy creando: "Y eso va a funcionar?"

Desconectado mihjailovic

  • PIC10
  • *
  • Mensajes: 8
Re: teclado 4x4
« Respuesta #11 en: 21 de Julio de 2010, 01:53:02 »
entiendo lo que me tratas de decir, de esa manera es mucho mas sencillo y el pic no estaria todo el tiempo ocupado y podria hacer muchas otras labores. pero aun con interrupciones no tendria que detectar la tecla pulsada (recordando que hay 4 teclas que van hacia un mismo pin)

buen aporte pibe. una vez mas agradezco tu participacion y ayuda en mi aprendizaje

Desconectado pibe

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 635
Re: teclado 4x4
« Respuesta #12 en: 21 de Julio de 2010, 04:53:40 »
Por supuesto que debería detectar la tecla pulsada, y toda la rutina que usas para detectar cual tecla fué pulsada iría en este "espacio especial" de interrupciones. La ventaja es que el micro haría lo suyo en el programa principal, cuando pulses una tecla saltaría inmediatemente a esta subrutina , detectaría la tecla, la guardaría en una variable y volvería al programa principal para seguir con lo que estaba haciendo y cuando llegase el momento mostrar (por ejemplo) la variable que contiene tu tecla pulsada.
Mi jefe mirando el prototipo que estoy creando: "Y eso va a funcionar?"

Desconectado mihjailovic

  • PIC10
  • *
  • Mensajes: 8
Re: teclado 4x4
« Respuesta #13 en: 21 de Julio de 2010, 04:59:43 »
entendido. gracias por tomarte el tiempo para explicarme. saludos


 

anything