Autor Tema: contador lcd llega A 255 y se vuelve a 0 alguien que me de una mano  (Leído 19946 veces)

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

Desconectado kapotik

  • PIC16
  • ***
  • Mensajes: 121
Re: contador lcd llega A 255 y se vuelve a 0 alguien que me de una mano
« Respuesta #60 en: 08 de Abril de 2013, 21:40:55 »
Bueno, le hice unos cambios al programa para evitar el parpadeo que produce borrar toda la pantalla y le eliminé la variable B.  Le adicioné un Timer que cuenta 262 mSeg. para reemplazar la instrucción delay_ms().  Lo ensayas y me cuentas.  Puedes experimentar con la configuración del Timer para conseguir otros tiempos (leer y estudiar el uso de los Timers).

Saludos!

Chaaaa!!! muchas gracias BMB  ((:-))

solo tengo 2 preguntas:

1-en el codigo que es lo que define el sentido de giro del mensaje, que valla de izquierda a derecha o viceversa?

2-como se sabe que palabra de configuracion por ejemplo
 
Código: [Seleccionar]
printf(lcd_putc, "valor %Lu         ", B);
como saben que poniendo %Lu hace tal o cual cosa?, donde sale en el manual de CCS?

saludos y gracias por el tiempo prestado

Desconectado bmb

  • PIC18
  • ****
  • Mensajes: 423
Re: contador lcd llega A 255 y se vuelve a 0 alguien que me de una mano
« Respuesta #61 en: 09 de Abril de 2013, 09:54:45 »
Hola kapotik, en realidad el código que estás usando para hacer que se mueva el letrero hacia la derecha es bastante simple y no utiliza las funciones que te mencionó Marcos en un post anterior.  Este código solo aprovecha la función lcd_gotoxy(x,y) para mover el letrero de izquierda a derecha, pero como podrás observar, el letrero nunca comienza letra a letra desde la izquierda, sino que aparece entero y se va desvaneciendo por la derecha.  Tendrías que buscar un poco más en el foro para encontrar uno que si utilice las funciones de corrimiento de caracteres a la derecha o izquierda.

En la página 211 del manual de CCS, puedes ver el uso correcto de printf().

Saludos!

Desconectado kapotik

  • PIC16
  • ***
  • Mensajes: 121
Re: contador lcd llega A 255 y se vuelve a 0 alguien que me de una mano
« Respuesta #62 en: 09 de Abril de 2013, 10:16:34 »
Hola kapotik, en realidad el código que estás usando para hacer que se mueva el letrero hacia la derecha es bastante simple y no utiliza las funciones que te mencionó Marcos en un post anterior.  Este código solo aprovecha la función lcd_gotoxy(x,y) para mover el letrero de izquierda a derecha, pero como podrás observar, el letrero nunca comienza letra a letra desde la izquierda, sino que aparece entero y se va desvaneciendo por la derecha.  Tendrías que buscar un poco más en el foro para encontrar uno que si utilice las funciones de corrimiento de caracteres a la derecha o izquierda.

En la página 211 del manual de CCS, puedes ver el uso correcto de printf().

Saludos!

Gracias, sigo buscando e intentando!
le modifique al codigo que enves de incrementar decremente las filas, eso cambio el sentido de giro pero no se mentiene en la primera fila, cuando termina de pasar se salta a la segunda.

Código: [Seleccionar]
#include <16F628A.h>

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES XT                       //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O

#use delay(clock=4000000)

#rom 0x2100 ={0,0,0,0}

#define LCD_ENABLE_PIN  PIN_B1
#define LCD_RS_PIN      PIN_B2
#define LCD_RW_PIN      PIN_B3
#define LCD_DATA4       PIN_B4
#define LCD_DATA5       PIN_B5
#define LCD_DATA6       PIN_B6
#define LCD_DATA7       PIN_B7

#include <lcd.c>
#include <internal_eeprom.c>
   
int32 A = 0;
int1 boton = false, T_mSeg = false;

#int_TIMER1
void  TIMER1_isr(void)
{
   T_mSeg = true;
}

