Autor Tema: Problema con teclado e Interrupcion RB en CCS y 16F877  (Leído 10352 veces)

0 Usuarios y 3 Visitantes están viendo este tema.

Desconectado Diploko

  • PIC10
  • *
  • Mensajes: 9
Problema con teclado e Interrupcion RB en CCS y 16F877
« en: 11 de Noviembre de 2010, 05:32:18 »
Hola a tod@s,
En primer lugar enhorabuena a todos los que aportais ideas y soluciones, gracias a todos ustedes me resulta mas fácil iniciarme.

Consigo capturar todas las teclas del teclado sin problemas siempre y cuando no use interrupciones, por ejemplo, así:
Código: [Seleccionar]
while(true)
{
    button=ConsultaTecla();       //Me quedo con la tecla pulsada

    if(!button==0) //Si se pulsó tecla la saco por RS232
printf("Button: \%02u \n",button);

    delay_ms(10); //Pequeño retardo
}
Con este código simple en el main consigo leer correctamente el teclado.

El problema lo tengo cuando quiero hacerlo de la forma correcta mediante interrupción RB4-RB7. Esto es lo que hago:
Código: [Seleccionar]
#include <16F877.h>
#FUSES XT,NOPROTECT,PUT,BROWNOUT,NOLVP,NOWDT,NOWRT,NODEBUG
#USE DELAY(CLOCK=4000000)
#USE RS232(baud=19200, xmit=PIN_C6, rcv=PIN_C7)

//Archivos incluidos en la compilación
#include <BotoneraTemporal.c>

#byte PORTB=0x06
#byte TRISB=0x86

int button;

#int_RB
void RB_isr(void) //función de interrupción
{
button=ConsultaTecla();      
printf("Int Button: \%02u ",button); //Monitorizo por RS232 el botón pulsado
clear_interrupt(INT_RB);
}

