Autor Tema: Problema con lcd en C18  (Leído 1843 veces)

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

Desconectado sshak9

  • PIC10
  • *
  • Mensajes: 4
Problema con lcd en C18
« en: 23 de Septiembre de 2010, 04:59:57 »
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.
Código: [Seleccionar]
#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){
}
}