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
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?
Eso mas el diagrama que encontre del teclado va a ser posible guiarte..Gracias por el aporte! pero yo la falta que tengo es de saber programar mejor... Una pena que no tenga codigo
https://drive.google.com/file/d/0B6UWkqxoeNcNZGVhOTJhOWEtMjc0MC00OWQwLWJhY2ItY2M2ZGNjYjJmMjM2/view
ORG 5 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
LOOP: CALL DEMORA_100ms CALL Lectura_Teclado CALL Tabla_Teclado_A_Timer MOVWF TIMER_VALOR ; Registro que va a usar el timer en la rutina de interrupcion 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.