Autor Tema: ayuda con LCD y dsPIC  (Leído 3123 veces)

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

Desconectado hector90210

  • PIC10
  • *
  • Mensajes: 20
ayuda con LCD y dsPIC
« en: 04 de Julio de 2010, 21:10:56 »
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--;
      }
   }




Desconectado hector90210

  • PIC10
  • *
  • Mensajes: 20
Re: ayuda con LCD y dsPIC
« Respuesta #1 en: 05 de Julio de 2010, 12:31:26 »
hola a todos, les cuento que despues de quedarme hasta las 2 de la madrugada peleando con el LCD, porfin logre sacar el mensaje; me disculpan si mi codigo no es muy compacto pero como apenas estoy empezando con el C lo hago de la forma mas entendible para mi. El problema esta en el numero de desplazamientos que hacia para sacar el dato por el puerto, ahora mi problema es otro.  el programa funciona solo con xt o frc pero no con pll. ¿alguien puede decirme que puede estar pasando?.