Autor Tema: AYUDA Asignar preescaler al TMR0 en funcion de que tecla pulse  (Leído 2446 veces)

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

Desconectado MicroCT

  • PIC10
  • *
  • Mensajes: 6
AYUDA Asignar preescaler al TMR0 en funcion de que tecla pulse
« en: 14 de Abril de 2016, 11:30:51 »
 Saludos,no se si este tema va aqui, espero que puedan ayudarme tengo que hacer un proyecto para la uni con un PIC School en lenguaje ensamblador, y entre otras cosas tengo que lograr que en funcion de que tecla pulse en la placa se asigne un preescaler diferente al Timer0 para lograr diferentes frecuencias. ¿Como hago esto? No tengo ni idea de por donde empezar.
PD: soy muy novato en esto...
Que tengan un buen dia

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:AYUDA Asignar preescaler al TMR0 en funcion de que tecla pulse
« Respuesta #1 en: 14 de Abril de 2016, 12:33:16 »
Aunque pueda parecer absurdo en lo que voy a decir, tenes que:

Preguntar por la tecla, si esta presionada Cargar el registro con el preescaler correspondiente.


Cargar el registro con el nuevo preescaler debe tomarte 2 instrucciones, Preguntar por la tecla deberia tomarte otras 2 instrucciones en ASM mas.
A no ser que quieras tener algo mas, o que funcione de otra forma eso seria todo.

Si podes dar el codigo que tenes seria bueno para irte guiando. Sino busca un ejemplo de un led y con eso te deberias dar cuenta al menos.

Recomendacion:

- Leer el datasheet del micro aunque sea lo del Timer, Puertos y mirar las instrucciones para saber que hacen.

Desconectado MicroCT

  • PIC10
  • *
  • Mensajes: 6
Re:AYUDA Asignar preescaler al TMR0 en funcion de que tecla pulse
« Respuesta #2 en: 14 de Abril de 2016, 12:42:26 »
mejor que el codigo que puede estar mal, te paso la esctructura(adjunto imagen) que tiene el programa,la parte de la precarga del TMR0 es unicamente lo que me falta, el resto lo tengo.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:AYUDA Asignar preescaler al TMR0 en funcion de que tecla pulse
« Respuesta #3 en: 14 de Abril de 2016, 13:51:12 »
Por que usarias la interrupcion cuando podrias hacerlo tranquilamente en el loop principal?, o pensas hacer algo mas y queres que los botones respondan bien?, O si o si te piden que tenga la interrupcion?.

Por ultimo pone el codigo, si eso es lo unico que realmente falta entonces lo completo. Ademas veo si hay otros errores. Y tambien escribi el PIC y Cristal que estas usando

Desconectado MicroCT

  • PIC10
  • *
  • Mensajes: 6
Re:AYUDA Asignar preescaler al TMR0 en funcion de que tecla pulse
« Respuesta #4 en: 14 de Abril de 2016, 14:03:38 »
Por que usarias la interrupcion cuando podrias hacerlo tranquilamente en el loop principal?, o pensas hacer algo mas y queres que los botones respondan bien?, O si o si te piden que tenga la interrupcion?.

Por ultimo pone el codigo, si eso es lo unico que realmente falta entonces lo completo. Ademas veo si hay otros errores. Y tambien escribi el PIC y Cristal que estas usando

uso el PIC16F876A a 4MHz, la placa en la que lo vuelco es la PICSchool 2006, lo que me dices de Crystal ahora mismo no se que es
Tengo que seguir de forma obligada ese esquema, usar el TMR0. La funcionalidad del programa es que al pulsar un boton en funcion de cual sea se iluminen los 4 bits menos significativos y un zumbador suene de una manera o de otra, yo imagine que era con eso del preescaler que comenté antes, pero vamos, que puede ser de otra manera perfectamente
El codigo es el siguiente:
   LIST p=16F876A                     ;Indica eltipo de microprocesador a utilizar
   include "p16f876a.inc"
   __CONFIG _XT_OSC & _WDT_OFF & _LVP_OFF   ;Desactiva el EatchDog timer

TECLA   EQU   0X20
COLUMNA   EQU   0X21
FILA   EQU   0X22
N_COLUMNA   EQU   0X23
N_FILA   EQU   0X24
DO1   EQU   0X41
RE   EQU   0X42
MI   EQU   0X43
FA   EQU   0X44
SOL   EQU   0X45
LA   EQU   0X46
SI   EQU   0X47
DO2   EQU   0X48
         
   ORG    0                        ;Aquí empezara la memoria
   GOTO   INICIO                        ;Ve a inicio, aqui estará el comienzo del programa
   
   ORG      4
   GOTO   ISR
   
   ORG    5      

INICIO
   MOVLW   .241            ;pasamos los valores de cada nota a una variable
   MOVWF   DO1
   MOVLW   .243
   MOVWF   RE
   MOVLW   .244
   MOVWF   MI
   MOVLW   .245
   MOVWF   FA
   MOVLW   .256
   MOVWF   SOL
   MOVLW   .247
   MOVWF   LA
   MOVLW   .248
   MOVWF   SI
   MOVLW   .249
   MOVWF   DO2

   BSF      STATUS,RP0         ;bamos al banco 1
   CLRF   TRISC            ;TRISC como salida
   MOVLW   B'11111111'
   MOVWF   TRISB            ;trisb como entrada
   
   CLRF   INTCON            ;limpiamos todo INTCON por si acaso
   BSF      INTCON,GIE         ;habilitamos interrupciones globales
   BSF      INTCON,T0IE         ;habilitamos la interrupcion por ovverflow del TMR0
   BSF      INTCON,INTE         ;habilita la interruñcion por variacion de un bit de forma externa(boton)
   BSF      INTCON,RBIE         ;interrupcion por cambio de puerto

   CLRF   OPTION_REG         ;limpia option REG por si acaso
   BSF      OPTION_REG,INTEDG   ;habilita la interrucion pr flanco ascendnte
   ;añadir OPTION_REG,PSA
   BSF      OPTION_REG,PS2      ;Configuramos un preescaler al maximo 256
   BSF      OPTION_REG,PS1
   BSF      OPTION_REG,PS0

   BCF      STATUS,RP0         ;vuelta al banco0
   CLRF   STATUS
   
   CLRF   PORTC            ;limpia PORTC
   BCF      RA0               ;pon a 0 el bit 0 de PORTA

MAIN
   GOTO   MAIN   

ISR
   MOVLW   .1               ;mueve el valor a TECLA
   MOVWF   TECLA   
   MOVLW   B'00000010'      
   MOVWF   FILA            ;mueve el valor a FILA
   MOVLW   .2
   MOVWF   N_FILA            ;establecemos numero de filas
   MOVLW   .4
   MOVWF   N_COLUMNA         ;establecemos numero de columnas

SALTO1
   MOVF   PORTB,0            ;el contenido de portB (entrada)se lo pasas a FILA
   MOVWF   FILA
   MOVF   COLUMNA,0         ;el contenido de columna (entrada)se lo pasas PORTB entrada
   MOVWF   PORTB

SALTO2
   BTFSS   COLUMNA,N_COLUMNA   ;Comprueba en que columna estamos
   GOTO   CUADRADO         ;si es 0 ve a cuadrado
   RRF      COLUMNA,1         ;rota columna y lo guardas en columna
   INCF   TECLA,1            ;tecla +1
   DECFSZ   N_COLUMNA,1         ;ve co probando columnas
   GOTO   SALTO            ; si es 0 vuelve a repetir la comprobacion
   MOVLW   .4               ;si es 1,vuelve a esablecer numero de columnas a 4
   MOVWF   N_COLUMNA
   RLF      FILA,1            ;rota a la izquierda fila
   MOVF   FILA,0            ;el valor de fila lo guardas en FILA
   MOVWF   PORTB            ;pasalo a PORTB
   DECFSZ   N_FILA,1         ;ve comprobsndo las sucesivas filss
   GOTO   SALTO1            ;si es 0 vuelve a SALTO1
   RETURN

CUADRADO
   ;tenemos que hacer que para el valor que pulsemos en la placa se cargue un preescaler distinto en el TMR0 y asi variar la frecuencia
   bsf      PORTA,RA0
   RETURN

   END

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:AYUDA Asignar preescaler al TMR0 en funcion de que tecla pulse
« Respuesta #5 en: 14 de Abril de 2016, 14:09:59 »
Ahora exactamente no puedo darte una respuesta completa, esta tarde o mañana a la mañana lo reviso bien.

EDIT: Alguna frecuencia en particular tiene que salir en cada tono, me refiero a DO, RE , MI ..... etc, si podes decir la frecuencia a la que tiene que salir la onda o el periodo seria tambien mejor.

Lo que tenes que modificar es el valor a cargar y el preescaler.
Mi otra pregunta es ya que estas usando el PIC16F876A, SI o SI es el Timer0 ? o se puede usar el modulo CCP + Timer1?

Y si podes dar un diagrama de PicSchool 2006 seria genial, por que no se de que se trata ni que esta conectado a que.
« Última modificación: 14 de Abril de 2016, 14:24:41 por KILLERJC »

Desconectado MicroCT

  • PIC10
  • *
  • Mensajes: 6
Re:AYUDA Asignar preescaler al TMR0 en funcion de que tecla pulse
« Respuesta #6 en: 14 de Abril de 2016, 14:24:27 »
Ahora exactamente no puedo darte una respuesta completa, esta tarde o mañana a la mañana lo reviso bien.

EDIT: Alguna frecuencia en particular tiene que salir en cada tono, me refiero a DO, RE , MI ..... etc, si podes decir la frecuencia a la que tiene que salir la onda o el periodo seria tambien mejor.

Lo que tenes que modificar es el valor a cargar y el preescaler.
Mi otra pregunta es ya que estas usando el PIC16F876A, SI o SI es el Timer0 ? o se puede usar el modulo CCP + Timer1?

No te preocupes, demasiado que intentas ayudar, muchisimas gracias por adelantado :D ((:-)) ((:-)) ((:-)) ((:-)) ((:-)) ((:-))
Si, el timer0 es obligado no uede ser de otra manera.
Respecto a las frecuencias son esta:

NOTA    Frecuencia(Hz)   Tecla    ValorTecla
DO            262                    1             1
RE             294                    2             2
MI             330                    3              3
FA              349                   A              4
SOL           392                   4               5
LA              440                   5              6
SI              494                    6              7
DO             523                    B             8

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:AYUDA Asignar preescaler al TMR0 en funcion de que tecla pulse
« Respuesta #7 en: 14 de Abril de 2016, 14:27:41 »
Eso mas el diagrama que encontre del teclado va a ser posible guiarte..

https://drive.google.com/file/d/0B6UWkqxoeNcNZGVhOTJhOWEtMjc0MC00OWQwLWJhY2ItY2M2ZGNjYjJmMjM2/view

Desconectado MicroCT

  • PIC10
  • *
  • Mensajes: 6
Re:AYUDA Asignar preescaler al TMR0 en funcion de que tecla pulse
« Respuesta #8 en: 15 de Abril de 2016, 05:41:01 »
Eso mas el diagrama que encontre del teclado va a ser posible guiarte..

https://drive.google.com/file/d/0B6UWkqxoeNcNZGVhOTJhOWEtMjc0MC00OWQwLWJhY2ItY2M2ZGNjYjJmMjM2/view
Gracias por el aporte! pero yo la falta que tengo es de saber programar mejor... Una pena que no tenga codigo

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:AYUDA Asignar preescaler al TMR0 en funcion de que tecla pulse
« Respuesta #9 en: 15 de Abril de 2016, 06:12:13 »
Solo decirte que el programa ni el diagrama de flujo van a funcionar como vos esperas.

Algunos errores..

Código: [Seleccionar]
   ORG    5     
Nunca pongas ORG 5 o ORG 0x05, en estos pics no va haber problema por que los GOTO ocupan solo 1 posicion de memoria ( 0x4 ) pero podes llegarte a acostumbrar mal, en los PIC18 los GOTO ocupan 2 espacios de memoria ( 0x04 y 0x05 el equivalente a ese caso, aunque los vectores son 0x8 y 0x18), el mismo compilado se va a encarga de acomodarlos asi que mejor ahorranos eso. Es mas que nada un error de aplicacion o de entendimiento de como funciona el programador, no va a cambiar como funciona tu programa.

No un error per se, pero:

Código: ASM
  1. CLRF   INTCON            ;limpiamos todo INTCON por si acaso
  2.    BSF      INTCON,GIE         ;habilitamos interrupciones globales
  3.    BSF      INTCON,T0IE         ;habilitamos la interrupcion por ovverflow del TMR0
  4.    BSF      INTCON,INTE         ;habilita la interruñcion por variacion de un bit de forma externa(boton)
  5.    BSF      INTCON,RBIE         ;interrupcion por cambio de puerto

Asegurate que las interrupciones siempre sea lo ULTIMO a activar y configurar, el bit GIE tambien. que sea el ultimo. Para lo que necesitas hacer aca y como lo queres hacer no es necesario el uso de la interrupcion externa por RB0 ( INTE ) asi que deberias sacarlo.

Código: ASM
  1. BTFSS   COLUMNA,N_COLUMNA   ;Comprueba en que columna estamos

