TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: MSANTHIAGO en 25 de Mayo de 2017, 15:41:32
-
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:
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);
}
-
Te falta código. ¿dónde está el código de la interrupción? ¿no será que salta la interrupción y no "la manejas" o no borras el flag y no para de saltar?
Saludos.
-
void interrupt(){
// Interrupcion por cambio de estado en RB
if (INTCON.F0 == 1){
// Codigo para RB4
if (PORTB.F4 == 0){
while(PORTB.F4==0);
inter = 1;
RBIF_bit = 0;
}
// Codigo para RB5
if (PORTB.F5 == 0){
while(PORTB.F5==0);
inter = 0;
RBIF_bit = 0;
}
}
}
ese es el codigo de interrupcion.
Acabo de conectar todos los pines de RB en alto para que solo me activen rb4 y rb5. pero sigo con el mismo problema
-
Tienes un debugger para comprobar si el código pasa de la inicialización del LCD? o puedes poner un led para depurar?
-
Bien he puesto un led en RD0 y no enciende.
este codigo lo puse y no encendio el led, pero si lo hace cuando GIE_bit =0
GIE_bit=1;
RBPU_bit=1;
RBIE_bit=1;
// Deshabilitar comparadores para utilizar puerto D en LCD
CMCON=0b111;
Lcd_Init();
lcd_out(1,1, "hola");
PORTD.F0=1;
-
Logre solucionarlo agregando estas lineas. Gracias por la ayuda.
Muchas gracias ya logre solucionarlo. Agregue estas lineas
TRISB=0xF0;
TRISD.F0=0;
TRISD.F1=0;
TRISE=0;
PORTB=0;
-
Alegría entonces :mrgreen: