Autor Tema: Problema con INT1 INT2 y LCD con 18f46k80  (Leído 1497 veces)

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

Desconectado Ranculche

  • PIC12
  • **
  • Mensajes: 74
Problema con INT1 INT2 y LCD con 18f46k80
« en: 28 de Noviembre de 2015, 17:44:38 »
Hola a todos. Escribía porque me ha surgido un problema con estas interrupciones (INT1 E INT2). Paso a contarles:

Tengo 4 botones en RB1 RB2 RB4 yRB4. Uso estos botones para controlar al pic y su LCD, los botones son básicamente:

ATRÁS   MENU   ENTER   ADELANTE

y sirven para manejar un menú. Todo venia bien, las 4 interrupciones funcionaban, hasta que le coloque el LCD(128x64). La INT0 la uso como RX de una futura uart virtual, ya que este micro tiene 2 uart y necesito 3. Lo que sucede es que cuando presiono el botón ATRAS (INT1) la interrupción INT1 se ejecuta satisfactoriamente, pero inmediatamente entra a la interrupción INT2 (aclaro que bajo la bandera al salir de cada interrupción). Si presiono cualquier otro boton todo funciona bien, el conflicto seria la INT2 (RB2) . Si retiro el LCD esto deja de suceder y funciona bien. La verdad que debo estar pasando algo por alto, pero no me doy cuenta. A continuación les dejo el programa:

Citar
#include <18f46k80.h>                    //PIC A UTILIZAR
#fuses HSH,NOWDT, NOPUT,NOPLLEN            //CRISTAL
#use delay(clock=10000000)               //A 20MHZ
#include <glcd.c>                     //INCLUIMOS GLCD.C DE PICC
#include<stdlib.h>
#include<stdio.h>

#use rs232(baud=9600,xmit=PIN_D5,rcv=PIN_B0,stream=Serie3)
#use rs232(baud=9600,xmit=PIN_D6,rcv=PIN_D7,stream=Serie2)
   
#USE FAST_IO (A)
#USE FAST_IO (D)
#USE FAST_IO (c)
#USE FAST_IO (b)

//----------------------------DEFINICION DE CONSTANTES-----------------
//---------------------------------DECLARACION DE VARIABLES-------------------------

int    Estado=E0;
char   Accion=0;
char   c=0;
char   texto1[20];
char    cambio_estado=1;

main()
{

//-----------------------------------CONFIGURACION DE INTERRUPCIONES------------------------
   DISABLE_INTERRUPTS(global);

   ENABLE_INTERRUPTS(INT_EXT);
   CLEAR_INTERRUPT(int_ext);
   EXT_INT_EDGE(0,H_TO_L);

   ENABLE_INTERRUPTS(INT_EXT1);
   EXT_INT_EDGE(1,L_TO_H);
   CLEAR_INTERRUPT(int_ext1);

   ENABLE_INTERRUPTS(INT_EXT2);
   EXT_INT_EDGE(2,L_TO_H);
   CLEAR_INTERRUPT(int_ext2);

   ENABLE_INTERRUPTS(INT_RB5);
   ENABLE_INTERRUPTS(INT_RB4);
   CLEAR_INTERRUPT(int_rb);

//-----------------------------------CONFIGURACION DE ENTREDAS/SALIDAS DIGITALES--------------------------

   SET_TRIS_A( 0x00 );      //0b
   SET_TRIS_D( 0x80 );      //0b10000000
   SET_TRIS_C( 0x00 );      //0b
   SET_TRIS_B( 0x37 );      //0b00110111

   glcd_init(ON);         // iniciamos la lcd                             
   glcd_fillScreen(OFF);    //LIMPIAMOS LA PANTALLA
   output_high(PIN_B3);

   ENABLE_INTERRUPTS(global);
   
   sprintf(texto1 "COMENZANDO...");
   glcd_text57(0,10,texto1,2, ON);
   delay_ms(3000);   

   while(1)
   {   
      delay_ms(500);
      fprintf(Serie3,"%i ",Estado);
   }
   }
}


#INT_EXT
void rx3()
{
   c=getch();
   fprintf(Serie3,"");
   CLEAR_INTERRUPT(int_ext);
}

#INT_EXT1
Bot_Atras()
{
   Accion=ATRAS;
//   cambio_estado=1;
   Maquina_Estados();
   CLEAR_INTERRUPT(int_ext1);
}

#INT_EXT2
Bot_Menu()
{
   Accion=MENU;
//   cambio_estado=1;
   Maquina_Estados();
   CLEAR_INTERRUPT(int_ext2);
}

#INT_RB
Bot_Ent_Adelante()
{
   if(input(PIN_B4))
   {
      Accion=ENTER;
//      cambio_estado=1;
      Maquina_Estados();
      CLEAR_INTERRUPT(int_rb);
   }
   if(input(PIN_B5))
   {
      Accion=ADELANTE;
//      cambio_estado=1;
      Maquina_Estados();
      CLEAR_INTERRUPT(int_rb);
   }   
   CLEAR_INTERRUPT(int_rb);   
}
Tambien es importante mencionar, debuggueando, puedo ver el puerto PORTB en el momento que entra en las interrupciones, y RB2 no se modifica, sigue en 0 siempre.
La dispocicion de patas del LCD es la siguiente

CS1----PIN_A0
CS2----PIN_A3
DI-----PIN_C5
RW----PIN_C4
E------PIN_D3
RST---PIN_A2
D0---PIN_D2
D1---PIN_D1
D2---PIN_D0
D3---PIN_C3
D4---PIN_C2
D5---PIN_C1
D6---PIN_C0
D7---PIN_A5

En la pata RB3 esta conectada un resistencia de 1K a la base de un transistor para manejar el BackLight.

