Autor Tema: PIC18f4680 Teclado 4x4 y RB 4:7  (Leído 3047 veces)

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

Desconectado Belsirk

  • PIC10
  • *
  • Mensajes: 8
PIC18f4680 Teclado 4x4 y RB 4:7
« en: 04 de Noviembre de 2008, 04:08:03 »
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

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: PIC18f4680 Teclado 4x4 y RB 4:7
« Respuesta #1 en: 04 de Noviembre de 2008, 04:36:41 »
Hola Belsirk. Bienvenido al foro.

Como veo que no sos tan principiante, te lo voy a explicar rápidamente:
Primero te corrijo: las interrupciones que están en RB0:RB3 no se ven afectadas;
Segundo:
Cuando se produce una interrupción por cambio del puerto b(RB4:RB7) lo que tenés que hacer es lo siguiente:
Poner todas las columnas en un estado lógico elevado, excepto una. Supongamos que elijo la de RD0, entonces me quedaría así el puertoD: XXXX1110

ahora, inmediatamente leo el puertob y me fijo si RB4,RB5,RB6 y/o RB7 están en bajo. Si están en bajo es porque se está presionando esa tecla(supongamos que RB5 está en bajo) entonces ya tienes la tecla: es la tecla que se ubica en la fila RB5 y columna RD0. Si hay más de una fila en cero, se está presionando más de un pulsador de esa columna y deberás decidir tu si permites presion simultánea de teclas o las ignoras o indicas error(o lo que se antoje).
Luego, pasas a la proxima columna, lo que haces es ahora poner a cero la segunda columna(RD1) y al resto la pones en alto quedandote ahora el puertoD así: XXXX1101. Vuelves a revisar el puertoB y te fijas si hay alguna fila en 0. Haces lo mísmo con las otras dos columnas(RD2 y RD3).
Y así lograrás barrer y detectar los 16 pulsadores en este array de 4x4.

Mucho más sencillo de lo que pensabas, eh? ;)

Saludos.

Saludos.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado Belsirk

  • PIC10
  • *
  • Mensajes: 8
Re: PIC18f4680 Teclado 4x4 y RB 4:7
« Respuesta #2 en: 04 de Noviembre de 2008, 21:52:35 »
Si, ya capte el mecanismo, muchas gracias,  aplicare lso cambios  en la nche y mañana calare otra vez el circuito, y si, ya sabia que me estaba viajando gachamente

Desconectado amadeuscito

  • PIC10
  • *
  • Mensajes: 7
Re: PIC18f4680 Teclado 4x4 y RB 4:7
« Respuesta #3 en: 05 de Diciembre de 2008, 12:56:04 »
disculpen, yo tengo un problema muy parecido y pues como ya abrieron este ¿para que abrir un nuevo tema?

Resulta que mi teclado igual 4x4, lo tengo en el puerto b, primero rb7:rb4 entradas y rb3:rb0 salidas, y se invierten cuando ocurre la interrupcion y cuando termina de detectar la tecla de interrupcion. En este proceso primero mando 'unos' por rb3:rb0 y cuando se presiona la tecla, pues ese 'uno' lo recibe alguna entrada: rb7:rb4. Tengo activados los permisos de interrupcion y las resistencias pull up.

No funciona mi programa, conforme lo que dice BrunoF, entonces debo entender que en vez de unos, debo mandar 'ceros'? Si la respuesta es si, hay alguna forma de que detecte los 'unos' por interrupcion en rb7:rb4?

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: PIC18f4680 Teclado 4x4 y RB 4:7
« Respuesta #4 en: 05 de Diciembre de 2008, 14:42:32 »
Hola!

Lo que pasa es que las pull ups internas del PIC, como bien dicen son resistencias a +, por lo que las entradas rb4:rb7 estarán constantemente recibiendo un 1 lógico si no se presione ninguna tecla. Si tu envias unos, el uC no notará el cambio en sus entradas.

Si hay una forma de que detecte "unos" por interrupción en rb4:rb7, pero para ello tendrías que dessactivar las pull up internas del uC y poner resistencias externas conectadas a Gnd. Te recomiendo que replantees tu programa.

Saludos.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado amadeuscito

  • PIC10
  • *
  • Mensajes: 7
Re: PIC18f4680 Teclado 4x4 y RB 4:7
« Respuesta #5 en: 05 de Diciembre de 2008, 15:42:04 »
Gracias, al ratito pongo como me fue

Desconectado amadeuscito

  • PIC10
  • *
  • Mensajes: 7
Re: PIC18f4680 Teclado 4x4 y RB 4:7
« Respuesta #6 en: 06 de Diciembre de 2008, 17:41:57 »
Hola de nuevo, me resultó tal como me aconsejaste, quite las pull up, conecté en los puertos rb7:rb4 resistencias de 47Kohms y ahora mi circuito me detecta las interrupciones, sin embargo ahora el problema es que no sale de dicha interrupción, en mi programa ya bajé la bandera por interrupcion en éstos cuatro pines (leí el puerto b antes por supuesto).

El programa recorre toda la interrupción, ejecutando los comandos, todo muy bien, pero no sale de la interrupción. Ya hice un nuevo post de todos modos, ya que es tema diferente. Igual muchísimas gracias BrunoF, te debo 1.