Autor Tema: Teclado matricial Flex 4x4 interrupción RB[7-4] + antirebote int_timer0  (Leído 32667 veces)

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

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5474
    • Electrónica Didacta
Re: Teclado matricial Flex 4x4 interrupción RB[7-4] + antirebote int_timer0
« Respuesta #15 en: 11 de Octubre de 2008, 18:46:32 »
Saludos de nuevo Cryn  8)

Sip, uso el desplazamiento de bits, mira un extracto de teclado_flex_change_portb.c

Código: C
  1. ...
  2. void  Configurar_iPuerto_compuesto(void){
  3.   iPuerto_compuesto=0;
  4.   iPuerto_compuesto = input_b() & iLos_Cuatro_MSB_PORTB;
  5.   iPuerto_compuesto |= (input_state(iColumna3) << 3);
  6.   iPuerto_compuesto |= (input_state(iColumna2) << 2);
  7.   iPuerto_compuesto |= (input_state(iColumna1) << 1);
  8.   iPuerto_compuesto |= input_state(iColumna0);
  9. }
  10. ...

El funcionamiento sigue así:

- interrupción timer0 = deshabilitada
- interrupción por cambio de flanco en RB[7-4] (int_rb) = habilitada
- bucle prinicipal activo
- al producirse una pulsación, ocurre un cambio de flanco en RB, por lo que ocurrirá una interrupción int_rb

- En la función void control_rb(), configuro y activo el timer0 no sin antes haber guardado el dato que corresponde a la tecla pulsada.

- se deshabilita int_rb

- a partir de allí, seguirá el bucle principal activo, ocurriendo una interrupción timer0 cada milisegundo.

- En cada interrupción timer0, se incrementará un contador, cuando dicho contador llegue a 30, es porque han transcurrido ~30ms desde que se pulsó la tecla, entonces hago una nueva lectura de los pines asociados al teclado matricial.

- Si esa nueva lectura coincide con la lectura que tomé al inicio de int_rb, quiere decir que efectivamente es una pulsación válida y la tomo como tal para procesar futuros eventos.

- el resto es limpiar las variables asociadas al timer, deshabilitarlo y habilitar el int_rb para una futura pulsación.


notas:
- ten en cuenta que en el intervalo de los 30ms, si pulsas una tecla, no ocurrirá nada, porque int_rb es deshabilitada.

- se toman las previsiones respectivas de limpiar el puerto, etc. para permitir una int_rb a posteriori.

- La finalidad del timer0 es antirebotes unicamente (base de tiempo de 1ms).


La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: Teclado matricial Flex 4x4 interrupción RB[7-4] + antirebote int_timer0
« Respuesta #16 en: 14 de Octubre de 2008, 15:45:25 »
Entendido Pali, muchas gracias por tu explicación, ahora lo entiendo mejor.

Disculpa ser tan abusivo, pero me podrías explicar como es qeu funciona la detección de la tecla presionada?? osea los desplazamietos de bits??

y que me dices con las teclas que se presionan y se mantienen presionadas por un tiempo indefinido, tu sabes usuarios locos que las gusta mantener presionadas las teclas por ganas de...  :D tu sabes.

un abrazo Pali
.

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5474
    • Electrónica Didacta
Re: Teclado matricial Flex 4x4 interrupción RB[7-4] + antirebote int_timer0
« Respuesta #17 en: 15 de Octubre de 2008, 13:16:33 »
Una de las funciones de teclado_flex_change_portb.c es traducir la tecla pulsada a un número constante, y con dicho numero podemos procesar esa tecla en otra función.

si pulsas mas de un tecla, entonces se leerá un número que no corresponde a las constantes declaradas y por tanto no tendrá efecto.

