TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: kapotik en 02 de Abril de 2013, 18:32:33

Título: contador lcd llega A 255 y se vuelve a 0 alguien que me de una mano
Publicado por: kapotik en 02 de Abril de 2013, 18:32:33
Hola, estoy empezando con el lenguaje C, vengo del assembler, necesito hacerun contador LCD que cuente hasta 999999, pero cuando llega a 255 se vuelve a cero, uso una libreria para controlar el LCD que me pasaron, por favor alguien que me explique en que me estoy equivocando gracias.

Código: [Seleccionar]
#include <16f84a.h>
#use delay(clock=4000000)
#fuses xt,nowdt,noprotect
#byte portb=6
#include <lcdb.c>

int A=0;

void main(void)
{
lcd_init();                //Inicia LCD
lcd_putc(" Contador\n");   // Saca texto
lcd_putc(" Digital");      // Saca texto
delay_ms(2000);            // Retardo
lcd_putc("\f");            // Limpia pantalla
lcd_putc("Conteo\n");      //Saca texto

while(true)
{

if(input(pin_A0)==0) // Pregunta si RA0 es cero
{
A++;            // Incremento el conteo
delay_ms(500);  // Para visualizar correctamente el conteo

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



lcd_gotoxy(2,2);          //Acomoda cursor LCD
lcd_putc(" ");            //Limpia ese sector de pantalla
printf(lcd_putc,"%3U",A); // Imprime el conteo por la lcd
}
}

la libreria

Código: [Seleccionar]
///////////////////////////////////////////////////////////////////////////
//                                  
///////////////////////////////////////////////////////////////////////////
//     B0  
//     B1  
//     B2  E
//     B3  RS
//     B4  D4
//     B5  D5
//     B6  D6
//     B7  D7
//   (Sin 'RW')
//
// Funciones soportadas:
//                         lcd_init()
//                         lcd_gotoxy( BYTE col, BYTE fila)
//                         lcd_putc( char c)
//                              \f  Clear display                            
//                              \n  Go to start of second line                
//                              \b  Move back one position
//
///////////////////////////////////////////////////////////////////////////
#define use_portb_lcd TRUE  //LCD conectado al puerto b.
//
struct lcd_pin_map {
   BOOLEAN unused1; // RB0
   BOOLEAN unused2; // RB1
   BOOLEAN enable;  // RB2
   BOOLEAN rs;      // RB3
   int data : 4;    // RB4-RB7
} lcd;
//
#byte lcd = 0xF81  // Direccion de la estructura "lcd".
#byte lcd = 6      // Direccion del puerto B.
#define set_tris_lcd(x) set_tris_b(x)
#define lcd_type 2           // Tipo de LCD: 0=5x7, 1=5x10, 2=2 lineas
#define lcd_line_two 0x40    // Dirección de la LCD RAM para la 2da. linea
//
//Defino la cadena de inicializacion del LCD.
BYTE const LCD_INIT_STRING[4] = {0x20 | (lcd_type << 2), 0xc, 1, 6};
//
//Configuro el estado de cada pin para lectura y escritura:
struct lcd_pin_map const LCD_WRITE = {0,0,0,0,0}; // Escribir.
struct lcd_pin_map const LCD_READ = {0,0,0,0,15}; // Leer.
//
//Funciones:
BYTE lcd_read_byte() {
      BYTE low,high;
      set_tris_lcd(LCD_READ);
      delay_cycles(1);
      lcd.enable = 1;
      delay_cycles(1);
      high = lcd.data;
      lcd.enable = 0;
      delay_cycles(1);
      lcd.enable = 1;
      delay_us(1);
      low = lcd.data;
      lcd.enable = 0;
      set_tris_lcd(LCD_WRITE);
      return( (high<<4) | low);
}
//
void lcd_send_nibble( BYTE n ) {
      lcd.data = n;
      delay_cycles(1);
      lcd.enable = 1;
      delay_us(2);
      lcd.enable = 0;
}
//
void lcd_send_byte( BYTE address, BYTE n ) {
      lcd.rs = 0;
      while ( bit_test(lcd_read_byte(),7) ) ;
      lcd.rs = address;
      delay_cycles(1);
      delay_cycles(1);
      lcd.enable = 0;
      lcd_send_nibble(n >> 4);
      lcd_send_nibble(n & 0xf);
}
//
void lcd_init() {
    BYTE i;
    set_tris_lcd(LCD_WRITE);
    lcd.rs = 0;
    lcd.enable = 0;
    delay_ms(15);
    for(i=1;i<=3;++i) {
       lcd_send_nibble(3);
       delay_ms(5);
    }
    lcd_send_nibble(2);
    for(i=0;i<=3;++i)
       lcd_send_byte(0,LCD_INIT_STRING[i]);
}
//
void lcd_gotoxy( BYTE x, BYTE y) {
   BYTE address;
   if(y!=1)
     address=lcd_line_two;
   else
     address=0;
     address+=x-1;
     lcd_send_byte(0,0x80|address);
}
//
void lcd_putc( char c) {
   switch (c) {
     case '\f'   : lcd_send_byte(0,1);
                   delay_ms(2);
                                           break;
     case '\n'   : lcd_gotoxy(1,2);        break;
     case '\b'   : lcd_send_byte(0,0x10);  break;
     default     : lcd_send_byte(1,c);     break;
   }
}
Título: Re: contador lcd llega A 255 y se vuelve a 0 alguien que me de una mano
Publicado por: AngelGris en 02 de Abril de 2013, 19:07:38
Hasta donde tengo entendido, las variables del tipo int, en CCS son de 8 bits; por lo tanto tu contador no podrá contar mas que 255
Título: Re: contador lcd llega A 255 y se vuelve a 0 alguien que me de una mano
Publicado por: MLO__ en 02 de Abril de 2013, 19:10:49
Hola.

Tal como lo menciona el amigo AngelGris, solo llega a 255 por ser una variable de 8 bits. Si quieres que llegue a mas, prueba declarar tu variable del tipo long, o long long.

Saludos
Título: Re: contador lcd llega A 255 y se vuelve a 0 alguien que me de una mano
Publicado por: kapotik en 02 de Abril de 2013, 19:28:33
Hola.

Tal como lo menciona el amigo AngelGris, solo llega a 255 por ser una variable de 8 bits. Si quieres que llegue a mas, prueba declarar tu variable del tipo long, o long long.

Saludos

Gracias muchachos por las respuestas, probe con long y me da el error de que en la linea 36 el formato de impresion en el lcd no es valido, que seria esto: printf(lcd_putc,"%3U",A); // Imprime el conteo por la lcd

si le pongo long long compila pero sigue contando hasta 255

saludos
Título: Re: contador lcd llega A 255 y se vuelve a 0 alguien que me de una mano
Publicado por: planeta9999 en 02 de Abril de 2013, 19:34:43


Además de lo que comentan los compañeros, lo raro es que te llegue hasta 255 usando una variable con signo (salvo que en CCS por omisión sea sin signo), que debería aceptar solo valores entre -128 y +128. Para almacenar un valor entre 0 y 255 tendría que ser "unsigned int".

Tendrás que usar una variable de 32 bits, para llegar hasta esos 999999.




Título: Re: contador lcd llega A 255 y se vuelve a 0 alguien que me de una mano
Publicado por: kapotik en 02 de Abril de 2013, 19:49:16


Además de lo que comentan los compañeros, lo raro es que te llegue hasta 255 usando una variable con signo (salvo que en CCS por omisión sea sin signo), que debería aceptar solo valores entre -128 y +128. Para almacenar un valor entre 0 y 255 tendría que ser "unsigned int".

Tendrás que usar una variable de 32 bits, para llegar hasta esos 999999.






buscando en la red encontre esto:
int (16 bits)
Utiliza generalmente 2 bytes de memoria, valores: de -32 768 a 32 767.
int (32 bits)
Utiliza generalmente 4 bytes de memoria, valores: de -2 147 483 648 a 2 147 483 647.

pero no entiendo como colocarlo ya que las dos se llaman igual.
Título: Re: contador lcd llega A 255 y se vuelve a 0 alguien que me de una mano
Publicado por: AcoranTf en 02 de Abril de 2013, 19:51:52
Tu problema es muy simple, estas inicializando la variable "A" como intEGER, por tanto el valor maximo de un integer es de 255.
Como no hay forma de crear una variable que abarque la cifra que tu quieres, deberas anidar dos contadores y hacer las operaciones correspondientes para controlarlo y sacarlo por el LCD. Te bastara con que una de las variables sea del tipo "long", que podra tener valores de hasta 65535 y la otra del tipo "int".
Por ejemplo supongamos las variables "long A=0; int B=1; C=0". C es el valor actual del contador, tendremos algo asi:  

Código: [Seleccionar]

long A=0;
int B=1
C=0

void main(void)
{
lcd_init();                //Inicia LCD
lcd_putc(" Contador\n");   // Saca texto
lcd_putc(" Digital");      // Saca texto
delay_ms(2000);            // Retardo
lcd_putc("\f");            // Limpia pantalla
lcd_putc("Conteo\n");      //Saca texto

while(true)
{

if(input(pin_A0)==0) // Pregunta si RA0 es cero
{
A++;            // Incremento el conteo
delay_ms(500);  // Para visualizar correctamente el conteo

if(A==65535)   // Cada vez que rebase el valor de A
{ B++;}            // Incrementa B
C= A&B;          // Ajusta el contador al producto de A por B

if(C>=999999)      // Preguto si C es mayor o igual a 999999,
{                         // cuando sea igual iguala "A" a cero, "B" igual a 1 y "C" igual a 0
A=0;  
B=1;
C=0;                    // El resto sigue aqui.


Saludos.
Título: Re: contador lcd llega A 255 y se vuelve a 0 alguien que me de una mano
Publicado por: kapotik en 02 de Abril de 2013, 20:05:56
Tu problema es muy simple, estas inicializando la variable "A" como intEGER, por tanto el valor maximo de un integer es de 255.
Como no hay forma de crear una variable que abarque la cifra que tu quieres, deberas anidar dos contadores y hacer las operaciones correspondientes para controlarlo y sacarlo por el LCD. Te bastara con que una de las variables sea del tipo "long", que podra tener valores de hasta 65535 y la otra del tipo "int".
Por ejemplo supongamos las variables "long A=0; int B=1; C=0". C es el valor actual del contador, tendremos algo asi:  

Código: [Seleccionar]

long A=0;
int B=1
C=0

void main(void)
{
lcd_init();                //Inicia LCD
lcd_putc(" Contador\n");   // Saca texto
lcd_putc(" Digital");      // Saca texto
delay_ms(2000);            // Retardo
lcd_putc("\f");            // Limpia pantalla
lcd_putc("Conteo\n");      //Saca texto

while(true)
{

if(input(pin_A0)==0) // Pregunta si RA0 es cero
{
A++;            // Incremento el conteo
delay_ms(500);  // Para visualizar correctamente el conteo

if(A==65535)   // Cada vez que rebase el valor de A
{ B++;}            // Incrementa B
C= A&B;          // Ajusta el contador al producto de A por B

if(C>=999999)      // Preguto si C es mayor o igual a 999999,
{                         // cuando sea igual iguala "A" a cero, "B" igual a 1 y "C" igual a 0
A=0;  
B=1;
C=0;                    // El resto sigue aqui.


Saludos.


gracias por la explicacion, pero como declaro a C en el inicio?, recorda que soy muy novatillo en este lenguaje y hay muchas cosas que alo mejor ustedes dan por entendido y yo trato, pero todavia estoy aprendiendo.

saldos
Título: Re: contador lcd llega A 255 y se vuelve a 0 alguien que me de una mano
Publicado por: MLO__ en 02 de Abril de 2013, 20:25:24
Hola

Al utilizar long, debes cambiar la forma en la que se escribe el dato en la LCD con la funcion printf .... si mal no recuerdo es %lu  ....

Saludos
Título: Re: contador lcd llega A 255 y se vuelve a 0 alguien que me de una mano
Publicado por: planeta9999 en 02 de Abril de 2013, 20:40:28
Citar
buscando en la red encontre esto:
int (16 bits)
Utiliza generalmente 2 bytes de memoria, valores: de -32 768 a 32 767.
int (32 bits)
Utiliza generalmente 4 bytes de memoria, valores: de -2 147 483 648 a 2 147 483 647.

pero no entiendo como colocarlo ya que las dos se llaman igual.


Deberías de consultar el manual del compilador que estés usando, para ver que tipo de variables puedes definir.
Yo hace años que solo uso micros de 32 bits y compiladores de Microchip, lo ideal sería que pudieras declarar una variable de tipo "long long" que te permitiría disponer de 32 bits.

Si tu compilador es el CCS, tal vez sea algo así:
http://www.aquihayapuntes.com/programacion-pic-en-c.html?start=4




Título: Re: contador lcd llega A 255 y se vuelve a 0 alguien que me de una mano
Publicado por: RALF2 en 02 de Abril de 2013, 21:26:37
Que tal amigos.
Kapotik, se me ocurre para resolver tu problema hacer lo siguiente:
int a,b,c;
donde a es el byte menos significativo y c el byte mas significativo.
Luego:
si a>99 incremento b y hago a=0
asi sucesivamente hasta que b>99 entonces incremento c y hago a=0 y b=0.
luego cuando c==99 hago, printf("%u%2u%2u",c,b,a);

pruebalo a ver que tal   :mrgreen:
Título: Re: contador lcd llega A 255 y se vuelve a 0 alguien que me de una mano
Publicado por: kapotik en 02 de Abril de 2013, 21:45:36
Hola

Al utilizar long, debes cambiar la forma en la que se escribe el dato en la LCD con la funcion printf .... si mal no recuerdo es %lu  ....

Saludos

bueno, empieza a tener forma, gracias a todos por la ayuda, la clave fue este mensaje que cito, la manera del printf y logicamente el "long long", puedo contar hasta numeros de 10 digitos, mas o menos hasta 4652897356, no recuerdo bien el numero pero empesaba con 4, pero...........y siempre tiene que haber un pero, es que no me vuelve a cero, si no que empieza a contar de manera extraña, calculo yo que debe de seguir incrementando pero en algun modo raro, hexadecimal o algo por el estilo.

les pongo el codigo como quedo, para ver si alguien se da cuenta porque no me vuelve a cero.
Código: [Seleccionar]
#include <16f84a.h>
#use delay(clock=4000000)
#fuses xt,nowdt,noprotect
#byte portb=6
#include <lcdb.c>

long long A=0;

void main(void)
{
lcd_init();                //Inicia LCD
lcd_putc(" Contador\n");   // Saca texto
lcd_putc(" Digital");      // Saca texto
delay_ms(2000);            // Retardo
lcd_putc("\f");            // Limpia pantalla
lcd_putc("Conteo\n");      //Saca texto

while(true)
{

if(input(pin_A0)==0) // Pregunta si RA0 es cero
{
A++;            // Incremento el conteo
delay_ms(10);  // Para visualizar correctamente el conteo

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



lcd_gotoxy(2,2);          //Acomoda cursor LCD
lcd_putc(" ");            //Limpia ese sector de pantalla
printf(lcd_putc,"%lu",A); // Imprime el conteo por la lcd
}
}
Título: Re: contador lcd llega A 255 y se vuelve a 0 alguien que me de una mano
Publicado por: bmb en 02 de Abril de 2013, 21:56:00
Hola, en CCS puedes declarar variables de 32 bits directamente así:

Código: [Seleccionar]
int32 A=0;
El formato para printf es %Lu

Saludos!

Edit: con  estas instrucciones:

Código: [Seleccionar]
lcd_gotoxy(2,2);          //Acomoda cursor LCD
lcd_putc(" ");            //Limpia ese sector de pantalla

Solo borras un carácter de la línea donde debe aparecer el valor de A y por eso es posible que veas números extraños.  Lo mejor es que borres la línea completa o como mínimo los 6 caracteres que ocupan el valor máximo que alcanza la variable A.

Saludos!
Título: Re: contador lcd llega A 255 y se vuelve a 0 alguien que me de una mano
Publicado por: kapotik en 02 de Abril de 2013, 23:51:46
Hola, en CCS puedes declarar variables de 32 bits directamente así:

Código: [Seleccionar]
int32 A=0;
El formato para printf es %Lu

Saludos!

Edit: con  estas instrucciones:

Código: [Seleccionar]
lcd_gotoxy(2,2);          //Acomoda cursor LCD
lcd_putc(" ");            //Limpia ese sector de pantalla

Solo borras un carácter de la línea donde debe aparecer el valor de A y por eso es posible que veas números extraños.  Lo mejor es que borres la línea completa o como mínimo los 6 caracteres que ocupan el valor máximo que alcanza la variable A.

Saludos!

como borro la segunda linea porque solo se borrar toda la pantalla con:
 lcd_putc("\f");
Título: Re: contador lcd llega A 255 y se vuelve a 0 alguien que me de una mano
Publicado por: AngelGris en 03 de Abril de 2013, 09:28:30
Para borrar la segunda línea se puede recurrir a un gotoxy, que coloque el cursor en el primer caracter de la segunda línea. Luego un printf con todos espacios en blanco.
Título: Re: contador lcd llega A 255 y se vuelve a 0 alguien que me de una mano
Publicado por: bmb en 03 de Abril de 2013, 10:00:02
Hola, para borrar por ejemplo la segunda línea de un LCD de 2 x 16, como te sugiere AngelGris simplemente le envías los 16 caracteres en blanco así:

Código: [Seleccionar]
lcd_gotoxy(2,1);                  // Al inicio de la segunda línea del LCD
lcd_putc("                ");     // Imprime 16 espacios en blanco en el LCD

Sin embargo, no es muy recomendable borrar constantemente una línea completa y luego imprimir datos en el caso de estar mostrando otras cosas en la misma línea, ya que esto puede producir parpadeos indeseables.  Para esto, es mejor enviar todo el contenido de la segunda línea (los 16 caracteres) sin dejar espacios libres, por ejemplo:

Código: [Seleccionar]
lcd_gotoxy(2,1);                              // Ubicar cursor en la columna 1 de la segunda línea del LCD
printf(lcd_putc, "Valor: %Lu         ", A);   // Imprime 16 espacios en el LCD (Los caracteres de %Lu no se cuentan)

Hay también otras formas de enviar información al LCD sin producir parpadeos, que con la practica vas a conseguir luego.

Saludos!
Título: Re: contador lcd llega A 255 y se vuelve a 0 alguien que me de una mano
Publicado por: MGLSOFT en 03 de Abril de 2013, 11:31:38
Si declaras una variable de 32 bits, puedes hacerlo asi:

Código: C
  1. int32 A = 0;
Título: Re: contador lcd llega A 255 y se vuelve a 0 alguien que me de una mano
Publicado por: kapotik en 03 de Abril de 2013, 20:12:57
Che, que comen que saben tanto!!! ((:-))

Código: [Seleccionar]
lcd_gotoxy(2,1);                              // Ubicar cursor en la columna 1 de la segunda línea del LCD
printf(lcd_putc, "Valor: %Lu         ", A);   // Imprime 16 espacios en el LCD (Los caracteres de %Lu no se cuentan)

Funciona ok!!! :-/

ahora quisiera agregarle una ultima cosa a este contador, que me guarde la cuenta cuando le desconecto la corriente, y vuelva a contar desde donde se quedo, cuando lo vuelva a conectar.

tengo hecho esto pero no funciona

Código: [Seleccionar]
#include <16f84a.h>
#use delay(clock=4000000)
#fuses xt,nowdt,noprotect
#byte portb=6
#include <lcdb.c>

long long A=0;

void main(void)
{
lcd_init();                //Inicia LCD
lcd_putc(" Contador\n");   // Saca texto
lcd_putc(" Digital");      // Saca texto
delay_ms(2000);            // Retardo
lcd_putc("\f");            // Limpia pantalla
lcd_putc("Conteo\n");      //Saca texto

A = read_eeprom(0x00);   //Lee contador de la EEPROM
   if (A > 9)
   A= 0x00;               //Ajusta el contador si es mayor de 9

while(true)
{

if(input(pin_A0)==0) // Pregunta si RA0 es cero
{
A++;            // Incremento el conteo
delay_ms(1);  // Para visualizar correctamente el conteo

if(A>=9999999)      // Preguto si A es mayor o igual a 255,
{               // 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 (Los caracteres de %Lu no se cuentan)
write_eeprom(0x00,A);   //Lo salva en la EEPROM
}
}

Título: Re: contador lcd llega A 255 y se vuelve a 0 alguien que me de una mano
Publicado por: kapotik en 03 de Abril de 2013, 20:43:12
Correccion, si guarda en la eprom, pero solo hsta el 9, a partir del 10 ya no lo guarda,que sera?

Saludos
Título: Re: contador lcd llega A 255 y se vuelve a 0 alguien que me de una mano
Publicado por: kapotik en 03 de Abril de 2013, 20:51:44
Correccion, si guarda en la eprom, pero solo hsta el 9, a partir del 10 ya no lo guarda,que sera?

Saludos

ok ya lo arregle, el error era que le estaba diciendo que si era mayor a 9 pusiera a cero.

Quisiera saber si esta bien, ya que lo estoy simulando en proteus y a veces lo guarda bien y otras no, es decir que la cuenta la detuve en 345 y cuando lo vuelvo a arrancar empieza desde 86 y otras lo hace bien, no se si es un problema de la simulacion o del programa.

Código: [Seleccionar]
#include <16f84a.h>
#use delay(clock=4000000)
#fuses xt,nowdt,noprotect
#byte portb=6
#include <lcdb.c>

long long A=0;

void main(void)
{
lcd_init();                //Inicia LCD
lcd_putc(" Contador\n");   // Saca texto
lcd_putc(" Digital");      // Saca texto
delay_ms(2000);            // Retardo
lcd_putc("\f");            // Limpia pantalla
lcd_putc("Conteo\n");      //Saca texto

A = read_eeprom(0x00);   //Lee contador de la EEPROM
  

while(true)
{

if(input(pin_A0)==0) // Pregunta si RA0 es cero
{
A++;            // Incremento el conteo
delay_ms(1);  // Para visualizar correctamente el conteo

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

}
}



lcd_gotoxy(1,2);          //Acomoda cursor LCD
printf(lcd_putc, "FICHAS: %Lu         ", A);   // Imprime 16 espacios en el LCD (Los caracteres de %Lu no se cuentan)
write_eeprom(0x00,A);   //Lo salva en la EEPROM
}
}

saludos
Título: Re: contador lcd llega A 255 y se vuelve a 0 alguien que me de una mano
Publicado por: bmb en 03 de Abril de 2013, 21:01:01
Hola, recuerda que estás guardando una variable de 32 bits, entonces busca en la carpeta drivers del PICC una librería llamada internal_eeprom.c  Allí puedes ver la forma de guardar y recuperar datos de 32 bits de la EEPROM.  Debes incluir en el encabezado del programa:

Código: [Seleccionar]
#include <internal_eeprom.c>
Saludos!
Título: Re: contador lcd llega A 255 y se vuelve a 0 alguien que me de una mano
Publicado por: planeta9999 en 03 de Abril de 2013, 21:01:19



No puedes guardar un campo de 32 bits, en una dirección de memoria de un microcontrolador de 8bits.
Echale un vistazo a este post, que te lo aclara muy bien, con el uso de make8 y make32:
https://www.ccsinfo.com/forum/viewtopic.php?p=15000



Título: Re: contador lcd llega A 255 y se vuelve a 0 alguien que me de una mano
Publicado por: bmb en 03 de Abril de 2013, 21:06:51
No puedes guardar un campo de 32 bits, en una dirección de memoria de un microcontrolador de 8bits.
Echale un vistazo a este post, que te lo aclara muy bien, con el uso de make8 y make32:
https://www.ccsinfo.com/forum/viewtopic.php?p=15000

Hola planeta9999, el hilo al que haces referencia es del año 2002!  En la nuevas versiones de CCS se puede hacer usando la librería que menciono en el post anterior.

Saludos!
Título: Re: contador lcd llega A 255 y se vuelve a 0 alguien que me de una mano
Publicado por: kapotik en 03 de Abril de 2013, 21:20:14
No puedes guardar un campo de 32 bits, en una dirección de memoria de un microcontrolador de 8bits.
Echale un vistazo a este post, que te lo aclara muy bien, con el uso de make8 y make32:
https://www.ccsinfo.com/forum/viewtopic.php?p=15000

Hola planeta9999, el hilo al que haces referencia es del año 2002!  En la nuevas versiones de CCS se puede hacer usando la librería que menciono en el post anterior.

Saludos!

ya la inclui pero no entiendo cuales son los comandos para grabar y leer

hay un stored data y un write eprom, no no entiendo como usarlo

saludos
Título: Re: contador lcd llega A 255 y se vuelve a 0 alguien que me de una mano
Publicado por: bmb en 03 de Abril de 2013, 21:48:20
Hola kapotik, es parecido a lo que estás haciendo.  Según la hoja de datos del PIC16F84A, tiene 64 bytes de EEPROM y su dirección de inicio es 0x00 y termina en 0x3F.  Como habíamos dicho, pones en el encabezado la librería:

Código: [Seleccionar]
#include <internal_eeprom.c>
Para escribir pones la instrucción:

write_int32_eeprom(address, int32 data) que en tu caso sería: write_int32_eeprom(0x00, A)

Para leer pones la instrucción:

read_int32_eeprom(address) que en tu caso sería: read_int32_eeprom(0x00)

Recuerda tener en cuenta que al escribir un dato de 32 bits en la eeprom, te va a ocupar 4 bytes; por lo tanto si vas a escribir algún otro dato en la eeprom, debes utilizar la siguiente dirección libre, o sea, 0x04.

Saludos!
Título: Re: contador lcd llega A 255 y se vuelve a 0 alguien que me de una mano
Publicado por: kapotik en 04 de Abril de 2013, 11:38:35
muchachos hasta ahora funciona perfecto, lo unico es que cuando lo inicio por primera ves, el contador arranca en un valor, el mas alto de la cuenta, pero ya iniciado una ves ya no tiene probrema anda bien, calculo yo que es por que al iniciar el programa no estoy limpiando esa pocicion de memoria y tira lo que tiene?, pero si la clareara al inicio no me borraria luego los datos guardados?
espero que se entienda el planteo

saludos

edit: seria la solucion hacer un reset luego de leer la eeprom?, osea poner un pulsador y que al ser presionado poner la cuenta a cero? o hay otra manera mas "profecional" de hacerlo?
Título: Re: contador lcd llega A 255 y se vuelve a 0 alguien que me de una mano
Publicado por: planeta9999 en 04 de Abril de 2013, 12:09:42



Normalmente cuando grabas un PIC, todas las posiciones de memoria que no se utilizan se quedan con 0xFF (255 en decimal), comprueba las cuatro direcciones de la eeprom, y si las tienes con 0xFF, inicialízalas a 0x00.

Título: Re: contador lcd llega A 255 y se vuelve a 0 alguien que me de una mano
Publicado por: kapotik en 04 de Abril de 2013, 12:11:52



Normalmente cuando grabas un PIC, todas las posiciones de memoria que no se utilizan se quedan con 0xFF (255 en decimal), comprueba las cuatro direcciones de la eeprom, y si las tienes con 0xFF, inicialízalas a 0x00.



pero si la inicializo a 0x00 no voy a perder la cuenta cada ves que vuelva a conectar la tension?
Título: Re: contador lcd llega A 255 y se vuelve a 0 alguien que me de una mano
Publicado por: planeta9999 en 04 de Abril de 2013, 12:35:38



Normalmente cuando grabas un PIC, todas las posiciones de memoria que no se utilizan se quedan con 0xFF (255 en decimal), comprueba las cuatro direcciones de la eeprom, y si las tienes con 0xFF, inicialízalas a 0x00.



pero si la inicializo a 0x00 no voy a perder la cuenta cada ves que vuelva a conectar la tension?


Las inicializas a 0x00 SOLO si están a 0xFF.






Título: Re: contador lcd llega A 255 y se vuelve a 0 alguien que me de una mano
Publicado por: bmb en 04 de Abril de 2013, 17:18:22
... cuando lo inicio por primera ves, el contador arranca en un valor, el mas alto de la cuenta ...

Hola kapotik, me alegra que tu programa esté progresando.  No te entiendo muy bien lo que quieres decir.  Tal vez si pones el código podamos ver de que se trata.

Saludos!
Título: Re: contador lcd llega A 255 y se vuelve a 0 alguien que me de una mano
Publicado por: kapotik en 04 de Abril de 2013, 20:40:06
... cuando lo inicio por primera ves, el contador arranca en un valor, el mas alto de la cuenta ...

Hola kapotik, me alegra que tu programa esté progresando.  No te entiendo muy bien lo que quieres decir.  Tal vez si pones el código podamos ver de que se trata.

Saludos!

te adjunto una imagen y el codigo
pero la cuestion es que cuando inicializa por primera ves, no arranca en cero, despues si anda bien

(http://u.jimdo.com/www37/o/s355198e2595aa1c0/img/i534c488c3e22e803/1365118592/thumb/image.jpg)

Código: [Seleccionar]
#include <16f84a.h>
#use delay(clock=4000000)
#fuses xt,nowdt,noprotect
#byte portb=6
#include <lcdb.c>
#include <internal_eeprom.c>

int32 A = 0;

void main(void)
{
lcd_init();                //Inicia LCD
lcd_putc(" Inicializando\n");   // Saca texto
lcd_putc("El Equipo Aguarde");      // Saca texto
delay_ms(5000);            // Retardo
lcd_putc("\f");            // Limpia pantalla
lcd_putc("kapotik.\n");      //Saca texto



A = read_int32_eeprom(0x04);   //Lee contador de la EEPROM
  

while(true)
{

if(input(pin_A0)==0) // Pregunta si RA0 es cero
{
A++;            // Incremento el conteo
delay_ms(1);  // Para visualizar correctamente el conteo

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 (Los caracteres de %Lu no se cuentan)

write_int32_eeprom(0x04, A);

}
}
Título: Re: contador lcd llega A 255 y se vuelve a 0 alguien que me de una mano
Publicado por: bmb en 04 de Abril de 2013, 21:49:49
Hola, cuando dices: "cuando inicializa por primera ves, no arranca en cero" te refieres a la primera vez que echas a andar el PIC después de grabarlo? o a cuando lo energizas en cualquier momento...  No se como será el comportamiento de esto en Proteus, pero cuando quieres que un valor de la EEPROM se inicialice con el valor deseado la primera vez (me refiero a la primer encendida del PIC después de grabarlo) debes usar la directiva #ROM.  Por ejemplo si quisieras que los 4 pimeros bytes de la EEPROM en un PIC16F84A contuvieran los valores 4, 3, 2, y 1 entonces deberás utilizar en el encabezado del programa la directiva #ROM así:

Código: [Seleccionar]
#rom 0x00={4,3,2,1}
Esto lo que hace es poner esos valores en la EEPROM en el momento de grabar el PIC, y permanecerán allí hasta que el programa que has diseñado se encargue de cambiarlos.  Como veo que estás guardando los 4 bytes de tu dato de 32 bits a partir del quinto byte de la EEPROM, entonces para que la primera vez te aparezca en 0, puedes hacer algo así:

Código: [Seleccionar]
#rom 0x00={0,0,0,0,0,0,0,0}
Con esto estás iniciando los primeros 8 bytes de la EEPROM a 0.

Saludos!
Título: Re: contador lcd llega A 255 y se vuelve a 0 alguien que me de una mano
Publicado por: kapotik en 04 de Abril de 2013, 22:57:47
si es a la primera vez que lo hago andar despues de grabarlo.
probe lo que me dijiste pero sigue igual, te pego el codigo, lo unico que le cambie fue 0x00 por 0x04 por que sino me daba error con el 0x00.

Código: [Seleccionar]
#include <16f84a.h>
#use delay(clock=4000000)
#fuses xt,nowdt,noprotect
#byte portb=6
#rom 0x04 ={0,0,0,0,0,0,0,0}
#include <lcdb.c>
#include <internal_eeprom.c>



int32 A = 0;

void main(void)
{
lcd_init();                //Inicia LCD
lcd_putc(" Inicializando\n");   // Saca texto
lcd_putc("El Equipo Aguarde");      // Saca texto
delay_ms(5000);            // Retardo
lcd_putc("\f");            // Limpia pantalla
lcd_putc("kapotik.\n");      //Saca texto



A = read_int32_eeprom(0x04);   //Lee contador de la EEPROM
  

while(true)
{

if(input(pin_A0)==0) // Pregunta si RA0 es cero
{
A++;            // Incremento el conteo
delay_ms(1);  // Para visualizar correctamente el conteo

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 (Los caracteres de %Lu no se cuentan)

write_int32_eeprom(0x04, A);

}
}

saludos
Título: Re: contador lcd llega A 255 y se vuelve a 0 alguien que me de una mano
Publicado por: bmb en 05 de Abril de 2013, 10:35:37
Hola, el valor que te aparece inicialmente es el de la imagen que muestras en Proteus? Porque veo un número de 10 dígitos!  Si el LCD es de 16 caracteres, eso no debería pasar con estas instrucciones:

Código: C
  1. lcd_gotoxy(1,2);          //Acomoda cursor LCD
  2. printf(lcd_putc, "valor %Lu         ", A);   // Imprime 16 espacios en el LCD (Los caracteres de %Lu no se cuentan)

Verifica de cuantos caracteres es el LCD que tienes en la simulación, y ocupa todos los campos que sobren con caracteres en blanco para que no te aparezcan números extraños.

Que error te da cuando usas 0x00 con la directiva #ROM?  Es posible que 0x00 no sea la dirección de inicio de la EEPROM del PIC16F84A (no he trabajado nunca la EEPROM con ese PIC), por lo que habrá que investigar sobre este tema.

Saludos!
Título: Re: contador lcd llega A 255 y se vuelve a 0 alguien que me de una mano
Publicado por: bmb en 05 de Abril de 2013, 11:31:16
Hola, estuve investigando y parece que con ese PIC se debe usar la directiva #ROM así:

Código: C
  1. #include <16f84a.h>
  2. #fuses xt,nowdt,noprotect
  3. #use delay(clock=4000000)
  4.  
  5. #byte portb=6
  6. #rom 0x2100 = {0,0,0,0}
  7.  
  8. #include <lcd.c>
  9. #include <internal_eeprom.c>
  10.  
  11. int32 A = 0;
  12.  
  13. void main(void)
  14. {
  15.    lcd_init();                      // Inicia LCD
  16.    lcd_putc(" Inicializando\n");    // Saca texto
  17.    lcd_putc("El Equipo Aguarde");   // Saca texto
  18.    delay_ms(5000);                  // Retardo
  19.    lcd_putc("\f");                  // Limpia pantalla
  20.    lcd_putc("kapotik.\n");          // Saca texto
  21.  
  22.    A = read_int32_eeprom(0x00);     // Lee contador de la EEPROM
  23.  
  24.  
  25.    while(true)
  26.    {
  27.       if(input(pin_A0)==0)          // Pregunta si RA0 es cero
  28.       {
  29.          A++;                       // Incremento el conteo
  30.          delay_ms(1);               // Para visualizar correctamente el conteo
  31.  
  32.          if(A>=9999999)             // Preguto si A es mayor o igual a 9999999,
  33.          {                          // cuando sea igual iguala "A" a cero
  34.             A=0;  
  35.          }
  36.       }
  37.  
  38.       lcd_gotoxy(1,2);                             // Acomoda cursor LCD
  39.       printf(lcd_putc, "valor %Lu         ", A);   // Imprime 16 espacios en el LCD (Los caracteres de %Lu no se cuentan)
  40.  
  41.       write_int32_eeprom(0x00, A);
  42.    }
  43. }

Ensáyalo así y nos cuentas.

Saludos!
Título: Re: contador lcd llega A 255 y se vuelve a 0 alguien que me de una mano
Publicado por: kapotik en 05 de Abril de 2013, 14:00:57
hola bmb, gracias por tu ayuda, si en la simulacion el lcd es de 2x16 si te fijas tiene la palabra "valor" que suma 5 digitos, un espacio en blanco, ya son 6 y los 10 numeros suma 16.

simule el codigo que me dejaste, pero no inicializa, en el display no visualiza nada, no hace nada de nada.
Me parece que este pic el 84a es un poco limitado estoy pensando en migrar el codigo al 16f628a casi igual al 84a pero con muchas mas cosas, por ay a el 16f628a lo conoscas mas.

saludos
Título: Re: contador lcd llega A 255 y se vuelve a 0 alguien que me de una mano
Publicado por: bmb en 05 de Abril de 2013, 16:20:55
Hola kapotik, leyendo el manual de CCS dice que si se debe iniciar la directiva #ROM como te había dicho:

Código: [Seleccionar]
#rom 0x2100 = {0,0,0,0}
Pero el problema puede ser por varias causas.  Si copiaste el código tal cual te lo pase, seguramente no te va a funcionar porque si miras bien, estoy usando la librería del LCD propia de CCS y no la que estás usamdo.  Pero el problema más grave que veo es que la instrucción:

Código: [Seleccionar]
write_int32_eeprom(0x00, A);
Está dentro del ciclo while(), y eso destruiría en pocos segundos la memoria EEPROM en un PIC verdadero, ya que estos tienen un número limitado de grabaciones/lecturas (10,000,000 según la hoja de datos).  Debes poner una condicional para hacer la grabación solamente cuando cambie el valor del dato y no cada ciclo de programa como está ahora.  También estaba a punto de recomendarte que te cambiaras a otro PIC con mejores prestaciones ya que el que estás utilizando está algo anticuado.  Si te fuera posible subir el archivo de simulación de Proteus, podemos examinar mejor el problema.

Saludos!
Título: Re: contador lcd llega A 255 y se vuelve a 0 alguien que me de una mano
Publicado por: bmb en 05 de Abril de 2013, 18:48:01
Bueno, tuve un rato libre ahora y le hice unas pequeñas variaciones al programa para comprobar el funcionamiento de las instrucciones para grabar y leer la EEPROM y también hice la simulación en Proteus.  Efectivamente como te había indicado, se inicia correctamente la directiva #ROM.  También pude ver que el Proteus no guarda nada en la EEPROM al apagar la simulación, o no se como hacerlo...  :shock:  porque cada que inicio la simulación aparece el primer valor en 0, pero como podrás ver en el código lo que aparece como valor está siendo leído directamente de la EEPROM.  Aquí estoy usando la librería propia de LCD del CCS. Te dejo los archivos.

Código: C
  1. #include <16f84a.h>
  2. #fuses xt,nowdt,noprotect
  3. #use delay(clock=4000000)
  4.  
  5. #byte portb=6
  6. #rom 0x2100 ={0,0,0,0}
  7.  
  8. #define LCD_ENABLE_PIN  PIN_B1
  9. #define LCD_RS_PIN      PIN_B2
  10. #define LCD_RW_PIN      PIN_B3
  11. #define LCD_DATA4       PIN_B4
  12. #define LCD_DATA5       PIN_B5
  13. #define LCD_DATA6       PIN_B6
  14. #define LCD_DATA7       PIN_B7
  15.  
  16. #include <lcd.c>
  17. #include <internal_eeprom.c>
  18.  
  19. int32 A = 0, B = 0;
  20. int1 boton = false;
  21.  
  22. void main(void)
  23. {
  24.    lcd_init();                      // Inicia LCD
  25.    lcd_putc(" Inicializando\n");    // Saca texto
  26.    lcd_putc("El Equipo Aguarde");   // Saca texto
  27.    delay_ms(500);                   // Retardo
  28.    lcd_putc("\f");                  // Limpia pantalla
  29.    lcd_putc("kapotik.\n");          // Saca texto
  30.  
  31.    A = read_int32_eeprom(0x00);     // Lee contador de la EEPROM
  32.  
  33.  
  34.    while(true)
  35.    {
  36.       if(!input(pin_A0) && !boton)  // Pregunta si RA0 es cero
  37.       {
  38.          A++;                       // Incremento el conteo
  39.          boton = true;
  40.          write_int32_eeprom(0x00, A);
  41.       }
  42.       if(input(pin_A0))
  43.          boton = false;             // Al soltar el Boton...
  44.  
  45.       if(A>=9999999)             // Preguto si A es mayor o igual a 9999999,
  46.       {                          // cuando sea igual iguala "A" a cero
  47.          A=0;  
  48.       }
  49.  
  50.       B = read_int32_eeprom(0x00);
  51.       lcd_gotoxy(1,2);                             // Acomoda cursor LCD
  52.       printf(lcd_putc, "valor %Lu         ", B);   // Imprime 16 espacios en el LCD (Los caracteres de %Lu no se cuentan)
  53.    }
  54. }

Saludos!
Título: Re: contador lcd llega A 255 y se vuelve a 0 alguien que me de una mano
Publicado por: kapotik en 06 de Abril de 2013, 00:59:56
Citar
Proteus no guarda nada en la EEPROM al apagar la simulación, o no se como hacerlo... 

que bueno que despues de tanta ayuda que me has dado, te pueda devolver algo, aunque se pequeñito!!!

Proteus si simula el guardado de la eproom, para ello hay que crear un archivo con extencion .bin, cualquiera sea el nombre, pero con la extencion .bin, para crearlo simplemente abrir el block de notas, y sin colocar nada dentro darle guardar como, colocarle el nombre que mas nos paresca, por ejemplo lcd.bin, y guardarlo en la carpeta donde tengamos los demas archivos, (se puede guardar en cualquier lugar del computador pero yo lo coloco alli por cuestion de organizacion),  adjunto imagen.

(http://u.jimdo.com/www37/o/s355198e2595aa1c0/img/i8e841a6b8d50de96/1365219757/thumb/image.jpg)

luego vamos al proteus hacemos doble click sobre el microprocesador vamos a donde dice propiedades avansadas y buscamos "initial contents EEPROM"

(http://u.jimdo.com/www37/o/s355198e2595aa1c0/img/i48820712d67ed4ee/1365219725/thumb/image.jpg)

despues al lado derecho nos aparece una carpeta para buscar nuestro archivo bin

(http://u.jimdo.com/www37/o/s355198e2595aa1c0/img/ib5818386a553363b/1365219694/thumb/image.jpg)

y listo esto lo hacemos una sola ves, no hay que hacerlo nuevamente si cerramos y volvemos abrir el proteus.


Título: Re: contador lcd llega A 255 y se vuelve a 0 alguien que me de una mano
Publicado por: kapotik en 06 de Abril de 2013, 01:10:04
hola bmb, simule el codigo y no me esta guardando el dato en la eeprom

pregunto, y hablo sin entender como lo estas usando, pero le colocaste una "B" al grabado de la eeprom

Código: [Seleccionar]
B = read_int32_eeprom(0x00);
y cuando inicializa le estas diciendo que "B" es cero?

Código: [Seleccionar]
int32 A = 0, B = 0;
o yo lo estoy interpretando mal, por que sino en cada inicio pone a cero B, perdiendo el dato guardado
podrias explicarme como lo as usado

Saludos
Título: Re: contador lcd llega A 255 y se vuelve a 0 alguien que me de una mano
Publicado por: AngelGris en 06 de Abril de 2013, 09:20:28
Por lo que yo veo, B es una variable y la utiliza para leer la EEPROM. Al menos con la instrucción que tu muestras kapotik
Título: Re: contador lcd llega A 255 y se vuelve a 0 alguien que me de una mano
Publicado por: bmb en 06 de Abril de 2013, 10:02:40
hola bmb, simule el codigo y no me esta guardando el dato en la eeprom

pregunto, y hablo sin entender como lo estas usando, pero le colocaste una "B" al grabado de la eeprom

Código: [Seleccionar]
B = read_int32_eeprom(0x00);
y cuando inicializa le estas diciendo que "B" es cero?

Código: [Seleccionar]
int32 A = 0, B = 0;
o yo lo estoy interpretando mal, por que sino en cada inicio pone a cero B, perdiendo el dato guardado
podrias explicarme como lo as usado

Saludos

Hola kapotik, muchas gracias por la explicación.  Es como te dice AngelGris, como este es solo un código de prueba, en la variable B almaceno el dato que leo en la EEPROM y lo hago así solamente para comprobar que el dato en A ha sido guardando correctamente.  Es una buena práctica de programación inicializar las variables ya que si no lo haces pueden tener en el inicio algún valor aleatorio, pero como puedes ver, en este caso el código se encarga de darles sus valores antes de mostrar algo en la LCD, por lo que finalmente lo que se muestra en pantalla es el valor de la EEPROM.  Más tarde voy a ensayar lo que me explicaste y a hacer unos cambios en el código para ver que pasa y te comento.

Saludos!
Título: Re: contador lcd llega A 255 y se vuelve a 0 alguien que me de una mano
Publicado por: bmb en 06 de Abril de 2013, 11:25:29
Hola kapotik, hice lo que me explicaste, pero veo que es el Proteus el que no está haciendo nada con ese archivo, pues en ningún momento accede a el para escritura.  Creo que esa opción que me diste es solo para tomar los datos iniciales de la EEPROM, pero nada más.  Según la ayuda del VSM, al guardar la sesión se deberían guardar los datos de la EEPROM, pero en este caso no hace nada.  Lo que hice entonces, fue utilizar la opción Debug del Proteus y al simular el programa paso a paso, puedo ver que graba muy bien los datos en la ventana de la EEPROM.  Te adjunto nuevamente el programa con unas correcciones y el archivo de Proteus.  Le adicione a la simulación un switch manual para poder activarlo sin salir del modo Debug.

Saludos!
Título: Re: contador lcd llega A 255 y se vuelve a 0 alguien que me de una mano
Publicado por: kapotik en 06 de Abril de 2013, 14:31:08
Hola kapotik, hice lo que me explicaste, pero veo que es el Proteus el que no está haciendo nada con ese archivo, pues en ningún momento accede a el para escritura.  Creo que esa opción que me diste es solo para tomar los datos iniciales de la EEPROM, pero nada más.  Según la ayuda del VSM, al guardar la sesión se deberían guardar los datos de la EEPROM, pero en este caso no hace nada.  Lo que hice entonces, fue utilizar la opción Debug del Proteus y al simular el programa paso a paso, puedo ver que graba muy bien los datos en la ventana de la EEPROM.  Te adjunto nuevamente el programa con unas correcciones y el archivo de Proteus.  Le adicione a la simulación un switch manual para poder activarlo sin salir del modo Debug.

Saludos!

Para salir de dudas voy a armar el circuito real y probarlo, luego te comento que hace.

saludos
Título: Re: contador lcd llega A 255 y se vuelve a 0 alguien que me de una mano
Publicado por: kapotik en 07 de Abril de 2013, 16:50:47
Bueno una imagen vale por mil palabras, y si es un video? :D



que opinan?
Título: Re: contador lcd llega A 255 y se vuelve a 0 alguien que me de una mano
Publicado por: bmb en 07 de Abril de 2013, 18:49:13
Muy bien! Felicitaciones!  Habrá que estudiar un poco más el Proteus, que seguramente tendrá su modo de hacerlo.  Que grabador utilizas?  Sería ideal que no tuvieras que sacar el PIC de la protoboard para grabarlo.  Hay PICs que facilitan un poco más que el PIC16F84A la programación 'ICSP'

Saludos!
Título: Re: contador lcd llega A 255 y se vuelve a 0 alguien que me de una mano
Publicado por: kapotik en 07 de Abril de 2013, 19:48:13
Muy bien! Felicitaciones!  Habrá que estudiar un poco más el Proteus, que seguramente tendrá su modo de hacerlo.  Que grabador utilizas?  Sería ideal que no tuvieras que sacar el PIC de la protoboard para grabarlo.  Hay PICs que facilitan un poco más que el PIC16F84A la programación 'ICSP'

Saludos!

Gracias, pero no ubiera sido posible sin tu ayuda y la de los demas!!!
el grabador es un pickit clone 2, tiene tambien modo ICSP pero la prueba la hize en el laburo y me habia olvidado el cable ICSP

Voy a migrar todo el codigo al 16F628a, en cuanto llegue a casa lo migro, aca no tengo ninguno para probar.

Amigo bmb no quiero ser abusivo, pero seria posible que me explicara como hacer un scroll en la primera linea del lcd?
para poder pasar mas de 16 caracteres.

Gracias
Saludos
Título: Re: contador lcd llega A 255 y se vuelve a 0 alguien que me de una mano
Publicado por: MGLSOFT en 07 de Abril de 2013, 20:13:44
Felicitaciones !!
Hay una instrucción para el LCD que mueve el texto n posiciones a la izquierda o derecha.
Ya lo tratamos en varios lugares, si puedes hacer una búsqueda el el subforo de C, con scroll como clave, seguro encontraras lo que necesitas, sino avisa...

Me quede con la espina y te lo busque...

http://www.todopic.com.ar/foros/index.php?topic=5772.msg31490#msg31490 (http://www.todopic.com.ar/foros/index.php?topic=5772.msg31490#msg31490)
Título: Re: contador lcd llega A 255 y se vuelve a 0 alguien que me de una mano
Publicado por: bmb en 07 de Abril de 2013, 20:36:40
Hola kapotik, muchas gracias!  Alguna vez he tenido que hacer un scroll en una LCD y como te sugiere MGLSOFT, es fácil de implementar y me he guiado por los ejemplos sacados de aquí del foro.

Saludos!
Título: Re: contador lcd llega A 255 y se vuelve a 0 alguien que me de una mano
Publicado por: kapotik en 07 de Abril de 2013, 21:16:34
Felicitaciones !!
Hay una instrucción para el LCD que mueve el texto n posiciones a la izquierda o derecha.
Ya lo tratamos en varios lugares, si puedes hacer una búsqueda el el subforo de C, con scroll como clave, seguro encontraras lo que necesitas, sino avisa...

Me quede con la espina y te lo busque...

http://www.todopic.com.ar/foros/index.php?topic=5772.msg31490#msg31490 (http://www.todopic.com.ar/foros/index.php?topic=5772.msg31490#msg31490)

lo e estado probando pero o yo soy muy bruto o no es lo que quiero hacer, por que me desplaza el texto hacia la derecha por ejemplo, pero ademas de que cuando llega al ultimo caracter se queda alli, tambien me dezplasa la segunda linea y ya no se me ve el contador.
Lo que me gustaria hacer es que estando en la segunda linea el contador en la primera pase infinitamente de derecha a izquierda un texto, pero que este siempre en movimiento.

saludos
Título: Re: contador lcd llega A 255 y se vuelve a 0 alguien que me de una mano
Publicado por: bmb en 07 de Abril de 2013, 22:03:40
Hola kapotik, fíjate en este (http://www.todopic.com.ar/foros/index.php?topic=4530.msg38916#msg38916), creo que es fácil ajustarlo para lo que necesitas.

Saludos!
Título: Re: contador lcd llega A 255 y se vuelve a 0 alguien que me de una mano
Publicado por: kapotik en 08 de Abril de 2013, 09:36:11
Hola kapotik, fíjate en este (http://www.todopic.com.ar/foros/index.php?topic=4530.msg38916#msg38916), creo que es fácil ajustarlo para lo que necesitas.

Saludos!

Hola,con ese me salio algo, pero me perjudica al contador, a veces cuando se presiona el pulsador para la cuenta no lo toma, me llamo la atencion de que cuando compila se ocupa el 90% de la rom, es normal?

Código: [Seleccionar]
#include <16f84a.h>
#fuses xt,nowdt,noprotect
#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, B = 0;
int1 boton = false;

void main(void)
{
   char y=1;               //indice columnas
   signed char x=1;         //indice filas
   lcd_init();                      // Inicia LCD
   lcd_putc("Inicializando el\n");  // Saca texto
   lcd_putc("Equipo Aguarde  ");    // Saca texto
   delay_ms(500);                   // Retardo
   lcd_putc("\f");                  // Limpia pantalla
   

   A = read_int32_eeprom(0x00);     // Lee contador de la EEPROM
   B = read_int32_eeprom(0x00);

   while(true)
   {
   {
   lcd_gotoxy(x,y);      //cursor para escribir mensaje
      lcd_putc("kapotik.kapotik.kapotik.kapotik");   //muestra por pantalla el mensaje
      delay_ms(250);         
      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_putc("\f");         //borra pantalla 
      }            //...infinito
   
      if(!input(pin_A0) && !boton)  // Pregunta si RA0 es cero
      {
         A++;                       // Incremento el conteo
         boton = true;
         write_int32_eeprom(0x00, A);
         delay_ms(50);
         B = read_int32_eeprom(0x00);         
      }

      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         ", B);   // Imprime 16 espacios en el LCD
   }
}
Título: Re: contador lcd llega A 255 y se vuelve a 0 alguien que me de una mano
Publicado por: bmb en 08 de Abril de 2013, 10:39:02
Hola kapotik, en cuanto tenga un momento libre voy a revisar el programa a ver que veo.  En cuanto a lo del uso de la rom, recuerda que la variable B era solo para probar, por lo que la debes eliminar del programa y usar solo la variable A.  De todos modos debes pensar en cambiar de PIC por uno con más capacidad de memoria.

Saludos!
Título: Re: contador lcd llega A 255 y se vuelve a 0 alguien que me de una mano
Publicado por: kapotik en 08 de Abril de 2013, 10:54:14
Hola kapotik, en cuanto tenga un momento libre voy a revisar el programa a ver que veo.  En cuanto a lo del uso de la rom, recuerda que la variable B era solo para probar, por lo que la debes eliminar del programa y usar solo la variable A.  De todos modos debes pensar en cambiar de PIC por uno con más capacidad de memoria.

Saludos!

hola bmb, pero me empezo a salir cuando adicione el scroll, de todos modos que ocupe mucho perjudica a la funcion de grabado en la eeprom?, no verdad?, por que lo que realmente me interesa es la funcion del contador y que sea muy estable ya que lo que cuenta no puede tener fallas, todo lo demas es puramente visual y para que quede lindo, ademas de aprender algo mas de este lenguaje.
mas tarde voy a migrar el codigo al 16f628a, que es casi igual a este pero el doble de memoria, luego posteo los avances.

saludos

edit:

se me hizo un buequito y lo migre al 16f628a les dejo los archivos incluidos los del proteus, logicamente con este pic se fue la advertencia de poca rom, lo heche a andar en circuito real y como comente antes el contador pierde pulsaciones ademas de que las visualizaciones que deverian estar fijas parpadean, sigo intentando y les comento  :)

Título: Re: contador lcd llega A 255 y se vuelve a 0 alguien que me de una mano
Publicado por: bmb en 08 de Abril de 2013, 11:47:20
Si eliminas la variable B vas a ver la cantidad de rom que ganas, aunque es verdad que ese PIC tiene muy poca memoria.

Saludos!

Edit: acabo de compilar el programa sin la variable B y no es gran cosa lo que se recupera de memoria!!!  :oops:

Saludos!
Título: Re: contador lcd llega A 255 y se vuelve a 0 alguien que me de una mano
Publicado por: bmb en 08 de Abril de 2013, 19:00:02
OK, ya puede ver tu programa y efectivamente se pierden pulsaciones.  Esto es debido a esta instrucción:

Código: [Seleccionar]
delay_ms(250);
Cuando esa instrucción está activa (contando su tiempo), ninguna otra instrucción funciona, (excepto las interrupciones).  Vas a tener que eliminar esa instrucción y utilizar la interrupción de uno de los Timers del PIC para contar los 250 mSeg.  Allí activas una bandera que vas a aplicar a una condicional (por ejemplo if) para hacer el avance del letrero en la pantalla y luego de esto desactivarla para esperar otra interrupción.

Saludos!
Título: Re: contador lcd llega A 255 y se vuelve a 0 alguien que me de una mano
Publicado por: kapotik en 08 de Abril de 2013, 20:02:29
OK, ya puede ver tu programa y efectivamente se pierden pulsaciones.  Esto es debido a esta instrucción:

Código: [Seleccionar]
delay_ms(250);
Cuando esa instrucción está activa (contando su tiempo), ninguna otra instrucción funciona, (excepto las interrupciones).  Vas a tener que eliminar esa instrucción y utilizar la interrupción de uno de los Timers del PIC para contar los 250 mSeg.  Allí activas una bandera que vas a aplicar a una condicional (por ejemplo if) para hacer el avance del letrero en la pantalla y luego de esto desactivarla para esperar otra interrupción.

Saludos!

mmm.... me parece que lo voy a dejar asi, que se quede fijo, sacrifico bonito por utilidad :?
no me da el conocimiento en este lenguaje para hacer algo asi todavia :5]

saludos
Título: Re: contador lcd llega A 255 y se vuelve a 0 alguien que me de una mano
Publicado por: bmb en 08 de Abril de 2013, 20:10:41
Es fácil, más tarde te pongo un ejemplo.

saludos!
Título: Re: contador lcd llega A 255 y se vuelve a 0 alguien que me de una mano
Publicado por: kapotik en 08 de Abril de 2013, 20:19:10
Es fácil, más tarde te pongo un ejemplo.

saludos!

ok, espero.

Gracias por tu ayuda bmb
Título: Re: contador lcd llega A 255 y se vuelve a 0 alguien que me de una mano
Publicado por: bmb en 08 de Abril de 2013, 20:48:24
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!
Título: Re: contador lcd llega A 255 y se vuelve a 0 alguien que me de una mano
Publicado por: kapotik 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
Título: Re: contador lcd llega A 255 y se vuelve a 0 alguien que me de una mano
Publicado por: bmb 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 (http://www.ccsinfo.com/downloads/ccs_c_manual.pdf), puedes ver el uso correcto de printf().

Saludos!
Título: Re: contador lcd llega A 255 y se vuelve a 0 alguien que me de una mano
Publicado por: kapotik 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 (http://www.ccsinfo.com/downloads/ccs_c_manual.pdf), 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
Título: Re: contador lcd llega A 255 y se vuelve a 0 alguien que me de una mano
Publicado por: MGLSOFT 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 (http://www.ccsinfo.com/downloads/ccs_c_manual.pdf), 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...
Título: Re: contador lcd llega A 255 y se vuelve a 0 alguien que me de una mano
Publicado por: bmb 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!
Título: Re: contador lcd llega A 255 y se vuelve a 0 alguien que me de una mano
Publicado por: kapotik 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
Título: Re: contador lcd llega A 255 y se vuelve a 0 alguien que me de una mano
Publicado por: bmb 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!
Título: Re: contador lcd llega A 255 y se vuelve a 0 alguien que me de una mano
Publicado por: kapotik 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 !!!!
Título: Re: contador lcd llega A 255 y se vuelve a 0 alguien que me de una mano
Publicado por: bmb 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!
Título: Re: contador lcd llega A 255 y se vuelve a 0 alguien que me de una mano
Publicado por: kapotik 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
Título: Re: contador lcd llega A 255 y se vuelve a 0 alguien que me de una mano
Publicado por: kapotik 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
Título: Re: contador lcd llega A 255 y se vuelve a 0 alguien que me de una mano
Publicado por: bmb en 10 de Abril de 2013, 11:27:20
Hola kapotik y el código?

Saludos!
Título: Re: contador lcd llega A 255 y se vuelve a 0 alguien que me de una mano
Publicado por: kapotik 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
   }

}
Título: Re: contador lcd llega A 255 y se vuelve a 0 alguien que me de una mano
Publicado por: bmb 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!!!   :)
Título: Re: contador lcd llega A 255 y se vuelve a 0 alguien que me de una mano
Publicado por: kapotik 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
Título: Re: contador lcd llega A 255 y se vuelve a 0 alguien que me de una mano
Publicado por: bmb 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!
Título: Re: contador lcd llega A 255 y se vuelve a 0 alguien que me de una mano
Publicado por: kapotik 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
Título: Re: contador lcd llega A 255 y se vuelve a 0 alguien que me de una mano
Publicado por: bmb 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!
Título: Re: contador lcd llega A 255 y se vuelve a 0 alguien que me de una mano
Publicado por: kapotik 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
Título: Re: contador lcd llega A 255 y se vuelve a 0 alguien que me de una mano
Publicado por: bmb 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!
Título: Re: contador lcd llega A 255 y se vuelve a 0 alguien que me de una mano
Publicado por: BrunoF 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.
Título: Re: contador lcd llega A 255 y se vuelve a 0 alguien que me de una mano
Publicado por: bmb 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!
Título: Re: contador lcd llega A 255 y se vuelve a 0 alguien que me de una mano
Publicado por: BrunoF 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!
Título: Re: contador lcd llega A 255 y se vuelve a 0 alguien que me de una mano
Publicado por: kapotik 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
Título: Re: contador lcd llega A 255 y se vuelve a 0 alguien que me de una mano
Publicado por: hector915 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:
Título: Re: contador lcd llega A 255 y se vuelve a 0 alguien que me de una mano
Publicado por: kapotik 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
Título: Re: contador lcd llega A 255 y se vuelve a 0 alguien que me de una mano
Publicado por: MLO__ 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

Título: Re: contador lcd llega A 255 y se vuelve a 0 alguien que me de una mano
Publicado por: kapotik 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