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

0 Usuarios y 4 Visitantes están viendo este tema.

Desconectado bmb

  • PIC18
  • ****
  • Mensajes: 423
Re: contador lcd llega A 255 y se vuelve a 0 alguien que me de una mano
« Respuesta #75 en: 10 de Abril de 2013, 19:30:29 »
Hola, hiciste los 3 cambios en el programa?  De ser así, voy a mirar si saco un rato de aquí a mañana para montarlo en físico y ver que pasa.

Saludos!

Desconectado kapotik

  • PIC16
  • ***
  • Mensajes: 121
Re: contador lcd llega A 255 y se vuelve a 0 alguien que me de una mano
« Respuesta #76 en: 10 de Abril de 2013, 19:46:11 »
Hola, hiciste los 3 cambios en el programa?  De ser así, voy a mirar si saco un rato de aquí a mañana para montarlo en físico y ver que pasa.

Saludos!

si, directamente copie el codigo que pegaste

saludos

Desconectado bmb

  • PIC18
  • ****
  • Mensajes: 423
Re: contador lcd llega A 255 y se vuelve a 0 alguien que me de una mano
« Respuesta #77 en: 10 de Abril de 2013, 22:48:22 »
Hola kapotik, ahora en la noche pude montar el circuito físico y efectivamente pasa lo que muestras en el video.  Creo que tocará investigar sobre las instrucciones que corren los caracteres hacia la derecha o izquierda, porque con los números negativos, el LCD tiene un comportamiento extraño.  Te dejo el código de prueba que hice y allí verás como solo acepta algunos números negativos y otros no ( parece que de -8 en -8 y el -16 lo toma como 1  :) ).  Cambié la variable A por el valor de x para ver lo que pasaba.  Solo se puede ver en el circuito físico, porque al Proteus no le importa y siempre lo hace bien.

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_RS_PIN      PIN_B1
  13. #define LCD_RW_PIN      PIN_B2
  14. #define LCD_ENABLE_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.    int y=1;                        // indice columnas
  35.    signed int x=1;                 // 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.    A = read_int32_eeprom(0x00);     // Lee contador de la EEPROM
  48.    
  49.    while(TRUE)
  50.    {
  51.       lcd_gotoxy(x,y);              // cursor para escribir mensaje
  52.       lcd_putc("12345678 kapotik"); // muestra por pantalla el mensaje
  53.      
  54.       if(T_mSeg)                    // Si pasaron 262 mSeg. aprox...
  55.       {
  56.          x--;                       // decremento indice de filas
  57.      
  58.          if(x<-40)                   // ¿ya se ha mostrado mensaje entero?
  59.          {
  60.             x=16;                   //
  61.          }
  62.  
  63.          lcd_gotoxy(1,1);           // Borro solamente la primera línea del LCD
  64.          lcd_putc("                ");
  65.  
  66.          T_mSeg = false;            // Desactivo la bandera
  67.       }
  68.    
  69.       if(!input(pin_A0) && !boton)  // Pregunta si RA0 es cero
  70.       {
  71.          A++;                       // Incremento el conteo
  72.          write_int32_eeprom(0x00, A);
  73. //       delay_ms(50);
  74.          boton = true;
  75.       }
  76.  
  77.       if(input(pin_A0))
  78.          boton = false;             // Al soltar el Boton...
  79.  
  80.       if(A>=9999999)                // Preguto si A es mayor o igual a 9999999,
  81.       {                             // cuando sea igual iguala "A" a cero
  82.          A=0;  
  83.       }
  84.  
  85.       lcd_gotoxy(1,2);                              // Acomoda cursor LCD
  86.       printf(lcd_putc, "VALOR de x: %d    ", x);   // Imprime 16 espacios en el LCD
  87.    }
  88. }

Saludos!

Desconectado kapotik

  • PIC16
  • ***
  • Mensajes: 121
Re: contador lcd llega A 255 y se vuelve a 0 alguien que me de una mano
« Respuesta #78 en: 12 de Abril de 2013, 12:10:02 »
hola, e estado leyendo y leyendo, y parece qu la manera de hacerlo es con la instruccion FOR, pero por el momento no me sale nada.