Esta instruccion deberia ser un error. Luego de la coma no se puede poner un registro... Solo una constante que va de 0 a 7.

Consejos:

Usa W y F, sacando algunas instrucciones:

Código: ASM
  1. MOVF   PORTB,0            ;el contenido de portB (entrada)se lo pasas a FILA
  2.    INCF   TECLA,1            ;tecla +1
  3.    RLF      FILA,1            ;rota a la izquierda fila

Es mas facil recordar W y F como destino

Código: ASM
  1. MOVF   PORTB, W            ;el contenido de portB (entrada)se lo pasas a FILA
  2.    INCF   TECLA, F            ;tecla +1
  3.    RLF      FILA, F            ;rota a la izquierda fila

La conversion W a 0 y F a 1 estan en el .inc del PIC agregado.

Interrupcion

Aunque como no tenes nada en LOOP no vas a tener problemas, es bueno que te acostumbres a esto. Por que el dia que quieras agregar algo a LOOP y usar una interrupcion vas a tener problemas. La interrupcion funciona asi:



A la izquierda seria el programa de LOOP, y cuando ocurre una interrupcion este salta al vector de interrupcion y guardando la direccion anterior, cuando se sale se usa la instruccion RETFIE, que funciona como un RETURN y ademas activa de nuevo las interrupciones ( bit GIE ). No existe ningun CALL o GOTO desde la rutina LOOP a la interrupcion, el micro cuando ocurre alguna solo hace eso. Lo que te decia es lo siguiente.

Código: ASM
  1. LOOP
  2.     BSF      STATUS, Z
  3.     BTFSS  STATUS, Z
  4.     BSF      PORTA,5
  5.     GOTO   LOOP

Ese simple ejemplo si no guardas el valor de W y STATUS al entrar a la interrupcion traeria problemas. Sigamos las instrucciones, Primero pongo a 1 Z y luego pregunto si esta en 1. lo normal a pensar es que siempre va a saltar al BSF del PORTA. Pero si tenes una interrupcion y como dije no guardas el valor de W y STATUS, podes tener problemas. Suponete que la interrupcion ocurrio luego del BSF STATUS, Z . Entro a la interrupcion, hizo operaciones cambiando los registros STATUS y poniendo a 0 a Z, cuando sale de la interrupcion vuelve a donde estaba antes, es decir a la siguiente instruccion ( BTFSS ) pero esta ves Z es 0 culpa de tu interrupcion, en este ejemplo es "simple" pero si pensas en una suma por ejemplo en que antes de sumar entra a la interrupcion y le cambia el valor a W, es peor. Hay que evitar eso. Asi que lo primero es poner esos registros de proteccion.
Microchip provee el codigo para esto en sus datasheets, si buscas por W_TEMP lo vas a encontrar. Te quedaria algo asi, simplificandolo un poco:

Código: ASM
  1. ISR
  2.  
  3.         MOVWF   W_TEMP          ; Por si las dudas
  4.         SWAPF   STATUS, W
  5.         CLRF    STATUS
  6.         MOVWF   STATUS_TEMP
  7.  
  8.         BTFSC   INTCON, T0IF
  9.         GOTO    INT_TIMER
  10.         BTFSC   INTCON, RBIF
  11.         GOTO    INT_TECLADO
  12.  
  13. SALIDA_ISR:
  14.         SWAPF   STATUS_TEMP, W
  15.         MOVWF   STATUS
  16.         SWAPF   W_TEMP, F
  17.         SWAPF   W_TEMP, W
  18.         RETFIE

Observa que al entrar a la interrupcion guardo los registros W y STATUS a W_TEMP y STATUS_TEMP. Y al salir hago lo contrario, Por que usar SWAPF ? por que esa instruccion no modifica los valores de las banderas de STATUS!. Observa al final el RETFIE tambien.
Al medio tenes la rutina de interrupcion, como hay 2 interrupciones, debo saber exactamente cual es la que ocurrio, si el teclado o si el Timer. Entonces pregunto por cada flag y actuo segun ello.

¿Entonces que nos queda ver?

Hay varias cosas..

- Timer y su valor de carga / preescaler
- Barrido de teclado ya que es matricial
- Rutina de interrupcion de teclado

El Timer , su valor y su preescaler.

Cuando te pregunte sobre las frecuencias no fue coincidencia. Como sabes al Timer hay que cargarlo con un valor  y cuando se produce el overflo 0xFF a 0x00 se entra a la interrupcion.
Podria haber calculado para cada preescaler el valor necesario, pero opte por buscar una solucion mas practica.