void main()
{
enable_interrupts(GLOBAL);
enable_interrupts(INT_RB);

set_tris_a(0xFF);
set_tris_b(0xF0);
set_tris_c(0x00);
set_tris_d(0b11000000);
set_tris_e(0x00);
  
port_b_pullups(true);

while(true)
{

}


"BotoneraTemporal.c":
Código: [Seleccionar]

#byte kbd_port_b= 6

int const Teclas[4][4] = {{1,2,3,4},
                          {5,6,7,8},
                          {9,10,11,12},
                          {13,14,15,16}};

//Función que devuelve el código [int] de cada tecla
int ConsultaTecla()
{
int tecla=0;
int f,c,t,i,j;

set_tris_b(0x0F); // RB7-RB4 salidas, RB3-RB0 entradas

for(f=0x10, i=0; i<4; f<<=1, i++)
{
for(c=0x01, j=0; j<4; c<<=1, j++)
{
kbd_port_b = ~f;
delay_cycles(1);
t = kbd_port_b & 0x0F;
t = ~(t | 0xF0);
if(t == c)
{
delay_ms(20);
tecla=Teclas[i][j];
while(t==c)
{
t = kbd_port_b & 0x0F;
t = ~(t | 0xF0);
}
break;
 }
}
if(tecla)
break;
}

return tecla;
}


Creo que el problema lo tengo en la configuración del portb o bien de la interrupción... con los cambios que intento hacer o no entra en la interrupción o entra constantemente...
He leido varios temas relacionados que he encontrado pero no consigo detectar el problema, ¿alguien me puede ayudar?

Gracias
Salu2!

« Última modificación: 11 de Noviembre de 2010, 05:55:18 por Diploko »

Desconectado firepic

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1130
    • JC Servicios
Re: Problema con teclado e Interrupcion RB en CCS y 16F877
« Respuesta #1 en: 11 de Noviembre de 2010, 09:30:18 »
Qué tal diploko!
Tengo algo de tiempo alejado de los pics, ahora me estoy reactivando...

Pero si mal no recuerdo, en la rutina de interrupción de RB debes:
- desactivar las interrupciones.
- leer el puerto B (esa una condición obligatoria).
- hacer lo que quieras que se ejecute cuando hay interrupción.
- volver a activar las interrupciones.

Estuve viendo por ahí y creo que por aquí hay códigos que te pueden ser útiles:
Leer teclado en C
Sería cuestión de echarle una retocada a las líneas...

Bueno como siempre, si estoy en un error que por favor lo corrijan los maestros del foro.
Saludos a todos, nos leemos!  :mrgreen:
« Última modificación: 11 de Noviembre de 2010, 10:06:09 por firepic »
"Por la presunción solo se ocasiona una lucha, pero con los que consultan juntos hay sabiduría" (Proverbios 13:10).
Visita Mi Sitio Web

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Problema con teclado e Interrupcion RB en CCS y 16F877
« Respuesta #2 en: 11 de Noviembre de 2010, 10:06:03 »
Yo utilizaría el nibble alto del puerto B (RB4 a RB7) como entrada y el nibble bajo como salida.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado firepic

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1130
    • JC Servicios
Re: Problema con teclado e Interrupcion RB en CCS y 16F877
« Respuesta #3 en: 11 de Noviembre de 2010, 10:10:02 »
Yo utilizaría el nibble alto del puerto B (RB4 a RB7) como entrada y el nibble bajo como salida.

Jeje qué tonto soy... "elemental mi querido Wakson" jeje...
Gracias AngelGris!  :-/  Pues claro, si se usan RB4:7 como salidas cómo vamos a esperar que funcionen la interrupción en RB??

Por ahí debe ir el error principal...
Ojalá que logres resolver Diploko!
« Última modificación: 11 de Noviembre de 2010, 10:12:06 por firepic »
"Por la presunción solo se ocasiona una lucha, pero con los que consultan juntos hay sabiduría" (Proverbios 13:10).
Visita Mi Sitio Web

Desconectado Diploko

  • PIC10
  • *
  • Mensajes: 9
Re: Problema con teclado e Interrupcion RB en CCS y 16F877
« Respuesta #4 en: 11 de Noviembre de 2010, 12:44:37 »
Gracias a los 2 por responder!
firepic, tomo nota de los cambios que indicas pero no hay mejoría.
El enlace que indicas ya lo había visto y los códigos que ponen no me funcionan y tampoco me queda claro que a ellos les funcionase la interrupción  :?.

AngelGris, el PORTB ya lo tengo configurado como dices
Código: [Seleccionar]
set_tris_b(0xF0); solo que en la funcion "ConsultaTecla" le doy la vuelta para conseguir la tecla pulsada pero luego vuelvo a configurarla como al principio (RB4-7 como entradas) en dicha función.
Insisto, la función "ConsultaTecla" funciona bien siempre y cuando no use #int_RB.

Pruebo y pruebo... sin resultados satisfactorios...  :5] ¿Debería usar otra función para leer la tecla pulsada? si es así aconsejenme una porque las que encontré no me funcionan.

Este es el código que tengo funcionando ahora mismo (ahora en un solo archivo para que sea más rápido de leer), el resultado es que #int_RB se ejecuta constantemente:
Código: [Seleccionar]
#include <16F877.h>
#FUSES XT,NOPROTECT,PUT,BROWNOUT,NOLVP,NOWDT,NOWRT,NODEBUG
#USE DELAY(CLOCK=4000000)
#USE RS232(baud=19200, xmit=PIN_C6, rcv=PIN_C7)

#byte PORTB=0x06 //Pic 16f877a
#byte TRISB=0x86 //


/** FUNCIONES GLOBALES ********/
int ConsultaTecla(void);

/** VARIABLES *****************/
int button,aux;
int const Teclas[4][4] ={{1,2,3,4},
{5,6,7,8},
                        {9,10,11,12},
                        {13,14,15,16}};



/** INTERRUPCIONES ******************************************************************************************/
#int_RB
void RB_isr(void) //función de interrupción
{
disable_interrupts(INT_RB);
disable_interrupts(GLOBAL);

button=ConsultaTecla();     
printf("Int Button: \%02u\n",button);

                enable_interrupts(INT_RB);
enable_interrupts(GLOBAL);
}



