Autor Tema: como se calcula los delays em ccs para usar cristal de 4mhz  (Leído 2159 veces)

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

Desconectado nordestenica

  • PIC16
  • ***
  • Mensajes: 215
como se calcula los delays em ccs para usar cristal de 4mhz
« en: 30 de Mayo de 2005, 06:17:00 »
pues esso tengo este driver si lo uso em la ralidade la lcd arranca e se queda parpadeando si lo pruebo em el proteus solo me funciona si le quito #fuses hs,NOLVP el problema es  como calculo los delays para um cristal de 4mhz ya que si no pondo los fuses se supone que estaria trabajando a unos 250khz no


#include <16F628.H>
#fuses hs,NOLVP
#use standard_io ( A )
#use standard_io ( B )
#use delay ( clock = 4000000 )

#define LCD_D4          PIN_B4
#define LCD_D5          PIN_B5
#define LCD_D6          PIN_B6
#define LCD_D7          PIN_B7
#define LCD_EN          PIN_B1
#define LCD_RS          PIN_B2

// misc display defines
#define LINE_1          0x00
#define LINE_2          0x40
#define CLEAR_DISP      0x01

// prototype statements
#separate void LCD_Init ( void );
#separate void LCD_SetPosition ( unsigned int cX );
#separate void LCD_PutChar ( unsigned int cX );
#separate void LCD_PutCmd ( unsigned int cX );
#separate void LCD_PulseEnable ( void );
#separate void LCD_SetData ( unsigned int cX );

// whatever pins you assign to the display
// MUST be in a bus that is a CCS type "standard_io".
#use standard_io ( A )
#use standard_io ( B )


// code start here
void main ( void )
    {
    char cX;

    cX = 1;                                           // set number
    LCD_Init();
                                          // set up LCD for 4-wire bus, etc.
    LCD_PutCmd ( CLEAR_DISP );                        // clear screen
    LCD_SetPosition ( LINE_1 + 0 );                   // set line and offset on line
    printf ( LCD_PutChar, "Test #%u", cX );           // display message
    LCD_SetPosition ( LINE_2 + 5 );                   // set line and offset on line
    printf ( LCD_PutChar, "2nd test" );               // display message

    while ( 1 );                                      // stop
    }

/* SIX LCD-SPECIFIC FUNCTIONS ARE BELOW============================== */

#separate void LCD_Init ( void )
    {
    LCD_SetData ( 0x00 );
    delay_ms ( 200 );       /* wait enough time after Vdd rise */
    output_low ( LCD_RS );
    LCD_SetData ( 0x03 );   /* init with specific nibbles to start 4-bit mode */
    LCD_PulseEnable();
    LCD_PulseEnable();
    LCD_PulseEnable();
    LCD_SetData ( 0x02 );   /* set 4-bit interface */
    LCD_PulseEnable();      /* send dual nibbles hereafter, MSN first */
    LCD_PutCmd ( 0x2C );    /* function set (all lines, 5x7 characters) */
    LCD_PutCmd ( 0x0C );    /* display ON, cursor off, no blink */
    LCD_PutCmd ( 0x01 );    /* clear display */
    LCD_PutCmd ( 0x06 );    /* entry mode set, increment & scroll left */
    }

#separate void LCD_SetPosition ( unsigned int cX )
    {
    /* this subroutine works specifically for 4-bit Port A */
    LCD_SetData ( swap ( cX ) | 0x08 );
    LCD_PulseEnable();
    LCD_SetData ( swap ( cX ) );
    LCD_PulseEnable();
    }

#separate void LCD_PutChar ( unsigned int cX )
    {
    /* this subroutine works specifically for 4-bit Port A */

        {
        output_high ( LCD_RS );
        LCD_SetData ( swap ( cX ) );     /* send high nibble */
        LCD_PulseEnable();
        LCD_SetData ( swap ( cX ) );     /* send low nibble */
        LCD_PulseEnable();
        output_low ( LCD_RS );
        }
    }

#separate void LCD_PutCmd ( unsigned int cX )
    {
    /* this subroutine works specifically for 4-bit Port A */
    LCD_SetData ( swap ( cX ) );     /* send high nibble */
    LCD_PulseEnable();
    LCD_SetData ( swap ( cX ) );     /* send low nibble */
    LCD_PulseEnable();
    }

#separate void LCD_PulseEnable ( void )
    {
    output_high ( LCD_EN );
    delay_us ( 3 );         // was 10
    output_low ( LCD_EN );
    delay_ms ( 3 );         // was 5
    }

#separate void LCD_SetData ( unsigned int cX )
    {
    output_bit ( LCD_D4, cX & 0x01 );
    output_bit ( LCD_D5, cX & 0x02 );
    output_bit ( LCD_D6, cX & 0x04 );
    output_bit ( LCD_D7, cX & 0x08 );
    }


Desconectado omix

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 244
RE: como se calcula los delays em ccs para usar cristal de 4mhz
« Respuesta #1 en: 30 de Mayo de 2005, 07:24:00 »
Hola, el CCS calcula los delays si no recuerdo mal en función de los Hz que le pongas en clausula #use delay (clock = 4000000), que en este caso lo haria para 4Mhz. Otra cosa que puede que te influya en el funcionamiento del programa sea que si estas usando un cristal de 4MHz, quiza debas usar el fuse XT en vez del HS y tambien según el código que has puesto tienes activo el WatchDog, con lo cual sino reseteas el WatchDog cada x tiempo, el micro se te reseteara continuamente, prueba a deshabilitarlo con el fuse NOWDT.

Un saludo.

Desconectado nordestenica

  • PIC16
  • ***
  • Mensajes: 215
RE: como se calcula los delays em ccs para usar cristal de 4mhz
« Respuesta #2 en: 30 de Mayo de 2005, 08:08:00 »
gracias amigo omix ya funciona com solo poner el NOWDT  


 

anything