Intcon causa problemas a lcd

Hola a todos. Espero que me puedan ayudar con este problema.
Quiero implementar el uso de interrupciones RBIE, pero sucede que cuando activo el bit GIE del registro INTCON, la lcd no muestra el mensaje.

Estoy usando un PIC18F458 y el compilador de mikroC.
Lo he probado en proteus y funciona pero en la práctica sólo muestra el mensaje si GIE = 0.

Este es el código que estoy usando:
PHP:
sbit LCD_RS at RD2_bit;
sbit LCD_EN at RD3_bit;
sbit LCD_D4 at RD4_bit;
sbit LCD_D5 at RD5_bit;
sbit LCD_D6 at RD6_bit;
sbit LCD_D7 at RD7_bit;
sbit LCD_RS_Direction at TRISD2_bit;
sbit LCD_EN_Direction at TRISD3_bit;
sbit LCD_D4_Direction at TRISD4_bit;
sbit LCD_D5_Direction at TRISD5_bit;
sbit LCD_D6_Direction at TRISD6_bit;
sbit LCD_D7_Direction at TRISD7_bit;

void main( void ){

// Declaradion de E/S puertos
   TRISB=0xFF;


// Configuracion de interrupciones ***************

   GIE_bit=1;
   RBPU_bit=1;         
   RBIE_bit=1;

// Deshabilitar comparadores para utilizar puerto D en LCD
   CMCON=0b111;


// Inicializar funciones
   Lcd_Init();
   lcd_out(1,1, "hola");

     while(1);
     

}
 
Última edición por un moderador:
No debería pasar porque tienes la pantalla conectada al puerto D.
Prueba deshabilitando las interrupciones antes de escribir en la pantalla.

Por ejemplo:
GIE_bit = 0;
lcd_out (1, 1, "Hola Mundo");
GIE_bit = 1;
 
Acabo de probar lo que me dices y el msj se muestra como si estuviera parpadeando y a los 3 seg se borra todo. No se si tiene que ver con los comparadores del puertoD. Al principio no mostraba msj la lcd porque estaban habilitados por eso coloco CMCON=0b111 y corregido ese detalle. Pero ahora el activar GIE_bit = 1 no me deja mostrar el msj.
 
Acabo de probar lo que me dices y el mensaje se muestra como si estuviera parpadeando y a los 3 segundos se borra todo.
Seguramente es porque estás ejecutando lcd_init(); constantemente.
No sé si tiene que ver con los comparadores del puerto D.
Al principio no mostraba mensaje la lcd porque estaban habilitados, por eso coloco CMCON=0b111 y corregido ese detalle.
Pero ahora al activar GIE_bit = 1 no me deja mostrar el mensaje.
Entonces entras en una contradicción, ya que primero mencionas que haciendo lo que te dije, si se mostraba el mensaje.

Por lógica, si desactivando las interrupciones se muestra el mensaje, siempre debes desactivarlas al escribir en la pantalla y reactivarlas después de la escritura.

Resulta algo incómodo hacer eso, pero a mi también me ha sucedido.
 
GIE_bit=0;
RBPU_bit=1;
RBIE_bit=1;

// Deshabilitar comparadores para utilizar puerto D en LCD
CMCON=0b111;


// Inicializar funciones
Lcd_Init();
lcd_out(1,1, "hola");
GIE_bit = 1;

while(1);


}

Ese es el codigo que estoy usando. Asi tal cual imprime hola en la lcd, pero como en 3 segundos desaparece. Durante ese tiempo, pareciera parpadear. No hay nada dentro de While(1), no creo que sea el Lcd_init() que ocasione eso. De todas maneras gracias por la ayuda. Seguire buscando.
 
void interrupt(){

// Interrupcion por cambio de estado en RB
if (INTCON.F0 == 1){

// Codigo para subir de canal
if (PORTB.F4 == 0){
while(PORTB.F4==0);
inter = 1;
RBIF_bit = 0;
if (canal < 12)
canal++;
}

// Codigo para bajar de canal
if (PORTB.F5 == 0){
while(PORTB.F5==0);
inter = 0;
RBIF_bit = 0;
if (canal > 1 )
canal--;
}
}
}

esa es la rutina. estoy probando el codigo por partes y nada. Acabo de poner todos los RB en alto para descartar que alguno este en cambiando y sea que no salgo de las interrupciones pero no he tenido exito.
 
Prueba físicamente con el archivo hex adjunto.
Es el mismo programa, pero usando otro compilador. (PCWHD de CCS)
Es para descartar bugs en el compilador de mikroC.
 

Adjuntos

  • 18F458 INT RBIF & LCD.rar
    53.8 KB · Visitas: 1
Muchas gracias D@rkbytes ya logre solucionarlo. Agregue estas lineas

TRISB=0xF0;
TRISD.F0=0;
TRISD.F1=0;
TRISE=0;
PORTB=0;

Esa fue la solucion. Mas adelante cuando tenga que modificar par habilitar INT0 INT1 INT2 espero no tener problemas. Gracias por la asistencia.



me puedes ayudar a entender algo del ADC_READ().

Esta bien este codigo?

valorAdc = ADC_READ(0);
while(ADCON0)
volt = 5.0*valorAdc/1024;
chAnalogic = volt;

delay_us(4);
valorAdc = ADC_READ(1);
volt = 5.0*valorAdc/1024;
chAnalogic[i+8] = volt;

delay_us(4);
valorAdc = ADC_READ(2);
volt = 5.0*valorAdc/1024;
chAnalogic[i+16] = volt;

ese delay_us(4);
es por el tiempo de espera. es necesario o no?
tengo dudas con respecto al tiempo de espera de la conversion adc.
 
Última edición:
Pues no creo, porque debería estar debajo de ADC_Read();
No conozco bien el compilador mikroC, ya que no me gusta, y habría que ver cómo funciona ADC_READ(Channel);
(Aunque dudo mucho que se pueda ver, porque mikroC esconde ese tipo de cosas.)
Ya que posiblemente tenga la rutina de comprobación.

Pero lo que se debe hacer es esperar a que termine la conversión, comprobando el bit GO/DONE.
GO_DONE.jpg

El tiempo que tarda la conversión, depende principalmente de los bits del conversor y del tipo de PIC.
Su unidad es el TAD y en la hoja de datos puedes encontrar cual es el TAD mínimo conforme a la frecuencia y realizar el cálculo para saber cuanto tiempo tardará la conversión.
 
Atrás
Arriba