//Función que devuelve el código [int] de cada tecla
int ConsultaTecla()
{
int tecla=0;
int f,c,t,i,j;


set_tris_b(0x0F); // RB7-RB4 salidas, RB3-RB0 entradas

for(f=0x10, i=0; i<4; f<<=1, i++)
{
for(c=0x01, j=0; j<4; c<<=1, j++)
{
PORTB = ~f;
delay_cycles(1);
t = PORTB & 0x0F;
t = ~(t | 0xF0);
if(t == c)
{
delay_ms(20);
tecla=Teclas[i][j];
while(t==c)
{
t = PORTB & 0x0F;
t = ~(t | 0xF0);
}
break;
  }
}
if(tecla)
break;
}

set_tris_b(0xF0);

return tecla;
}



void main()
{

printf("Inicio Main 0\n");

enable_interrupts(INT_RB);
enable_interrupts(GLOBAL);

set_tris_b(0xF0);
 
port_b_pullups(true);

printf("Inicio bucle\n");

while(true)
{

delay_ms(1000);

}
}

Salu2!

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Problema con teclado e Interrupcion RB en CCS y 16F877
« Respuesta #5 en: 11 de Noviembre de 2010, 16:23:44 »
A ver...

  En el programa principal primero tenés que setear los tris y luego habilitar las interrupciones.
  En la rutina de atención a la interrupción creo que no es necesario deshabilitarlas y luego volver a habilitarlas, si mal no recuerdo de ello ya se encarga el compilador por el hecho de que precediste la función con "#INT_RB". Sí tenés que borrar el flag que indica que hubo interrupción. Usar "Printf" dentro de la propia interrupción no es recomendable.

  Yo haría algo asi....


Código: C
  1. rutina de interrupción de RB4..RB7
  2. {
  3.   testear si hay tecla presionada, o se activó la interrupción por una tecla soltada
  4.   si es por tecla presionada activar una variable (tiene que estar declarada golbalmente) usada como flag
  5.   borrar el flag de la interrupción de RB.
  6.  
  7. // si es por tecla presionada, sabemos que algunos de los bits del nibble alto va a tener que estar en 0 (si es que susás R de pullups). En cambio si usás R de pull down (dichos bits van a estar normalmente en 0 pero cuando presiones una tecla alguno de dichos bits va a estar en 1)
  8. }
  9.  
  10.  
  11. rutina de consulta del teclado
  12. {
  13.   hacer todas las cosas necesarias.
  14.  
  15. }
  16.  
  17. main
  18. {
  19.   setear el tris
  20.   activar las interrupciones
  21.  
  22.   while (1)
  23.   {
  24.     if (variable usada como flag == 1)  // indica que se presionó una tecla.
  25.     {
  26.       deshabilitar interrupciones RB
  27.       espera de unos 10ms //para que funcione como antirrebote
  28.       testear el puerto B para saber si sigue presionada una tecla
  29.       si sigue presionada
  30.       {
  31.          leo el teclado //llamando a tu rutina "consulta"
  32.  
  33.          printf (o todo lo que quieras hacer con la tecla)
  34.       }
  35.       leer el puerto B para eliminar cualquier condición de mismatch (o sea, para que no haya diferencias y así evitar que se
  36.                                                                                                   active el flag de interrupción RB)
  37.       borrar el flag de interrupción RB
  38.       activar las interrupciones
  39.     }
  40.   }
  41. }
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado firepic

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1130
    • JC Servicios
Re: Problema con teclado e Interrupcion RB en CCS y 16F877
« Respuesta #6 en: 12 de Noviembre de 2010, 14:53:02 »
Qué tal!

Bueno me he interesado en este programita porque tengo en mente un proyecto en el cual también tendré que usar un tecladito jeje  :D
Tengo este código, lo he probado en proteus y hasta ahora funciona bien la interrupción y logro identificar qué columna del teclado se ha presionado, lo que falta es identificar la fila...