Espero que puedan ayudarme, para mi es raro lo que sucede pero tal ves hay algo que no estoy teniendo en cuenta....POR FAVOR AYUDAAAA!!

MUCHAS GRACIAS DE ANTEMANO

SALUDOS!

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Problema con INT1 INT2 y LCD con 18f46k80
« Respuesta #1 en: 28 de Noviembre de 2015, 19:49:19 »
Citar
Tengo 4 botones en RB1 RB2 RB4 yRB4.

Podrias poner un esquema de como es eso?

Tambien el codigo de:

Código: C
  1. Maquina_Estados();

Por que no se sabe que hace entonces es imposible determinar si esta ahi el problema

Una UART por software? encima en una interrupcion es lo peor que podes llegar a hacer en tu vida:

Código: C
  1. #INT_EXT
  2. void rx3()
  3. {
  4.    c=getch();
  5.    fprintf(Serie3,"");
  6.    CLEAR_INTERRUPT(int_ext);
  7. }
  8. [/quote]
  9.  
  10. Por que no directamente usar las dos UART por HW ? Tenes 2 UART por HW y estas quitandole todo el provecho usando 1 por software ( la de B0 y D5 )
  11.  
  12. [code=c]#INT_RB
  13. Bot_Ent_Adelante()
  14. {
  15.    if(input(PIN_B4))
  16.    {
  17.       Accion=ENTER;
  18. //      cambio_estado=1;
  19.       Maquina_Estados();
  20.       CLEAR_INTERRUPT(int_rb);
  21.    }
  22.    if(input(PIN_B5))
  23.    {
  24.       Accion=ADELANTE;
  25. //      cambio_estado=1;
  26.       Maquina_Estados();
  27.       CLEAR_INTERRUPT(int_rb);
  28.    }  
  29.    CLEAR_INTERRUPT(int_rb);  
  30. }
Para poder limpiar la interrupcion debes leer SI o SI el puerto B (Si es por nivel), luego limpiar el flag, no se si se aplica para CCS
Y ademas normalmente Microchip nos tiene acostumbrado a esas interrupciones por nivel y no flanco, y se debe cumplir lo de arriba para poder quitarlo, sino queda encerrado para siempre en la interrupcion.

EDIT:
Solo para decirte una cosa, Las interrupciones siempre deben ser lo mas rapido posibles y que no afecten a las demas.
« Última modificación: 28 de Noviembre de 2015, 20:17:25 por KILLERJC »

Desconectado Ranculche

  • PIC12
  • **
  • Mensajes: 74
Re:Problema con INT1 INT2 y LCD con 18f46k80
« Respuesta #2 en: 28 de Noviembre de 2015, 20:17:49 »

* Sin título.gif
(21.48 kB, 822x488 - visto 318 veces)

Hola Amigo! Gracias por contestar. El uso de la uart virtual es porque necesito 3 uart, mas arriba lo puse. solo que ahora estoy usando esa, pero ademas de esa uart, uso una para un Xbee y otra para un SIM900. En cuanto al esque ma te lo subo, per o lo que quiere que quede claro porque me llamo la atencion, es que funciona excelente sin el LCD y deja de hacerlo con el LCD. En cuanto al soft completo no lo subi por que era largo, pero ahora lo publico. Maquina_estado(), es una maquina de estados que la uso para manejar el LCD y las acciones que va a ejecutar el micro. Por ultimo, lo de la limpieza de la RB no sabia, lo voy a aplicar ahora. La maquina de estado funciona como quiero solo que no puedo probar con el LCD ya que funciona mal esa interrupt. a la uart virtual ya la probé y funciona bien. Todo tse complica cuando agrego el LCD,  el LCD tambien funciona correctamente en la misma placa. Ya me di continuidades y no encuentro ninguna anomalía. Porque lo peor es usar una uart de esa manera?

* Main.c
(11.97 kB - descargado 150 veces)




Espero tu respuesta. Gracias.
« Última modificación: 29 de Noviembre de 2015, 07:48:35 por xocas »

Desconectado Ranculche

  • PIC12
  • **
  • Mensajes: 74
Re:Problema con INT1 INT2 y LCD con 18f46k80
« Respuesta #3 en: 28 de Noviembre de 2015, 20:22:28 »
Me olvide de decir la disposicion  de los Botones
<<                      PIN_B1
MENU                  PIN_B2
ENTER                 PIN_B4
>>                      PIN_B5

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Problema con INT1 INT2 y LCD con 18f46k80
« Respuesta #4 en: 28 de Noviembre de 2015, 20:35:46 »
Ahora viendo el codigo de Maquina_de_estado() veo que no hay problema ahi. Si no es lo del RB4-7 entonces:

Solo queda la interrupcion de RB0, Usa la UART pero en el main, no en la interrupcion (Esto se va a complicar por el tema de las demoras). O usa la UART por software en algo que realmente no necesite recibir y solo transmitir, o solo recibir muy muy poco.

intenta: eliminar la interrupcion debido a la UART, y usa una UART por HW. Al menos para algo como debugeo y esas cosas. Al igual que vas a tener que habilitar la interrupciones de recepcion de esa UART. Si es que lo del RB4-7 no funciona.

Desconectado Ranculche

  • PIC12
  • **
  • Mensajes: 74
Re:Problema con INT1 INT2 y LCD con 18f46k80
« Respuesta #5 en: 03 de Diciembre de 2015, 15:39:13 »
Holaaaaaa. Gracias por las respuesta. Lo pude solucionar. Pregunto si esta en alto ese PIN y no entra mas al if. No se si es la mejor solucion pero ya probe de todo y sigue igual. Por ahora me saca del paso.

Muchas Gracias

Saludos