void main()
{
   char y=1;                        // indice columnas
   signed char x=1;                 // indice filas
   
   setup_timer_1(T1_INTERNAL|T1_DIV_BY_4);  //262 ms overflow
   enable_interrupts(INT_TIMER1);
   enable_interrupts(GLOBAL);

   lcd_init();                      // Inicia LCD
   lcd_putc("Inicializando el\n");  // Saca texto
   lcd_putc("Equipo Aguarde  ");    // Saca texto
   delay_ms(1000);                  // Retardo
   lcd_putc("\f");                  // Limpia pantalla
   

   A = read_int32_eeprom(0x00);     // Lee contador de la EEPROM
   
   while(TRUE)
   {
     
      lcd_gotoxy(x,y);              // cursor para escribir mensaje
      lcd_putc("kapotik.kapotik.kapotik.kapotik");   // muestra por pantalla el mensaje
     
      if(T_mSeg)                    // Si pasaron 262 mSeg. aprox...
      {
         x--;                       // incremento indice de filas
     
         if(x>16)                   // ¿ya se ha mostrado mensaje entero por 1ºfila?
         {
            x=-8;                   // SI -> indice fila x=-8
            x++;                    // incremento indice columnas
         }

         lcd_gotoxy(1,1);           // Borro solamente la primera línea del LCD
         lcd_putc("                ");

         T_mSeg = false;            // Desactivo la bandera
      }
   
      if(!input(pin_A0) && !boton)  // Pregunta si RA0 es cero
      {
         A++;                       // Incremento el conteo
         boton = true;
         write_int32_eeprom(0x00, A);
         delay_ms(50);
      }

      if(input(pin_A0))
         boton = false;             // Al soltar el Boton...

      if(A>=9999999)                // Preguto si A es mayor o igual a 9999999,
      {                             // cuando sea igual iguala "A" a cero
         A=0;   
      }

      lcd_gotoxy(1,2);                             // Acomoda cursor LCD
      printf(lcd_putc, "valor %Lu         ", A);   // Imprime 16 espacios en el LCD
   }

}

saludos

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: contador lcd llega A 255 y se vuelve a 0 alguien que me de una mano
« Respuesta #63 en: 09 de Abril de 2013, 10:56:05 »
Hola kapotik, en realidad el código que estás usando para hacer que se mueva el letrero hacia la derecha es bastante simple y no utiliza las funciones que te mencionó Marcos en un post anterior.  Este código solo aprovecha la función lcd_gotoxy(x,y) para mover el letrero de izquierda a derecha, pero como podrás observar, el letrero nunca comienza letra a letra desde la izquierda, sino que aparece entero y se va desvaneciendo por la derecha.  Tendrías que buscar un poco más en el foro para encontrar uno que si utilice las funciones de corrimiento de caracteres a la derecha o izquierda.

En la página 211 del manual de CCS, puedes ver el uso correcto de printf().

Saludos!
Para hacer que aparezca letra a letra desde derecha a izquierda, solo debes poner como punto de origen la posicion 16 de la linea donde quieras mostrarlo...
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado bmb

  • PIC18
  • ****
  • Mensajes: 423
Re: contador lcd llega A 255 y se vuelve a 0 alguien que me de una mano
« Respuesta #64 en: 09 de Abril de 2013, 11:25:03 »
Para hacer que aparezca letra a letra desde derecha a izquierda, solo debes poner como punto de origen la posicion 16 de la linea donde quieras mostrarlo...

Hola Marcos, haciendo lo que dices con el código que está usando kapotik, solo se va a desplazar el mensaje de derecha a izquierda hasta llegar a la columna 1, pero no se va a desvanecer el mensaje hacia la izquierda, que es más o menos el mismo problema que tiene ahora pero al revés.

Saludos!

Desconectado kapotik

  • PIC16
  • ***
  • Mensajes: 121
Re: contador lcd llega A 255 y se vuelve a 0 alguien que me de una mano
« Respuesta #65 en: 09 de Abril de 2013, 11:28:48 »
ya casi!  ya casi!!  :-/

Código: [Seleccionar]
#include <16F628A.h>

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES XT                       //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O

#use delay(clock=4000000)