Use una calculadora online
http://eng-serve.com/pic/pic_timer.html

Ahi carge la frecuencia del oscilador ( 4Mhz  = 4000000) y luego seleccione el preescaler en 1:16, fui moviendo la barra hasta encontrar los valores que me dieran las frecuencias correspondientes. No me dieron exactas, ya que para eso deberia complicarlo mas, pero no creo que nadie lo note si tiene +/- 1Hz.

Los valores a pesar que yo ya los mire, te los dejo a vos para que sepas cuales son, asi podes cargar tu DO1,RE,MI,FA,SOL,etc.

Esos valores debes cargarlos luego al timer. La funcion es bastante simple

Código: ASM
  1. INT_TIMER
  2.       ; Tomar valor de un registro que tiene el valor a cargar y pasarlo a W
  3.       ; De W al registro del TMR0
  4.       ; Borro flag del TMR0
  5.       GOTO   SALIDA_ISR

Por que tomar los datos de 1 registro y pasarlo al Timer?, por que vos tenes muchas notas, seria muy complicado tener que crear el codigo para todas. Entonces supongamos que la interrupcion del teclado detecta la tecla y dependiendo del valor de la tecla lo convierte en el valor a cargar en el timer, leugo procede a guardarlo en ese registro. Cuando ocurra la interrupcion del timer a este no le importa la tecla que se presiono, siempre va a cargar del mismo lugar. Y de esa forma simplificas el codigo del Timer.

Los comentarios en el programa que di tiene su equivalente a 1 instruccion ASM cada uno, un MOVF , MOVWF y BCF es cada una de ellas.

Barrido del teclado

Ya sigo...

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:AYUDA Asignar preescaler al TMR0 en funcion de que tecla pulse
« Respuesta #10 en: 15 de Abril de 2016, 18:43:59 »
Bueno primero hay que conocer como esta conectado el teclado. Para eso podes usar el PDF que pase antes y alli lo dice. Pero por las dudas aca lo tenes de nuevo:

PORTB = F3 F2 F1 F0 C3 C2 C1 C0

Las filas son entradas y las columnas salidas.
Con el pull-up activado, cuando no tengas presionado nada las filas van a estar en 1 todas, es decir 1111xxxx.

Entonces tenes que probar columna por columna para saber cual es el boton que tenes presionado. Para eso tenes que poner un 0 en una de las columnas, revisar si la fila es 0 alguno, sino seguis con la otra columna, Eso es el barrido Y es lo que tenes realizado en tu diagrama de flujo.

Esto te va permitir encontrar que tecla esta presionada, una ves detectada la tecla podes usar una tabla para que devuelva el valor a cargar en el Timer.

Rutina de interrupcion de teclado

Esta es la parte un poco Complicada tal ves de entender. La interrupcion del RB4 a RB7 es por nivel, es decir que si alguna de esas estaba en 0 y paso a 1 se produce la interrupcion, lo mismo ocurre si alguna estaba en 1 y pasa a 0.

Inicialmente comenzamos con todas las filas en 1111 por no tener presionado nada. Las columnas deberia estar todas puestas a 0 al comienzo ( no solo 2 bits como tenes en tu diagrama de flujo), Esto es por que si presionas algun boton de la primer columna y la primer columna esta en 1, lo que vas a leer en la fila es nuevamente un 1. Y no va a cambiar, por lo cual no va entrar a la interrupcion. En resumen en esta parte deberias comenzar con todas las columnas en 0 en el setup ( cuando configuras el tris, etc )

Cuando se toca algun boton uno de los bits de la fila cambia de 1 a 0. Y entra a la interrupcion. Al entrar lo que tenes que hacer es poner todas las columnas a 1, y comenzar el barrido del teclado ( lo que dije antes ), cargar el registro del timer con el valor del boton ese y salir. Pero al salir debe dejar nuevamente todos las columnas en 0, sino no vas a poder entrar de nuevo a la interrupcion. Por lo mismo que dije antes.

Cuando se suelta el boton suponete que estaban las filas en 1101, pasaria a 1111, lo cual entra nuevamente a la interrupcion, pero esta ves al ser todo 1111 deberias evitarlo ya que al estar todas las columnas en 0, y todas las filas en 1 quiere decir que se soltaron todos los botones.

Como te decia esto esta complicado por demas. Ya que en tu loop podrias hacer:

Código: ASM
  1. LOOP:
  2.       CALL DEMORA_100ms
  3.       CALL Lectura_Teclado
  4.       CALL Tabla_Teclado_A_Timer
  5.       MOVWF  TIMER_VALOR          ; Registro que va a usar el timer en la rutina de interrupcion
  6.       GOTO LOOP

Y listo, ya tenias tu programa sin complicaciones. Pero no se por que el querer usar las interrupciones del PORTB tambien.
Hasta el PIC'School, provee una libreria que tiene la funcion para leer el teclado.

Desconectado MicroCT

  • PIC10
  • *
  • Mensajes: 6
Re:AYUDA Asignar preescaler al TMR0 en funcion de que tecla pulse
« Respuesta #11 en: 20 de Abril de 2016, 17:08:59 »
Bueno primero hay que conocer como esta conectado el teclado. Para eso podes usar el PDF que pase antes y alli lo dice. Pero por las dudas aca lo tenes de nuevo:

PORTB = F3 F2 F1 F0 C3 C2 C1 C0

Las filas son entradas y las columnas salidas.
Con el pull-up activado, cuando no tengas presionado nada las filas van a estar en 1 todas, es decir 1111xxxx.

Entonces tenes que probar columna por columna para saber cual es el boton que tenes presionado. Para eso tenes que poner un 0 en una de las columnas, revisar si la fila es 0 alguno, sino seguis con la otra columna, Eso es el barrido Y es lo que tenes realizado en tu diagrama de flujo.

Esto te va permitir encontrar que tecla esta presionada, una ves detectada la tecla podes usar una tabla para que devuelva el valor a cargar en el Timer.

Rutina de interrupcion de teclado

Esta es la parte un poco Complicada tal ves de entender. La interrupcion del RB4 a RB7 es por nivel, es decir que si alguna de esas estaba en 0 y paso a 1 se produce la interrupcion, lo mismo ocurre si alguna estaba en 1 y pasa a 0.

Inicialmente comenzamos con todas las filas en 1111 por no tener presionado nada. Las columnas deberia estar todas puestas a 0 al comienzo ( no solo 2 bits como tenes en tu diagrama de flujo), Esto es por que si presionas algun boton de la primer columna y la primer columna esta en 1, lo que vas a leer en la fila es nuevamente un 1. Y no va a cambiar, por lo cual no va entrar a la interrupcion. En resumen en esta parte deberias comenzar con todas las columnas en 0 en el setup ( cuando configuras el tris, etc )

Cuando se toca algun boton uno de los bits de la fila cambia de 1 a 0. Y entra a la interrupcion. Al entrar lo que tenes que hacer es poner todas las columnas a 1, y comenzar el barrido del teclado ( lo que dije antes ), cargar el registro del timer con el valor del boton ese y salir. Pero al salir debe dejar nuevamente todos las columnas en 0, sino no vas a poder entrar de nuevo a la interrupcion. Por lo mismo que dije antes.

Cuando se suelta el boton suponete que estaban las filas en 1101, pasaria a 1111, lo cual entra nuevamente a la interrupcion, pero esta ves al ser todo 1111 deberias evitarlo ya que al estar todas las columnas en 0, y todas las filas en 1 quiere decir que se soltaron todos los botones.

Como te decia esto esta complicado por demas. Ya que en tu loop podrias hacer:

Código: ASM
  1. LOOP:
  2.       CALL DEMORA_100ms
  3.       CALL Lectura_Teclado
  4.       CALL Tabla_Teclado_A_Timer
  5.       MOVWF  TIMER_VALOR          ; Registro que va a usar el timer en la rutina de interrupcion
  6.       GOTO LOOP

Y listo, ya tenias tu programa sin complicaciones. Pero no se por que el querer usar las interrupciones del PORTB tambien.
Hasta el PIC'School, provee una libreria que tiene la funcion para leer el teclado.

Entiendo... voy a ponerlo en practica y a probarlo en el PIC que he estado algo liado..., lo que comentabas de librerias, yo tambien me pregunto lo mismo, pero bueno lo piden así, una pena el no dejar hueco para la imaginacion pero que se le va a hacer...
No tengo palabras para decir lo mucho que me ha ayudado amigo, muchiiisimas gracias has sido super amable, esperoq ue todo le vaya bien y que dios le bendiga,un abrazo!  ((:-)) ((:-)) ((:-)) ((:-)) ((:-)) ((:-)) ((:-)) ((:-)) ((:-)) ((:-)) ((:-)) ((:-))


 

anything