saludos

Desconectado bmb

  • PIC18
  • ****
  • Mensajes: 423
Re: contador lcd llega A 255 y se vuelve a 0 alguien que me de una mano
« Respuesta #79 en: 12 de Abril de 2013, 17:20:42 »
En la tarde hago algunas pruebas con algo que encontré en otro foro y te comento.

Saludos!

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: contador lcd llega A 255 y se vuelve a 0 alguien que me de una mano
« Respuesta #80 en: 13 de Abril de 2013, 14:37:06 »
Hola.

El problema seguramente viene dado por la distribución de memoria del LCD. Hace mucho que no juego con rotaciones en LCDs de este tipo, pero acá vos estás rotando el contenido moviendo las coordenadas mediante lcd_gotoxy(,) y el display real tiene la memoria repartida de otra forma.En el datasheet del controlador del  LCD podrás encontrar tal vez información de cómo está implementada la distribución de memoria de cada fila del LCD.

Para que te des una idea de lo que estoy diciendo, muchos LCDs de 16x2 implementan por ejemplo, 32 posiciones de memoria por fila. Las 16 visibles y 8 mas hacia la izquierda y 8 hacia la derecha. Eso te permite hacer o bien pequeñas rotaciones como haces vos, moviendo la posicion de memoria desde la cual escribir, o bien directamente rotaciones a la izq o der mediante comandos de rotacion de pantalla que el LCD seguramente soporta. El problema es que una vez terminada esa memoria(es decir, si rotás más allá de las 8 posiciones de offset hacia cada lado ofrecidas), los LCDs suelen tener zonas de memoria o bien no implementadas, implementadas pero no visibles o bien que pasan directamente a la fila siguiente.
« Última modificación: 13 de Abril de 2013, 14:42:37 por BrunoF »
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado bmb

  • PIC18
  • ****
  • Mensajes: 423
Re: contador lcd llega A 255 y se vuelve a 0 alguien que me de una mano
« Respuesta #81 en: 13 de Abril de 2013, 23:02:16 »
Hola Bruno, muy interesante tu explicación, aclara muchas cosas.  Bueno, ya sabiendo esto, estuve investigando un poco y pude averiguar cuales eran los comandos para correr caracteres a la izquierda o derecha, pero no son muy útiles en LCDs de 2 líneas, ya que estos comandos operan siempre sobre las dos líneas.  Se usan aprovechando la función  lcd_send_byte() que ya tiene implementada la librería LCD.c.  Los dejo a manera informativa:

Código: C
  1. void lcd_cursor_derecha()
  2. {
  3.    lcd_send_byte(0, 0x1E);
  4.                                          
  5. }
  6.  
  7. void lcd_cursor_izquierda(void)
  8. {
  9.    lcd_send_byte(0, 0x18);
  10.  
  11. }

Creo que la única forma será implementarlos por medio del manejo de strings.

Saludos!

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: contador lcd llega A 255 y se vuelve a 0 alguien que me de una mano
« Respuesta #82 en: 13 de Abril de 2013, 23:11:00 »
Si, efectivamente la forma más efectiva y segura desde el punto de vista de la compatibilidad con todos los drivers Hitachi originales y clones, es hacerlo por software y rotar el string a enviar, en lugar de rotar la posicion del display donde escribir. No es tan complejo como parece, y hay varias formas de hacerlo.

P.D. Sí bmb, efectivamente rota todas las filas. Lamentablemente no se puede elegir cuál rotar.

Saludos!
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado kapotik

  • PIC16
  • ***
  • Mensajes: 121
Re: contador lcd llega A 255 y se vuelve a 0 alguien que me de una mano
« Respuesta #83 en: 15 de Abril de 2013, 21:41:12 »
Hola he encontrado en el foro una manera de hacerlo, el amigo MLO comparte su codigo pero yo no logro insertarlo al mio de ninguna manera, se los dejo haber si ustedes lo comprenden mejor.

Hola.

Yo lo hago asi:

Código: C#
  1. while(vista_inicial)
  2.                 {
  3.                         lcd_gotoxy(3,1);
  4.                         lcd_putc("ULTRASONIDO 1&3 MHz");
  5.                         mensaje=true;
  6.                         while(mensaje)
  7.                         {
  8.                                 lcd_gotoxy(1,2);
  9.                                 printf(lcd_putc,"%s",mensaje_inicial);
  10.                                 do{cmd=kbd_getc();}while(sweep!=true);
  11.                                 sweep=false;
  12.                                 for(i=0;i<=strlen(mensaje_inicial)-1;i++)
  13.                                 {
  14.                                         mensaje_inicial[i]=mensaje_inicial[i+1];
  15.                                 }
  16.                                 mensaje_inicial[strlen(mensaje_inicial)]=msj_rom[k++];
  17.                                 if(k>=sizeof(msj_rom)-1)
  18.                                         k=0;
  19.                         }
  20.                 }

En donde msj_rom es donde guardo el mensaje largo y mensaje_inicial es el bufer de memoria para la LCD -de unos 24 caracateres para la LCD que yo uso-, la variable sweep la controlo con un timer (para el tiempo de scroll).

Saludos

Saludos

Desconectado hector915

  • PIC12
  • **
  • Mensajes: 78
    • Blog Personal.
Re: contador lcd llega A 255 y se vuelve a 0 alguien que me de una mano
« Respuesta #84 en: 18 de Abril de 2013, 00:07:27 »
Excelente me funciona perfecto lo del scroll text ((:-)) en la lcd,aunque no me gusta mucho ccs,lo utilizo por que el profesor lo esta usando  :5]
Muchas gracias me gusta este foro  :lol:
if you can imagine it, you can embed it

Desconectado kapotik

  • PIC16
  • ***
  • Mensajes: 121
Re: contador lcd llega A 255 y se vuelve a 0 alguien que me de una mano
« Respuesta #85 en: 18 de Abril de 2013, 11:49:01 »
Excelente me funciona perfecto lo del scroll text ((:-)) en la lcd,aunque no me gusta mucho ccs,lo utilizo por que el profesor lo esta usando  :5]
Muchas gracias me gusta este foro  :lol:

Hola hector915, podrias colocar el codigo?

Saludos

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: contador lcd llega A 255 y se vuelve a 0 alguien que me de una mano
« Respuesta #86 en: 19 de Abril de 2013, 11:47:05 »
Hola.

Que parte no te funciona?

El codigo que esta ahi es parte de otro codigo :P ... por lo que habria que definir ciertas variables como lo son:
vista_inicial : tipo boolean
mensaje : tipo boolean
mensaje_incial : arreglo tipo char
sweep : tipo boolean
i,k : tipo int

la constante msj_rom es donde guardo el string que se quiere visualizar ... algo como: const char msj_rom[]={"Hola mundo"};

Saludos

El papel lo aguanta todo

Desconectado kapotik

  • PIC16
  • ***
  • Mensajes: 121
Re: contador lcd llega A 255 y se vuelve a 0 alguien que me de una mano
« Respuesta #87 en: 19 de Abril de 2013, 20:49:10 »
Hola.

Que parte no te funciona?

El codigo que esta ahi es parte de otro codigo :P ... por lo que habria que definir ciertas variables como lo son:
vista_inicial : tipo boolean
mensaje : tipo boolean
mensaje_incial : arreglo tipo char
sweep : tipo boolean
i,k : tipo int

la constante msj_rom es donde guardo el string que se quiere visualizar ... algo como: const char msj_rom[]={"Hola mundo"};

Saludos



Hola MLO, lo que pasa es que todavia me falta mucho para dominar este lenguaje, recien me estoy migrando del assembler y hay cosas que o no termino de entender o no me doy cuenta como ponerlas :oops:

podrias poner a ,modo ejemplo un codigo completo en el cual pueda entender viendo como lo haces el poder desplazar un mensaje de derecha a izquierda?, asi luego lo pueda implementar en mi proyecto.

Gracias
Saludos


 

anything