#rom 0x2100 ={0,0,0,0}

#define LCD_ENABLE_PIN  PIN_B1
#define LCD_RS_PIN      PIN_B2
#define LCD_RW_PIN      PIN_B3
#define LCD_DATA4       PIN_B4
#define LCD_DATA5       PIN_B5
#define LCD_DATA6       PIN_B6
#define LCD_DATA7       PIN_B7

#include <lcd.c>
#include <internal_eeprom.c>
  
int32 A = 0;
int1 boton = false, T_mSeg = false;

#int_TIMER1
void  TIMER1_isr(void)
{
   T_mSeg = true;
}

void main()
{
   char y=1;                        // indice columnas
   signed char x=1;                 // indice filas
  
   setup_timer_1(T1_INTERNAL|T1_DIV_BY_4);  //262 ms overflow
   enable_interrupts(INT_TIMER1);
   enable_interrupts(GLOBAL);

   lcd_init();                      // Inicia LCD
   lcd_putc("Inicializando el\n");  // Saca texto
   lcd_putc("Equipo Aguarde  ");    // Saca texto
   delay_ms(1000);                  // Retardo
   lcd_putc("\f");                  // Limpia pantalla
    

   A = read_int32_eeprom(0x00);     // Lee contador de la EEPROM
  
   while(TRUE)
   {
      lcd_gotoxy(x,y);              // cursor para escribir mensaje
      lcd_putc("kapotik.kapotik.kapotik.kapotik");   // muestra por pantalla el mensaje
      
      if(T_mSeg)                    // Si pasaron 262 mSeg. aprox...
      {
         x--;                       // incremento indice de filas
      
         if(x<-9)                   // ¿ya se ha mostrado mensaje entero por 1ºfila?
         {
            x=16;                   // SI -> indice fila x=-8
            x++;                    // incremento indice columnas
         }

         lcd_gotoxy(1,1);           // Borro solamente la primera línea del LCD
         lcd_putc("                ");

         T_mSeg = false;            // Desactivo la bandera
      }
  
      if(!input(pin_A0) && !boton)  // Pregunta si RA0 es cero
      {
         A++;                       // Incremento el conteo
         boton = true;
         write_int32_eeprom(0x00, A);
         delay_ms(50);
      }

      if(input(pin_A0))
         boton = false;             // Al soltar el Boton...

      if(A>=9999999)                // Preguto si A es mayor o igual a 9999999,
      {                             // cuando sea igual iguala "A" a cero
         A=0;  
      }

      lcd_gotoxy(1,2);                             // Acomoda cursor LCD
      printf(lcd_putc, "valor %Lu         ", A);   // Imprime 16 espacios en el LCD
   }

}


tenes razon bmb  no desaparece letra a letra, si no que cuando lo muestra todo lo saca de una, sigo viendo

Desconectado bmb

  • PIC18
  • ****
  • Mensajes: 423
Re: contador lcd llega A 255 y se vuelve a 0 alguien que me de una mano
« Respuesta #66 en: 09 de Abril de 2013, 11:35:53 »
Corrección!!! Disculpa Marcos, si se puede hacer como dices!  :-/  Hola kapotik, utiliza este programa y nos cuentas:

Código: C
  1. #include <16F628A.h>
  2.  
  3. #FUSES NOWDT                    //No Watch Dog Timer
  4. #FUSES XT                       //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD
  5. #FUSES NOBROWNOUT               //No brownout reset
  6. #FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
  7.  
  8. #use delay(clock=4000000)
  9.  
  10. #rom 0x2100 ={0,0,0,0}
  11.  
  12. #define LCD_ENABLE_PIN  PIN_B1
  13. #define LCD_RS_PIN      PIN_B2
  14. #define LCD_RW_PIN      PIN_B3
  15. #define LCD_DATA4       PIN_B4
  16. #define LCD_DATA5       PIN_B5
  17. #define LCD_DATA6       PIN_B6
  18. #define LCD_DATA7       PIN_B7
  19.  
  20. #include <lcd.c>
  21. #include <internal_eeprom.c>
  22.    
  23. int32 A = 0;
  24. int1 boton = false, T_mSeg = false;
  25.  
  26. #int_TIMER1
  27. void  TIMER1_isr(void)
  28. {
  29.    T_mSeg = true;
  30. }
  31.  
  32. void main()
  33. {
  34.    char y=1;                        // indice columnas
  35.    signed char x=16;                // indice filas
  36.    
  37.    setup_timer_1(T1_INTERNAL|T1_DIV_BY_4);  //262 ms overflow
  38.    enable_interrupts(INT_TIMER1);
  39.    enable_interrupts(GLOBAL);
  40.  
  41.    lcd_init();                      // Inicia LCD
  42.    lcd_putc("Inicializando el\n");  // Saca texto
  43.    lcd_putc("Equipo Aguarde  ");    // Saca texto
  44.    delay_ms(1000);                  // Retardo
  45.    lcd_putc("\f");                  // Limpia pantalla
  46.    
  47.  
  48.    A = read_int32_eeprom(0x00);     // Lee contador de la EEPROM
  49.    
  50.    while(TRUE)
  51.    {
  52.       lcd_gotoxy(x,y);              // cursor para escribir mensaje
  53.       lcd_putc("kapotik.kapotik.kapotik.kapotik");   // muestra por pantalla el mensaje
  54.      
  55.       if(T_mSeg)                    // Si pasaron 262 mSeg. aprox...
  56.       {
  57.          x--;                       // decremento indice de filas
  58.      
  59.          if(x<-31)                    // ¿ya se ha mostrado mensaje entero por 1ºfila?
  60.          {
  61.             x=16;                    // decremento indice columnas
  62.          }
  63.  
  64.          lcd_gotoxy(1,1);           // Borro solamente la primera línea del LCD
  65.          lcd_putc("                ");
  66.  
  67.          T_mSeg = false;            // Desactivo la bandera
  68.       }
  69.    
  70.       if(!input(pin_A0) && !boton)  // Pregunta si RA0 es cero
  71.       {
  72.          A++;                       // Incremento el conteo
  73.          boton = true;
  74.          write_int32_eeprom(0x00, A);
  75.          delay_ms(50);
  76.       }
  77.  
  78.       if(input(pin_A0))
  79.          boton = false;             // Al soltar el Boton...
  80.  
  81.       if(A>=9999999)                // Preguto si A es mayor o igual a 9999999,
  82.       {                             // cuando sea igual iguala "A" a cero
  83.          A=0;  
  84.       }
  85.  
  86.       lcd_gotoxy(1,2);                             // Acomoda cursor LCD
  87.       printf(lcd_putc, "valor %Lu         ", A);   // Imprime 16 espacios en el LCD
  88.    }
  89.  
  90. }

Saludos!

Desconectado kapotik

  • PIC16
  • ***
  • Mensajes: 121
Re: contador lcd llega A 255 y se vuelve a 0 alguien que me de una mano
« Respuesta #67 en: 09 de Abril de 2013, 11:46:51 »
Corrección!!! Disculpa Marcos, si se puede hacer como dices!  :-/  Hola kapotik, utiliza este programa y nos cuentas:

Código: C
  1. #include <16F628A.h>
  2.  
  3. #FUSES NOWDT                    //No Watch Dog Timer
  4. #FUSES XT                       //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD
  5. #FUSES NOBROWNOUT               //No brownout reset
  6. #FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
  7.  
  8. #use delay(clock=4000000)
  9.  
  10. #rom 0x2100 ={0,0,0,0}
  11.  
  12. #define LCD_ENABLE_PIN  PIN_B1
  13. #define LCD_RS_PIN      PIN_B2
  14. #define LCD_RW_PIN      PIN_B3
  15. #define LCD_DATA4       PIN_B4
  16. #define LCD_DATA5       PIN_B5
  17. #define LCD_DATA6       PIN_B6
  18. #define LCD_DATA7       PIN_B7
  19.  
  20. #include <lcd.c>
  21. #include <internal_eeprom.c>
  22.    
  23. int32 A = 0;
  24. int1 boton = false, T_mSeg = false;
  25.  
  26. #int_TIMER1
  27. void  TIMER1_isr(void)
  28. {
  29.    T_mSeg = true;
  30. }
  31.  
  32. void main()
  33. {
  34.    char y=1;                        // indice columnas
  35.    signed char x=16;                // indice filas
  36.    
  37.    setup_timer_1(T1_INTERNAL|T1_DIV_BY_4);  //262 ms overflow
  38.    enable_interrupts(INT_TIMER1);
  39.    enable_interrupts(GLOBAL);
  40.  
  41.    lcd_init();                      // Inicia LCD
  42.    lcd_putc("Inicializando el\n");  // Saca texto
  43.    lcd_putc("Equipo Aguarde  ");    // Saca texto
  44.    delay_ms(1000);                  // Retardo
  45.    lcd_putc("\f");                  // Limpia pantalla
  46.    
  47.  
  48.    A = read_int32_eeprom(0x00);     // Lee contador de la EEPROM
  49.    
  50.    while(TRUE)
  51.    {
  52.       lcd_gotoxy(x,y);              // cursor para escribir mensaje
  53.       lcd_putc("kapotik.kapotik.kapotik.kapotik");   // muestra por pantalla el mensaje
  54.      
  55.       if(T_mSeg)                    // Si pasaron 262 mSeg. aprox...
  56.       {
  57.          x--;                       // decremento indice de filas
  58.      
  59.          if(x<-31)                    // ¿ya se ha mostrado mensaje entero por 1ºfila?
  60.          {
  61.             x=16;                    // decremento indice columnas
  62.          }
  63.  
  64.          lcd_gotoxy(1,1);           // Borro solamente la primera línea del LCD
  65.          lcd_putc("                ");
  66.  
  67.          T_mSeg = false;            // Desactivo la bandera
  68.       }
  69.    
  70.       if(!input(pin_A0) && !boton)  // Pregunta si RA0 es cero
  71.       {
  72.          A++;                       // Incremento el conteo
  73.          boton = true;
  74.          write_int32_eeprom(0x00, A);
  75.          delay_ms(50);
  76.       }
  77.  
  78.       if(input(pin_A0))
  79.          boton = false;             // Al soltar el Boton...
  80.  
  81.       if(A>=9999999)                // Preguto si A es mayor o igual a 9999999,
  82.       {                             // cuando sea igual iguala "A" a cero
  83.          A=0;  
  84.       }
  85.  
  86.       lcd_gotoxy(1,2);                             // Acomoda cursor LCD
  87.       printf(lcd_putc, "valor %Lu         ", A);   // Imprime 16 espacios en el LCD
  88.    }
  89.  
  90. }

Saludos!

eeeeee.... no vale me ganaste de mano :D

yo habia puesto
Código: [Seleccionar]
if(x<-30)       
si funciona perfecto !!!!

Desconectado bmb

  • PIC18
  • ****
  • Mensajes: 423
Re: contador lcd llega A 255 y se vuelve a 0 alguien que me de una mano
« Respuesta #68 en: 09 de Abril de 2013, 12:03:42 »
OK, me alegra! No sabía que la función lcd_gotoxy(x,y) aceptaba valores negativos! Todos los días se aprende algo nuevo, muchas gracias Marcos!

Saludos!

Desconectado kapotik

  • PIC16
  • ***
  • Mensajes: 121
Re: contador lcd llega A 255 y se vuelve a 0 alguien que me de una mano
« Respuesta #69 en: 09 de Abril de 2013, 12:29:33 »
Aclaracion: para quien venga siguiendo o quiera armarlo, el numero que va en
Código: [Seleccionar]
if(x<-22)
es la cantidad de caracteres que tiene el mensaje a visualizar, es decir que cada quien tendra que modificar este valor de acuerdo al mensaje, tambien se puede poner un valor mayor para insertar una pausa entre visualizacion y visualizacion.
En cuanto tenga los archivos del PCB los subo.

Gracias
Saludos

Desconectado kapotik

  • PIC16
  • ***
  • Mensajes: 121
