Hola, es mi primera vez con los PIC's y ya mas o menos me estoy moviendo bien y ahorita estoy preparandome para para el proyecto final de mi universidad pero me estoy atorando con algo y creo que no solo toy reinventando el hilo si no que hasta mas cuerda le toy metiendo asi que acudo a este sitio, la mayoria de los codigos ejemplos que halle estan en C asi que no me sirven mucho (sorry, pero hemos estado viendo todo en puro ASM ) y antes de pedir el codigo de alguien me gustaria hecharme este codigo por mi mismo para que se acomode a mis necesidades ( o mas bien puro reto personal).
Pero bueno, en el topic practicamente he puesto todo: Estoy teniendo complicaciones con el uso de las interrupciones de cambio de estado del puerto RB 4:7 usandolas con un teclado 4x4 en un micro PIC18f4680
Primero, para estar seguro que he entendido lo que el datasheet ha querido decir unas afirmaciones (suposiciones mias) corrigirme si estoy incorrecto
- El micro por si mismo recuerda el ultimo estado de los pines RB 4:7, cuando estos pines cambian su estado es cuando se activa la RBIF
- Dentro de la interrupcion debo leer/escribir el puerto B por ejemplo con un MOVF PORTB, W para que no redispare el RBIF, aparte de apagar RBIF (y proteger WREG, STATUS y BSR)
- las interrupciones que estan en RB 0:2 , las INT0,1,2 no se ven afectadas por estos pines.
Ahora, explicare bien mis necesidades:
El teclado obviamente es solo un modulo mas de lo que sera mi proyecto, por lo tanto solo quiero gastar tiempo en el cuando se ha presionado una tecla, de ahi que halla decidido usar los pines de RB 4:7, por la caracteristica de sus interrupciones pero me he bloqueado yo solo con el funcionamiento de los teclados. PAra ser mas explicativo dire como tengo la conexion:
4 de los pines del teclado (las Filas del teclado para ser exactos) van a RB 4:7 los otros 4 pines los lleve a los pines RD 0:3, principalmente para no perder las interrupciones externas en RB 0:3 y por que esos 4 pines del puerto D los tenia libres del LCD y no me gusta desperdiciar pines. Al inicio declaro los pines de RB 4:7 como entradas con sus pull-ups funcionando (Verificado esto con multimetro) y los pines RD 0:3 como salida con un valor de 0 logico.
En si mi idea para solo checar el teclado cuando es necesario es "simple" al presionar cualquier boton la entrada del pin RB bajara a cero, provocando la activacion de RBIF, entro a su vector de interrupcion, localizo cual de los 4 bits es la fila y ahora viene lo que me dejo en jaque y ha hecho que me salga de mi camino: ¿como verifico cual columan es la que esta presionada? los puertos RD estan de salida con cero logico, eso significa que los cuatro puertos de RD tienen el mismo valor, la soluccion que pense es cambiar los puertos D de salida a entrada siguiendo estos pasos:
1- retiro los pull up del puerto B (el cual se supone en ese instante seguira a cero volt con una corriente despreciable)
2- Espero 3 instrucciones (NOP)
3- Cambio el TRISD de tal forma que ahora los pines RD 0:3 sean de entrada y no salida
4- vuelvo a esperar 3 instrucciones
5- Restauro los pull up del puerto B (los movimientos con los pull ups es para evitar que la corriente que esta circulando peuda dañar los pines)
Con esto, lo que intento es que ahora solo uno de las 4 columnas este energizada ya que RB estara a 1 logico por el pull up y el RD correspondiente le estara entrando ese uno logico... (Al final restauro TRISD para que vuelva ser entrada)
Sin embargo estos pasos se me hacen ya fuera de lugar y por eso pregunto aqui donde tengo un error o si hay una forma mas correcta de hacerlo recordando que solo quiero escanear el teclado cuando se halla detectado que se presiono un boton, no antes