Código: C
  1. ///////////////////////////////////////////////
  2. //             lee un teclado 4x4                //
  3. //   y envia al pc por puerto serial         //
  4. ///////////////////////////////////////////////
  5.  
  6. #include <16f876.h>
  7. #fuses HS,NOWDT,NOPROTECT,NOLVP,PUT,NOBROWNOUT
  8. #define Tx PIN_C6
  9. #define Rx PIN_C7
  10. #use delay (CLOCK=20000000)
  11. #use rs232 (BAUD=19200,XMIT=Tx,RCV=Rx)
  12. #use fast_io(B)
  13. #byte port_b = 0x06
  14. boolean flag;
  15. int fila,columna;
  16.  
  17. #INT_RB
  18. void tecla_presionada()
  19. {
  20.         int i,puerto_1;
  21.         disable_interrupts(INT_RB);                                                             //deshabilita las interrupciones
  22.         puerto_1 = port_b & 0b11110000;                                                 //lee portb4:7 y lo guarda en puerto_1
  23.         if(puerto_1!=0)                                                                                 //si se presionó una tecla (flanco hacia arriba)
  24.         {
  25.                 for(i=4;i<=7;i++) if(bit_test(puerto_1,i))columna=i-4;                 //para saber qué columna se presionó
  26.                 //Aquí falta código para saber qué fila se ha presionado.                   
  27.         }
  28.         flag=1;
  29.         set_tris_b(0xf0);
  30.         output_b(0x0f);
  31.         clear_interrupt(INT_RB);
  32.         enable_interrupts(INT_RB);
  33. }
  34.  
  35. main()
  36. {
  37.         output_b(0x0f);
  38.         set_tris_b(0xf0);
  39.         enable_interrupts(INT_RB);
  40.         enable_interrupts(GLOBAL);
  41.         while(TRUE)
  42.         {
  43.                 if(flag==1)
  44.                 {
  45.                         printf("Columna: %i\n\r",columna);
  46.                         printf("Fila: %i\n\r",fila);
  47.                         flag=0;
  48.                 }
  49.         }
  50. }

Te dejo la simulación en proteus...
Si logras hacer lo que falta por favor no dejes de publicarlo eh!

Un cordial saludo! Nos leemos!  :mrgreen:
« Última modificación: 12 de Noviembre de 2010, 15:04:45 por firepic »
"Por la presunción solo se ocasiona una lucha, pero con los que consultan juntos hay sabiduría" (Proverbios 13:10).
Visita Mi Sitio Web

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Problema con teclado e Interrupcion RB en CCS y 16F877
« Respuesta #7 en: 12 de Noviembre de 2010, 14:57:10 »
Para saber la fila, dentro de tu rutina de lectura de teclas, tenés que ir activando una a una y leyendo a su vez. Osea...

Pongo a 1 una única fila y leeo el puerto, si en alguna entrada sigue habiendo un 1 es porque a esa fila pertenece la tecla presionada, sino voy a leer 0. Entonces pongo a 1 la siguiente fila y vuelvo a leer y así sucesivamente
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado firepic

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1130
    • JC Servicios
Re: Problema con teclado e Interrupcion RB en CCS y 16F877
« Respuesta #8 en: 12 de Noviembre de 2010, 15:07:29 »
Para saber la fila, dentro de tu rutina de lectura de teclas, tenés que ir activando una a una y leyendo a su vez. Osea...

Pongo a 1 una única fila y leeo el puerto, si en alguna entrada sigue habiendo un 1 es porque a esa fila pertenece la tecla presionada, sino voy a leer 0. Entonces pongo a 1 la siguiente fila y vuelvo a leer y así sucesivamente

Correcto AngelGris, esa es la teoría y debería funcionar... pero en la práctica aún no me ha funcionado   :shock:  :?
Debe ser porque no he almorzado y ya no razono del hambre...  :D

En un rato vuelvo a darle a ver si termino eso...
Gracias y saludos! Nos leemos!  :mrgreen:
"Por la presunción solo se ocasiona una lucha, pero con los que consultan juntos hay sabiduría" (Proverbios 13:10).
Visita Mi Sitio Web

Desconectado firepic

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1130
    • JC Servicios