Re: contador lcd llega A 255 y se vuelve a 0 alguien que me de una mano
« Respuesta #70 en: 10 de Abril de 2013, 10:09:22 »
Bueno arme el circuito y para mi asombro no funciona correctamente :5]
no entiendo porque el simulador lo muestra bien y en la realidad no :(
les dejo un video para ver si alguien se da cuenta cual es el problema


saludos

Desconectado bmb

  • PIC18
  • ****
  • Mensajes: 423
Re: contador lcd llega A 255 y se vuelve a 0 alguien que me de una mano
« Respuesta #71 en: 10 de Abril de 2013, 11:27:20 »
Hola kapotik y el código?

Saludos!

Desconectado kapotik

  • PIC16
  • ***
  • Mensajes: 121
Re: contador lcd llega A 255 y se vuelve a 0 alguien que me de una mano
« Respuesta #72 en: 10 de Abril de 2013, 11:52:59 »
Hola kapotik y el código?

Saludos!

perdon :oops:

Código: [Seleccionar]
include <16F628A.h>

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES XT                       //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES PROTECT

#use delay(clock=4000000)

#rom 0x2100 ={0,0,0,0}

#define LCD_ENABLE_PIN  PIN_B1
#define LCD_RS_PIN      PIN_B2
#define LCD_RW_PIN      PIN_B3
#define LCD_DATA4       PIN_B4
#define LCD_DATA5       PIN_B5
#define LCD_DATA6       PIN_B6
#define LCD_DATA7       PIN_B7

#include <lcd.c>
#include <internal_eeprom.c>
  
int32 A = 0;
int1 boton = false, T_mSeg = false;

#int_TIMER1
void  TIMER1_isr(void)
{
   T_mSeg = true;
}

void main()
{
   char y=1;                        // indice columnas
   signed char x=16;                 // indice filas
  
   setup_timer_1(T1_INTERNAL|T1_DIV_BY_4);  //262 ms overflow
   enable_interrupts(INT_TIMER1);
   enable_interrupts(GLOBAL);

   lcd_init();                      // Inicia LCD
   lcd_putc("Inicializando el\n");  // Saca texto
   lcd_putc(" equipo aguarde  ");    // Saca texto
   delay_ms(2000);                  // Retardo
   lcd_putc("\f");                  // Limpia pantalla
    

   A = read_int32_eeprom(0x00);     // Lee contador de la EEPROM
  
   while(TRUE)
   {
      lcd_gotoxy(x,y);              // cursor para escribir mensaje
      lcd_putc("0123456789.kapotik.abcdefghi");   // muestra por pantalla el mensaje
      
      if(T_mSeg)                    // Si pasaron 262 mSeg. aprox...
      {
         x--;                       // incremento indice de filas
      
         if(x<-31)                   // ¿ya se ha mostrado mensaje entero por 1ºfila?
         {
            x=16;                   // SI -> indice fila x=-8
            x++;                    // incremento indice columnas
         }

         lcd_gotoxy(1,1);           // Borro solamente la primera línea del LCD
         lcd_putc("                ");

         T_mSeg = false;            // Desactivo la bandera
      }
  
      if(!input(pin_A0) && !boton)  // Pregunta si RA0 es cero
      {
         A++;                       // Incremento el conteo
         boton = true;
         write_int32_eeprom(0x00, A);
         delay_ms(50);
      }

      if(input(pin_A0))
         boton = false;             // Al soltar el Boton...

      if(A>=9999999)                // Preguto si A es mayor o igual a 9999999,
      {                             // cuando sea igual iguala "A" a cero
         A=0;  
      }

      lcd_gotoxy(1,2);                             // Acomoda cursor LCD
      printf(lcd_putc, "VALOR:%Lu         ", A);   // Imprime 16 espacios en el LCD
   }

}

Desconectado bmb

  • PIC18
  • ****
  • Mensajes: 423
Re: contador lcd llega A 255 y se vuelve a 0 alguien que me de una mano
« Respuesta #73 en: 10 de Abril de 2013, 16:44:43 »
Mmmhhh!!! Creo que es el Proteus el que está fallando ahí, por lo que veo no se puede confiar mucho en él.  Prueba con estos cambios:

Código: C
  1. #include <16F628A.h>
  2.  
  3. #FUSES NOWDT                    //No Watch Dog Timer
  4. #FUSES XT                       //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD
  5. #FUSES NOBROWNOUT               //No brownout reset
  6. #FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
  7. #FUSES PROTECT
  8.  
  9. #use delay(clock=4000000)
  10.  
  11. #rom 0x2100 ={0,0,0,0}
  12.  
  13. #define LCD_ENABLE_PIN  PIN_B1
  14. #define LCD_RS_PIN      PIN_B2
  15. #define LCD_RW_PIN      PIN_B3
  16. #define LCD_DATA4       PIN_B4
  17. #define LCD_DATA5       PIN_B5
  18. #define LCD_DATA6       PIN_B6
  19. #define LCD_DATA7       PIN_B7
  20.  
  21. #include <lcd.c>
  22. #include <internal_eeprom.c>
  23.    
  24. int32 A = 0;
  25. int1 boton = false, T_mSeg = false;
  26.  
  27. #int_TIMER1
  28. void  TIMER1_isr(void)
  29. {
  30.    T_mSeg = true;
  31. }
  32.  
  33. void main()
  34. {
  35.    char y=1;                        // indice columnas
  36.    signed char x=16;                 // indice filas
  37.    
  38.    setup_timer_1(T1_INTERNAL|T1_DIV_BY_4);  //262 ms overflow
  39.    enable_interrupts(INT_TIMER1);
  40.    enable_interrupts(GLOBAL);
  41.  
  42.    lcd_init();                      // Inicia LCD
  43.    lcd_putc("Inicializando el\n");  // Saca texto
  44.    lcd_putc(" equipo aguarde  ");    // Saca texto
  45.    delay_ms(2000);                  // Retardo
  46.    lcd_putc("\f");                  // Limpia pantalla
  47.    
  48.  
  49.    A = read_int32_eeprom(0x00);     // Lee contador de la EEPROM
  50.    
  51.    while(TRUE)
  52.    {
  53.       lcd_gotoxy(x,y);              // cursor para escribir mensaje
  54.       lcd_putc("0123456789.kapotik.abcdefghi");   // muestra por pantalla el mensaje
  55.      
  56.       if(T_mSeg)                    // Si pasaron 262 mSeg. aprox...
  57.       {
  58.          x--;                       // decremento indice de filas
  59.      
  60.          if(x<-30)                   // ¿ya se ha mostrado mensaje entero?
  61.          {
  62.             x=16;                   //
  63.          }
  64.  
  65.          lcd_gotoxy(1,1);           // Borro solamente la primera línea del LCD
  66.          lcd_putc("                ");
  67.  
  68.          T_mSeg = false;            // Desactivo la bandera
  69.       }
  70.    
  71.       if(!input(pin_A0) && !boton)  // Pregunta si RA0 es cero
  72.       {
  73.          A++;                       // Incremento el conteo
  74.          write_int32_eeprom(0x00, A);
  75. //       delay_ms(50);
  76.          boton = true;
  77.       }
  78.  
  79.       if(input(pin_A0))
  80.          boton = false;             // Al soltar el Boton...
  81.  
  82.       if(A>=9999999)                // Preguto si A es mayor o igual a 9999999,
  83.       {                             // cuando sea igual iguala "A" a cero
  84.          A=0;  
  85.       }
  86.  
  87.       lcd_gotoxy(1,2);                              // Acomoda cursor LCD
  88.       printf(lcd_putc, "VALOR: %Lu         ", A);   // Imprime 16 espacios en el LCD
  89.    }
  90. }

Saludos!

Edit:  Hola kapotik, estos cambios ya te los había hecho desde el post #66... te devolviste!!!   :)
« Última modificación: 10 de Abril de 2013, 17:50:08 por bmb »

Desconectado kapotik

  • PIC16
  • ***
  • Mensajes: 121
Re: contador lcd llega A 255 y se vuelve a 0 alguien que me de una mano
« Respuesta #74 en: 10 de Abril de 2013, 19:26:12 »
hola bmb, ya lo probe y no, sigue haciendo lo mismo.

Cual crees que puede ser el problema?

saludos