Saludos a todos, el problema que tengo es que quiero actualizar un dato cada vez que haya una interrupción en una posición que no esta escrita(por ejemplo tengo un mensaje que termina en x=5, y=2 y estoy actualizando solamente la posición x=7, y=2), es decir libre, pero cuando entra a la interrupción borra el mensaje que pueda haber tenido anteriormente en el lcd, y solo queda el que se actualiza en la interrupción. No se si tengo que guardar alguna data al entrar a la interrupción (con save en la declaración de la interrupción, aunque supuestamente la memoria del controlador del lcd es independiente) o si ese es un comportamiento normal por defecto y por tanto tengo que escribir nuevamente todo + además el dato que estoy actualizando. Esto obviamente se soluciona reescribiendo todo en cada interrupción, pero mi duda va mas orientada al comportamiento del lcd o de las librerias del c18 para ellas.
PD:En proteus lo simulé correctamente, al pasarlo a la tarjeta de desarrollo es que se presenta el problema.
Agradecería mucho sus opiniones y experencias al respecto.
Adjunto de igual forma mi código para que puedan verlo.
#include <p18f4550.h>
#include <xlcd.h>
#include <config.h>
#include <delays.h>
#include <stdio.h>
#include <timers.h>
int a=0;
char string[4];
void isr_timer0(void);
void gotoxyXLCD(unsigned char x, unsigned char y);
#pragma code high_vector = 0x08
void high_vector()
{
_asm
goto isr_timer0
_endasm
}
#pragma code
#pragma interrupt isr_timer0
void isr_timer0()
{
a++;
itoa(a,string);
gotoxyXLCD(10,2);
putsXLCD(string);
WriteTimer0(3000);
INTCONbits.TMR0IF=0;
}
void DelayFor18TCY(void){
Delay10TCYx(10);
}
void DelayPORXLCD(void){
Delay1KTCYx(76);
}
void DelayXLCD(void){
Delay1KTCYx(26);
}
void comandXLCD(unsigned char a){
BusyXLCD();
WriteCmdXLCD(a);
}
void gotoxyXLCD(unsigned char x, unsigned char y){
unsigned char direccion;
if(y != 1)
direccion = 0x40;
else
direccion=0;
direccion += x-1;
SetDDRamAddr(direccion);
}
void main(void){
OpenTimer0(TIMER_INT_ON&T0_16BIT&T0_SOURCE_INT&T0_EDGE_FALL&T0_PS_1_128);
RCONbits.IPEN=0;
OpenXLCD(FOUR_BIT & LINES_5X7);
comandXLCD(SHIFT_DISP_LEFT);
comandXLCD(DON);
comandXLCD(CURSOR_OFF);
gotoxyXLCD(5,1);
putrsXLCD("Prueba LCD");
gotoxyXLCD(3,2);
putrsXLCD("p18f");
WriteTimer0(3000);
INTCONbits.GIE=1;
INTCONbits.PEIE=1;
while(1){
}
}