Re: Problema con teclado e Interrupcion RB en CCS y 16F877
« Respuesta #9 en: 12 de Noviembre de 2010, 18:37:20 »
Bueno esto es lo que tengo hasta ahora, pero la parte de leer la fila no funciona, hice la lógica tal como me dijo AngelGris y la he revisado y no encuentro la falla...  :5]
Posiblemente estoy cometiendo una gran burrada... pero creo que será todo por hoy, luego seguiré revisando...

Lo positivo es que sí funciona la parte de interrupción en RB y la detección de la columna... ese es mi consuelo  :lol:

Dejo el código:
Código: C
  1. ///////////////////////////////////////////////
  2. //             lee un teclado 4x4                //
  3. //   y envia al pc por puerto serial         //
  4. ///////////////////////////////////////////////
  5.  
  6. #include <16f876.h>
  7. #fuses HS,NOWDT,NOPROTECT,NOLVP,PUT,NOBROWNOUT
  8. #define Tx PIN_C6
  9. #define Rx PIN_C7
  10. #use delay (CLOCK=20000000)
  11. #use rs232 (BAUD=19200,XMIT=Tx,RCV=Rx)
  12. #use fast_io(A)
  13. #use fast_io(B)
  14. #byte port_b = 0x06
  15. #byte tris_b = 0xff
  16. boolean flag;
  17. int fila,columna;
  18.  
  19. #INT_RB
  20. void tecla_presionada()
  21. {
  22.         int i,puerto_1,puerto_2;
  23.         disable_interrupts(INT_RB);                                                             //deshabilita las interrupciones
  24.         puerto_1 = port_b & 0b11110000;                                                 //lee portb4:7 y lo guarda en puerto_1
  25.         if(puerto_1!=0)                                                                                 //si se presionó una tecla (flanco hacia arriba)
  26.         {
  27.                 output_b(0x00);                                                                         //aclaro el puerto b
  28.                 for(i=0;i<=3;i++)                                                                       //ciclo para saber cuál fila se presionó
  29.                 {
  30.                         bit_set(port_b,i);                                                              //pongo un pin de portb0:3 en 1
  31.                         puerto_2 = port_b & 0b11110000;                                 //leo los pines 4:7 de portb
  32.                         if(puerto_2!=0)fila=i;                                                  //si alguno esta en 1 es porque ese pin corresponde a la fila
  33.                 }
  34.                 for(i=4;i<=7;i++) if(bit_test(puerto_1,i))columna=i-4;  //para saber qué columna se presionó
  35.         }
  36.         flag=1;
  37.         set_tris_b(0xf0);
  38.         output_b(0x0f);
  39.         clear_interrupt(INT_RB);
  40.         enable_interrupts(INT_RB);
  41. }
  42.  
  43. void main()
  44. {
  45.         output_a(0x00);
  46.         output_b(0x0f);
  47.         set_tris_b(0xf0);
  48.         enable_interrupts(INT_RB);
  49.         enable_interrupts(GLOBAL);
  50.         while(TRUE)
  51.         {
  52.                 if(flag==1)
  53.                 {
  54.                         printf("Columna: %i\n\r",columna);
  55.                         printf("Fila: %i\n\r",fila);
  56.                         flag=0;
  57.                 }
  58.         }
  59. }


El archivo de proteus donde están las conexiones está en el otro post...
Nos leemos!  :mrgreen:

"Por la presunción solo se ocasiona una lucha, pero con los que consultan juntos hay sabiduría" (Proverbios 13:10).
Visita Mi Sitio Web

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Problema con teclado e Interrupcion RB en CCS y 16F877
« Respuesta #10 en: 12 de Noviembre de 2010, 22:01:49 »
Acá te dejo un programa hecho en Hitech pero con algunos "trucos" para que se parezca a CCS. Hay que acomodar varias cosas y otras no. El Código es muy básico y muy malo, funciona pero es muy mejorable. Sólo que preferí dejarlo así para que sea más fácil su entendimiento

Código: C
  1. #include <htc.h>
  2.  
  3. __CONFIG (LVPDIS & WDTDIS);
  4.  
  5. #include "Def16f87xa.h"                 // algunas definiciones propias para esta familia de PICs
  6. #define PIC_CLK 20000000                // defino la velocidad de trabajo
  7. #include "delayhd.h"                    // rutinas de retardo
  8.  
  9. #define set_tris_b(x)   TRISB=x
  10. #define output_b(x)             PORTB=x
  11. #define set_tris_a(x)   TRISA=x
  12. #define output_a(x)             PORTA=x
  13.  
  14. /************************************************************************************************
  15. Todos esos include y define son para poder trabajar con el pic, estoy usando el compilador HiTech
  16. pero tratando de dejar el codigo lo mas parecido posible a CCS
  17.  
  18. Hay que adaptar la cabecera y parte del programa para que trabaje correctamente con CCS
  19.  
  20. Tambien la linea __CONFIG (xxxx) hay que cambiarla por el tipo soportado por CCS
  21. **************************************************************************************************/
  22.  
  23.  
  24.  
  25. unsigned char flag_teclado = 0; // variable para saber si se presiono una tecla
  26.  
  27.  
  28. /*****************************************
  29.   Rutina de delay de aproximadamente 10mS
  30. para usar como anti-rebote
  31. ******************************************/
  32. void AntiRebote (void)
  33. {
  34.   unsigned char tiempo;
  35.  
  36.   for (tiempo = 40; tiempo > 0; tiempo--)
  37.   {
  38.     DelayUs (250);
  39.   }
  40. }
  41.  
  42. /****************************************************************
  43.  Esta es la rutina de atencion de interrupcion que permite Hitech
  44. hay que cambiarla y adaptarla al formato de CCS
  45. ******************************************************************/
  46. void interrupt isr (void)
  47. {
  48.   unsigned char temporal;
  49.  
  50.   temporal = PORTB & 0xF0;
  51.   if (temporal != 0) flag_teclado = 1;  // si hay tecla pulsada activo el flag
  52.  
  53.   temporal = PORTB;             // leo el puerto B para que ya no exista condicion de cambio
  54.   RBIF = 0;                             // borro el flag de cambio de RB. (Adaptar a CCS)
  55.  
  56. /*
  57.   No deshabilito ni vuelvo a habilitar las interrupciones por que
  58. de ello ya se encarga el compilador. Adaptar a CCS si es necesario
  59. */
  60.  
  61. }
  62.  
  63. /************************************************
  64.  Esta es la rutina que devuelve la tecla pulsada
  65. Los valores devueltos van de 1 a 16
  66. *************************************************/
  67. unsigned char captura(void)
  68. {
  69.   unsigned char lectura;
  70.  
  71.   output_b (0b00000001);                // activo la primer fila
  72.   lectura = PORTB & 0xF0;               // leo el puerto B y hago una and porque solo me interesa el nibble alto
  73.   output_b (0x0F);                              // activo todas las salidas
  74.   if (lectura == 0b00010000) return 1;
  75.   if (lectura == 0b00100000) return 2;
  76.   if (lectura == 0b01000000) return 3;
  77.   if (lectura == 0b10000000) return 4;
  78.   output_b (0b00000010);                // activo la segunda fila
  79.   lectura = PORTB & 0xF0;               // leo el puerto B y hago una and porque solo me interesa el nibble alto
  80.   output_b (0x0F);                              // activo todas las salidas
  81.   if (lectura == 0b00010000) return 5;
  82.   if (lectura == 0b00100000) return 6;
  83.   if (lectura == 0b01000000) return 7;
  84.   if (lectura == 0b10000000) return 8;
  85.  
  86.   output_b (0b00000100);                // activo la tercer fila
  87.   lectura = PORTB & 0xF0;               // leo el puerto B y hago una and porque solo me interesa el nibble alto
  88.   output_b (0x0F);                              // activo todas las salidas
  89.   if (lectura == 0b00010000) return 9;
  90.   if (lectura == 0b00100000) return 10;
  91.   if (lectura == 0b01000000) return 11;
  92.   if (lectura == 0b10000000) return 12;
  93.   output_b (0b00001000);                // activo la cuarta fila
  94.   lectura = PORTB & 0xF0;               // leo el puerto B y hago una and porque solo me interesa el nibble alto
  95.   output_b (0x0F);                              // activo todas las salidas
  96.   if (lectura == 0b00010000) return 13;
  97.   if (lectura == 0b00100000) return 14;
  98.   if (lectura == 0b01000000) return 15;
  99.   if (lectura == 0b10000000) return 16;
  100.  
  101.   return 0;
  102. }
  103.  
  104.  
  105. void main (void)
  106. {
  107.   unsigned char lectura_temporal;
  108.   unsigned char tecla_pulsada;
  109.  
  110.  
  111.   setup_adc (ADC_OFF);
  112.   setup_comparator (NC_NC_NC_NC);
  113.   set_tris_a (0);                                       // Puerto A como salida
  114.   output_a (0);                                         // todo en 0
  115.   set_tris_b (0b11110000);                      // Nibble alto como entrada, nibble bajo como salida
  116.   output_b (0x0F);                                      // Todas las salidas en 1
  117.  
  118.   RBIF = 0;                                                     // borro el flag que indica cambio en RB4..RB7
  119.  
  120. /*
  121.  Creo que en CCS se usa clear_interrupt (INT_RB)
  122. */
  123.  
  124.   enable_interrupt (INT_RB);            // habilito interrupcion por cambio
  125.   enable_interrupt (GLOBAL);            // habilito todas las interrupciones
  126.   while (1)
  127.   {
  128.     if (flag_teclado == 1)                      // si se presiono alguna tecla...
  129.     {
  130.       disable_interrupt (INT_RB);
  131.       AntiRebote();                                     // Aca se podria usar alguna funcion de delay de CCS
  132.       if (PORTB != 0)                           // si sigue presionada alguna tecla....
  133.       {
  134.         tecla_pulsada = captura();      // guardo en una variable la tecla pulsada
  135.         output_a (tecla_pulsada);       // la muestro en formato binario por el puerto A
  136.       }
  137.       flag_teclado = 0;                         // borro para avisar que ya procese la tecla
  138.       lectura_temporal = PORTB;         // leo el puerto B para que ya no exista condicion de cambio
  139.       RBIF = 0;                                         // borro el flag de cambio;
  140.       enable_interrupt (INT_RB);
  141.     }
  142.   }
  143. }
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado firepic

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1130
    • JC Servicios