si mantienes una tecla pulsada indefinidamente, el programa correrá igual como si la pulsas regularmente, (de no ser así habrá una rutina que añadir para evitar los posibles efectos)
La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: Teclado matricial Flex 4x4 interrupción RB[7-4] + antirebote int_timer0
« Respuesta #18 en: 17 de Octubre de 2008, 13:36:11 »
saludos Pali, gracias por la respuesta, he estado viendo tu codigo y tengo unas nuevas dudas:

1. para q usas #asm movf PORTB,0 #endasm ? osea que significará para el programa?

2. si uso netamente el puerto B, ya no hace falta hacer puerto compuesto, no?

3. una vez que la tecla es reconocida, que pasa si se mantiene el cero por un instante y ocurre otra interrupcion por cambio de estado de 0 a 1.

4. Haz hech multiplezacion con un LCD, si no donde crees q puedan ir algunas modificaciones, para que no se interfieran entre si.

Muchas gracias por la ayuda, un saludo.
.

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5474
    • Electrónica Didacta
Re: Teclado matricial Flex 4x4 interrupción RB[7-4] + antirebote int_timer0
« Respuesta #19 en: 18 de Octubre de 2008, 13:14:08 »
Hola Cryn

Respuestas:

1.)

Código: C
  1. #asm movf PORTB,0 #endasm  // con estas 2 lineas, se borra
  2.  clear_interrupt(INT_RB);   // RBIF al inicio del programa

"The input pins (of RB7:RB4)
are compared with the old value latched on the last
read of PORTB. The “mismatch” outputs of RB7:RB4
are OR’ed together to generate the RB port change
interrupt with flag bit RBIF (INTCON<0>).

This interrupt can wake the device from Sleep. The
user, in the Interrupt Service Routine, can clear the
interrupt in the following manner:


a) Any read or write of PORTB. This will end the
mismatch condition.

b) Clear flag bit RBIF.

A mismatch condition will continue to set flag bit RBIF.
Reading PORTB will end the mismatch condition and
allow flag bit RBIF to be cleared
"

Este texto que lo puedes conseguir en la mayoría de los datasheet cuyos pics poseen sistema de interrupción por cambio de flanco en RB[7-4]

2.)

 nop, si no usas iPuerto_compuesto, entonces el programa no funcionará

3.)
 
