hola a todos. y de antemano muchas gracias por su ayuda
mi problema es el siguiente: estoy tratando de hacer andar un lcd compactible con el hitachi 44780 el cual funciona perfectamente con el pic 16f873 pero no logro nada con el dsPIC 30f4013. a 30 MIPS, estoy utilizando el puerto b el cual configuro como salidas digitales. he tratado acondicionando varios codigos que he encontrado pero no logro visualizar nada. me parece que manejo bien los delays. lo unico que creo es que si se logra inicializar ya que aparecen las dos lineas de cuadritos negros pero nada mas.
aqui pongo el codigo que estoy empleando el cual he modificado de varias formas sin lograr nada. cualquier sugerencia la agredezco con entusiasmo.
# include "p30f4013.h"
_FOSC(CSW_FSCM_OFF & FRC_PLL16); // CONFIGURACIÓN DEL OSCILADOR A 7.37MHz con PLL 16
_FWDT(WDT_OFF);
_FGS(CODE_PROT_OFF & GWRP_OFF); // NO PROTECCIÓN DEL CODIGO
#define E LATDbits.LATD9
#define RS LATAbits.LATA11
#define RW LATCbits.LATC14
#define BUSYFLAG PORTBbits.RB12
#define TRIS_E TRISDbits.TRISD9
#define TRIS_RS TRISAbits.TRISA11
#define TRIS_RW TRISCbits.TRISC14
#define TRIS_BUSYFLAG TRISBbits.TRISB12
#define DATO 1
#define CONTROL 0
/* funciones */
void delay(unsigned int);
void lcd_init(void);
void enviar(unsigned char);
void toggle_e(void);
/* variables */
int SALIDA;
unsigned int microsegundos;
unsigned char *p1,BYTE;
unsigned char constini[] = { 0x02,0x28,0x0c,0x06,0x00};
unsigned char mensaje1[] = "HsPIC 30F4013 ";
void main(void)
{
OSCTUN=0;
TRISB=0x0000; // Configuramos RB9-RB0 como salidas.
ADPCFG=0xFFFF;
lcd_init();
RS = DATO;
p1 = &mensaje1[0];
while(*p1 != '\0')
{
BYTE = *p1;
enviar(BYTE);
microsegundos = 100;
delay(microsegundos);
p1++;
}
void lcd_init(void)
{
PORTBbits.RB9 = 0; TRISBbits.TRISB9 = 0;
PORTBbits.RB10 = 0; TRISBbits.TRISB10 = 0;
PORTBbits.RB11 = 0; TRISBbits.TRISB11 = 0;
PORTBbits.RB12 = 0; TRISBbits.TRISB12 = 0;
RW = 0; TRIS_RW = 0;
RS = 0; TRIS_RS = 0;
E = 0; TRIS_E = 0;
microsegundos = 20000; //espera 20 milisegundos al energizar
delay(microsegundos);
RS = CONTROL; //envia 02 y espera 5 ms
SALIDA = 0x02;
SALIDA = SALIDA << 8;
LATB = SALIDA;
toggle_e();
microsegundos = 50000;
delay(microsegundos);
SALIDA = 0x02; //envia 02 y espera 100 us
SALIDA = SALIDA << 8;
LATB = SALIDA;
toggle_e();
microsegundos = 100;
delay(microsegundos);
SALIDA = 0x02;
SALIDA = SALIDA << 8;
LATB = SALIDA;
toggle_e();
p1 = &constini[0]; //envia 02,28,0c,06 con retardo de 12x256/29,48MHz=100us
while(*p1 != '\0')
{
BYTE = *p1;
enviar(BYTE);
microsegundos = 200;
delay(microsegundos);
p1++;
}
}
void enviar(unsigned char BYTE)
{
unsigned char NIBBLEALTO;
unsigned char NIBBLEBAJO;
NIBBLEALTO = BYTE & (0xF0); //envia dato en 2 nibbles por el puerto B
SALIDA = NIBBLEALTO;
SALIDA = SALIDA << 4;
LATB = SALIDA;
toggle_e();
microsegundos = 160;
delay(microsegundos);
NIBBLEBAJO = BYTE & (0x0F);
SALIDA = NIBBLEBAJO;
SALIDA = SALIDA << 8;
LATB = SALIDA;
toggle_e();
microsegundos = 160;
delay(microsegundos);
}
void toggle_e(void)
{
E = 1;
microsegundos = 1;
delay(microsegundos);
E = 0;
}
/****************************************/
/* DelayUs Microsegundos */
/****************************************/
void delay(unsigned int microsegundos) // 1us a 29.48 MIPS
{
while(microsegundos != 0)
{
asm("nop" );asm("nop" );
asm("nop" );asm("nop" );
asm("nop" );asm("nop" );
asm("nop" );asm("nop" );
asm("nop" );asm("nop" );
asm("nop" );asm("nop" );
asm("nop" );asm("nop" );
asm("nop" );asm("nop" );
asm("nop" );asm("nop" );
asm("nop" );asm("nop" );
asm("nop" );asm("nop" );
asm("nop" );asm("nop" );
asm("nop" );asm("nop" );
asm("nop" );asm("nop" );
asm("nop" );asm("nop" );
asm("nop" );asm("nop" );
microsegundos--;
}
}