Re: Problema con teclado e Interrupcion RB en CCS y 16F877
« Respuesta #11 en: 12 de Noviembre de 2010, 22:10:19 »
Gracias por el código AngelGris, está muy ordenado y sencillo, me gusta!  :-/
Ahora bien, podrías colocar el diagrama del circuito que usas para ese código por favor?
De antemano muy agradecido! Saludos!  :mrgreen:
"Por la presunción solo se ocasiona una lucha, pero con los que consultan juntos hay sabiduría" (Proverbios 13:10).
Visita Mi Sitio Web

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Problema con teclado e Interrupcion RB en CCS y 16F877
« Respuesta #12 en: 12 de Noviembre de 2010, 23:52:41 »
Usé el diagrama que vos subiste. Y el teclado lo tomé de la siguiente manera

  1    2   3    4
  5    6   7    8
  9  10  11  12
13  14  15  16
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado firepic

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1130
    • JC Servicios
Re: Problema con teclado e Interrupcion RB en CCS y 16F877
« Respuesta #13 en: 15 de Noviembre de 2010, 10:54:41 »
Perfecto AngelGris, muchas gracias!
Dios mediante mañana me pongo a probar el código que me mandaste.
Que estés bien! Nos leemos!  :mrgreen:
"Por la presunción solo se ocasiona una lucha, pero con los que consultan juntos hay sabiduría" (Proverbios 13:10).
Visita Mi Sitio Web

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Problema con teclado e Interrupcion RB en CCS y 16F877
« Respuesta #14 en: 15 de Noviembre de 2010, 13:58:17 »
 :-/ :-/

Que bueno leerte de nuevo Fire!!!!

 :-/ :-/
El papel lo aguanta todo