Código: C
  1. #int_rb
  2. ...
  3. if(iFlanco_RB != iLos_Cuatro_MSB_PORTB){
  4. // este condicional sirve para validar cuando se pulsa
  5. // la tecla (mas NO cuando se suelta).
  6. ...

precisamente este condicional rechaza el flanco ascendente. La única manera que entre a ese if, es cuando se pulsa la tecla (si la tecla se suelta, no entrará y saldrá al final de la función int_rb:

Código: C
  1. ...
  2. #asm movf PORTB,0 #endasm
  3. Limpiar_Columnas();
  4. ...

4.)

 No lo he probado, pero según el gran pocher le ha funcionado bien:

http://www.todopic.com.ar/foros/index.php?topic=21747.msg170680#msg170680



...
si mantienes una tecla pulsada indefinidamente, el programa correrá igual como si la pulsas regularmente, (de no ser así habrá una rutina que añadir para evitar los posibles efectos)

quiero hacer una correción: si dejas una tecla pulsada indefinidamente, no ocurrirá nada, si quieres que esa misma tecla tenga el efecto deseado, tendras que soltarla y volverla a presionar.

La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: Teclado matricial Flex 4x4 interrupción RB[7-4] + antirebote int_timer0
« Respuesta #20 en: 21 de Octubre de 2008, 19:04:16 »
ok muchísimas gracias por las respuestas Pali, tardé en responder pero ya las había leído, las estaba analizando y aplicando :mrgreen:

y pues ahora me doy cuenta de porque entraba a la rutina de interrupcion rb al comienzo de mi programa sin presionar ninguna tecla, no sabia porque, gracias por la "quote" de la hoja de datos, ya lo he corregido.
Pero como soy testarudo y me gusta qe todo este en C, he puesto esta instruccion: output_b(input_b()); que hace lo mismo y en asm me genera esto:
....................    output_b(input_b());
29C0:  MOVFF  F81,F8A
....................    clear_interrupt(INT_RB);
29C4:  BCF    FF2.0

sobre el lcd lo estoy viendo, por ahora he tenido unos resultados más o menos buenos, tengo una rutina donde atiendo a la tecla que se ha presionado, y cuando termino hago el tris, para ponerlo a teclado, y en la lib del lcd siempre hace el tris que necesita para manejar correctamente el lcd.

tengo todavía algunos problemas, pero creo qeu ya son menores.

muchas gracias por la ayuda, es muy buena esta tecnica, gracias a pocher, y a ti Pali por el desarrollo y la excelente explicación
.

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5474
    • Electrónica Didacta
Re: Teclado matricial Flex 4x4 interrupción RB[7-4] + antirebote int_timer0
« Respuesta #21 en: 22 de Octubre de 2008, 13:24:35 »
Mira seria conveniente que miraras el flag del timer cuando lo configures dentro de void control_rb(), debe estar a cero al salir de esa interrupción, sino entonces no pasaran los 30ms sino un tiempo mucho menor y no funcionará y te producirá el efecto de que cuando presiones una tecla, se procesará mas de una vez (incluso 3 o 4 veces).

También intenta bajar el retardo antirebotes e.j: 15ms
o puedes poner 3 comprobaciones del puerto_compuesto, en fin, debes ajustar en caso que hayas problemas.


La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: Teclado matricial Flex 4x4 interrupción RB[7-4] + antirebote int_timer0
« Respuesta #22 en: 22 de Octubre de 2008, 16:47:59 »
Mira seria conveniente que miraras el flag del timer cuando lo configures dentro de void control_rb(), debe estar a cero al salir de esa interrupción, sino entonces no pasaran los 30ms sino un tiempo mucho menor y no funcionará y te producirá el efecto de que cuando presiones una tecla, se procesará mas de una vez (incluso 3 o 4 veces).

eh?? si en la int rb se activa la int timer como podrá ser inmediatamente 0 su flag al salir de la interrupcion rb?


descarte los defines, ya que uso directamente el puerto b para todo, de ahi iba mi pregunta si el puerto compuesto era necesario, hice sin ello (sin el puerto_compuesto) y me ha funcionado, utilizando directamente el puertoB.

donde colocarías las 3 comprobaciones?

thxs
.

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5474
    • Electrónica Didacta
Re: Teclado matricial Flex 4x4 interrupción RB[7-4] + antirebote int_timer0
« Respuesta #23 en: 24 de Octubre de 2008, 15:56:57 »

#int_rb // Interrupcion cambio de estado RB[4-7]

void control_rb() {

  iFlanco_RB = input_b() & iLos_Cuatro_MSB_PORTB;

  // almacena el valor de RB[7-4] inicial
  if(iFlanco_RB != iLos_Cuatro_MSB_PORTB){
     // este condicional sirve para validar cuando se pulsa
     // la tecla (mas NO cuando se suelta).
     // consume 4 lineas de asm.
     disable_interrupts(INT_RB);
     // deselecciona la interrupción por cambio en PORTB
     // para comenzar el retardo antirebote
     iContador_1ms=0;
     clear_interrupt(int_timer0);   // borrar el flag del timer0 por precaución
     setup_timer_0(RTCC_INTERNAL|RTCC_DIV_64|RTCC_8_BIT);
     // configura el Timer0 base de tiempo interno, pre-escaler=1:256
     set_timer0(68); // retardo de ~ 1ms
     enable_interrupts(INT_TIMER0);#
  }
...



La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: Teclado matricial Flex 4x4 interrupción RB[7-4] + antirebote int_timer0
« Respuesta #24 en: 24 de Octubre de 2008, 16:04:27 »
ahhh disculpa el mal entendido, te referías a eso. vale lo estaré probando, muchas gracias Pali
.

Desconectado hard8507

  • PIC10
  • *
  • Mensajes: 44
Re: Teclado matricial Flex 4x4 interrupción RB[7-4] + antirebote int_timer0
« Respuesta #25 en: 26 de Agosto de 2009, 02:32:42 »
alguien q pueda poner alguna simulacion del teclado matricial y el lcd gracias

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5474
    • Electrónica Didacta
Re: Teclado matricial Flex 4x4 interrupción RB[7-4] + antirebote int_timer0
« Respuesta #26 en: 26 de Febrero de 2011, 14:04:50 »
una proyectico que estoy haciendo y utilizando la librería Teclado_flex_change_portb.C



en este caso, se hace uso de los pines RB[7-4] y RA[3-1] para comandar las teclas dispuestas en filas y columnas respectivamente
La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado Diamel

  • PIC10
  • *
  • Mensajes: 13
Re: Teclado matricial Flex 4x4 interrupción RB[7-4] + antirebote int_timer0
« Respuesta #27 en: 07 de Junio de 2011, 15:06:06 »
Buenos dias estoy intentando adapatar la libreria para el PIC18F252 en C18 y actualmente estoy teniendo problemas con respecto a los pulsos que me envia el teclado al presionar una tecla.
adjunto una imagen de como estoy intentando simularlo, el problema para ser mas especifico es que el puerto RB4-7 en la simulacion del ejemplo se encuentran en 1 y al presionar la tecla se va a 0 dependiendo de la fila que se presiono. he intendado hacer lo  mismo en C18 y no funciona ya que todo el puerto se queda en 0 siempre.


Este es el main del original:
Código: [Seleccionar]
void main() {
   //...
   output_b(0);
   //...
   set_tris_b(0b11110000);  // RB[7-4] son entradas
   // los pines correspondiente a las columnas deben ser salidas
   //...
   port_b_pullups(true); 
   // no es obligatorio. Si es false, se colocan pull-up externas en RB[7-4]


Este es el main de C18:

Código: [Seleccionar]
void main()
{

PORTB=0; //puerto B en 0
TRISB=0x11110000; //RB7-4 Entradas
INTCON2bits.RBPU = 0; //Pullup Puerto B activada


La razon por lo que se queda todo el puerto B la se ya que yo mismo lo estoy poniendo en 0, pero en el otro codigo no veo ninguna parte donde hagan algo diferente.

Espero alguien me pueda ayudar :-p, Salu2.

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5474
    • Electrónica Didacta
Re: Teclado matricial Flex 4x4 interrupción RB[7-4] + antirebote int_timer0
« Respuesta #28 en: 08 de Junio de 2011, 00:11:17 »
Hola Diamel.

te puedo ayudar con la lógica del programa, mas no con el C18  :(

casi al inicio del main, hice blanquear al puerto, por cuestiones de prevención (según lo dicta microchip).

pero, el hecho de que quede el portb=0, no es algo propio del programa.

al menos RB[7-4], deben estar a 1 todo el tiempo, porque el programa realiza un barrido y en cada paso, uno de los 4 pines altos del portb se coloca a 0 (el que corresponde a la tecla pulsada).

la única forma de que RB[7-4] sea 0, es que presiones las 4 filas simultáneamente, (y aún así, habrá un intervalo de tiempo donde los otros pines altos del portb se colocan en alto)

el control de los pines bajos del portb, depende de la selección que hayas hecho para las columnas, no se me ocurre porque lo tengas en cero todo el tiempo, harían falta mas detalles de la programación que llevas

La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado Suky

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Teclado matricial Flex 4x4 interrupción RB[7-4] + antirebote int_timer0
« Respuesta #29 en: 08 de Junio de 2011, 00:31:57 »
Si quieres escribir en el puerto utiliza los registros LATx... Aunque aquí no sea el problema, es mejor que lo adoptes. Luego podrías probarlo con el micro, puede ser un problema de simulación.



Saludos!
No contesto mensajes privados, las consultas en el foro


 

anything