TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: ramirez en 23 de Junio de 2009, 11:30:26

Título: Guardar serie de fibonacci en eeprom y ver en LCD
Publicado por: ramirez en 23 de Junio de 2009, 11:30:26
Buenas tardes a todos, sigo en mi intento de aprender C, y  ahora estoy intentando hacer un ejemplo donde guarde la serie de fibonacci (0,1, 1, 2, 3, 5,8, 13....)(el número siguiente es la suma de los dos anteriores) en una eeprom externa y luego los pueda visualizar en un LDC. Adjunto están los ficheros, y como podéis ver no funciona correctamente. ¿Qué errores estoy cometiendo?

Otra vez más gracias por vuestra ayuda.
Título: Re: Guardar serie de fibonacci en eeprom y ver en LCD
Publicado por: Nocturno en 23 de Junio de 2009, 11:51:43
No veo errores en el código fuente, pero no tengo Proteus para poder simularlo. ¿Puedes describir el fallo o pegar un pantallazo del resultado?
Título: Re: Guardar serie de fibonacci en eeprom y ver en LCD
Publicado por: ramirez en 23 de Junio de 2009, 12:14:48
En el programa hay dos errores, uno que es como se visualiza en la pantalla los mensajes, ya que veo de forma intermitenta "Escribiendo en ...." y Fin de escritua...", y lo que desearía es que se viera en pantalla primero "Escribiendo en..", y cuando estén todos los datos escritos un mensaje final de "Fin de escritura..".

El segundo error es que no dan los datos reales de la serie, ya que sale: 0, 1, 2, 5,11, 19, 39, 3, -128,0 28, 1 8, 0 8, ........ Como podeis ver al final (en los últimos números), creo que el 8 se queda en pantalla del número anterior, y se debería de borrar.
Título: Re: Guardar serie de fibonacci en eeprom y ver en LCD
Publicado por: Suky en 23 de Junio de 2009, 12:15:28
Cual es la falla? Has colocado las resistencias pull-up a la memoria? Después hay un error que en la simulación no traerá problemas, pero si al armarlo. Estas definiendo el oscilador como HS y debería ser XT por usar un cristal de 4MHz.
Título: Re: Guardar serie de fibonacci en eeprom y ver en LCD
Publicado por: Suky en 23 de Junio de 2009, 12:18:52
El parpadeo no veo porque pueda ser, luego que se vea el 8, queda de 128. Agrégale un espacio más en Fibo= %d así te borra ese 8.
Título: Re: Guardar serie de fibonacci en eeprom y ver en LCD
Publicado por: ramirez en 23 de Junio de 2009, 12:25:20
Muchas gracias, ¿pero qué opinas sobre que no se graban los números adecuados en cada posición de memoria?
Título: Re: Guardar serie de fibonacci en eeprom y ver en LCD
Publicado por: Suky en 23 de Junio de 2009, 12:42:22
Para que no se vea la intermitencia entre mensajes, esta parte del código tiene que ir dentro de un for:  :shock: Editado, me equivoque  :mrgreen: Ya esta en un for!



Para que de correcta la serie tienes que invertir esta parte:
Código: C
  1. suman2=valor;
  2.    suman1=suman2;

Debe ir:
Código: C
  1. suman1=suman2;
  2.    suman2=valor;

Título: Re: Guardar serie de fibonacci en eeprom y ver en LCD
Publicado por: Nocturno en 23 de Junio de 2009, 12:56:16
He descubierto otro error, después de
 case 2:
         valor=suman1+suman2;
         write_ext_eeprom(dir,valor);

debería haber un break, porque de lo contrario te ejecutará el trozo que está en la sección default.
Título: Re: Guardar serie de fibonacci en eeprom y ver en LCD
Publicado por: ramirez en 23 de Junio de 2009, 13:24:17
Deben de existir más errores, ya que aún no funiona correctamente. Gracias de nuevo por el interés que estáis mostrando
Título: Re: Guardar serie de fibonacci en eeprom y ver en LCD
Publicado por: Suky en 23 de Junio de 2009, 14:15:12
Cuales son lo problemas que tiene?
Encontré otro, este mensaje:
Código: C
  1. lcd_putc("\f~ Escribiendo en...\n24LC256\n");
Debe ir antes del primer for, por eso las titilaciones del mensaje.

Luego, este fuera del primer for:
Código: C
  1. lcd_putc("\fFin de escritura en\n24LC25");
  2.          delay_ms(150);

Bueno, como ves lo único que falta es concentración al escribir el código :wink:
Título: Re: Guardar serie de fibonacci en eeprom y ver en LCD
Publicado por: ramirez en 23 de Junio de 2009, 14:30:25
Los valores que se obtienen de la serie son: 0,1,1,3, 3,15, 11, ......, y estos valores no corresponen con la serie de fibonacci
Título: Re: Guardar serie de fibonacci en eeprom y ver en LCD
Publicado por: Suky en 23 de Junio de 2009, 15:25:51
Hicistes el cambio:
Código: C
  1. suman1=suman2;
  2.    suman2=valor;

Yo probé si se genera bien la serie y lo realiza correctamente. Tienes que cambiar a %u para que muestre el byte sin signo, sino como máximo podrás mostrar hasta 127, después ya lo tomará como un numero negativo. Y como utilizas 8 bits, podrás mostrar un numero inferior a 255.


Título: Re: Guardar serie de fibonacci en eeprom y ver en LCD
Publicado por: ramirez en 24 de Junio de 2009, 11:22:16
Hola de nuevo, aún no sale la serie correcta, ya que obtengo: 0, 1, 1, 2, 3, 5, 8, 23, 27, 79, 47, 119, 145......, y como veis a partir del 8 comienza a fallar. La última versión es la siguiente:

/////////////////////////////////////////////////////////////////////////////////
////////////   SERIE FIBONACCI    //////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
///  0, 1, 1, 2, 3, 5, 8 ........                                            ///

#include <16f648a.h>            //pic a utilizar
#use delay(CLOCK=4000000)         //Fosc=4Mhz
#fuses XT,NOPUT,NOPROTECT,NOBROWNOUT,NOLVP,NOWDT   //comandos para el programador
#define use_portb_lcd TRUE         //utilizar el port b para lcd
#define EEPROM_SDA PIN_A1          //definimos los pines donde...
#define EEPROM_SCL PIN_A0          //la eeprom ira conectada
#include <24256.c>               //libreria de eeprom externa 24LC256
#include <lcd.c>                //libreria de lcd

///PROGRAMA
void main(void){

   int dir;               //direccion de eeprom a escribir y leer mensajes
   int a;
   int valor=0;
   int suman1=0;
   int suman2=1;
   int leido=0;

   lcd_init();             //inicializa lcd
   init_ext_eeprom();          //inicializa eeprom

   lcd_putc("\f~ Escribiendo en...\n24LC256\n");
   delay_ms(100);
   
 for(dir=0;dir<20;dir++)
   {
   
switch(dir){
   case 0:
         write_ext_eeprom(dir,suman1);
         break;
   case 1:
         write_ext_eeprom(dir,suman2);
         break;
   case 2:
         valor=suman1+suman2;
         write_ext_eeprom(dir,valor);
         break;

   Default:

   suman1=suman2;
   suman2=valor;
   valor=suman1+suman2;
   write_ext_eeprom(dir,valor);      //proceso de escribir...


   }
   
   }
   
   lcd_putc("\fFin de escritura en\n24LC256");
   delay_ms(1500);
   lcd_putc("\f>>>Leyendo...\n");
   
    for(a=0;a<20;a++)   {   //bucle para leer mensajes en eeprom externa y muestra por lcd
   leido=read_ext_eeprom(a);

      printf(lcd_putc,"\n %d ~ Fibo=  %u ",a,leido);
      delay_ms(1000);                  //retraso para que se vea en pantalla los mensajes
   }
   output_a(0b00);                     //apago port a
   lcd_putc("\fFin de lectura!");




      }                        //...final


Gracias otra vez por vuestro interés y colaboración
Título: Re: Guardar serie de fibonacci en eeprom y ver en LCD
Publicado por: Suky en 24 de Junio de 2009, 11:37:02
Hola de nuevo, aún no sale la serie correcta, ya que obtengo: 0, 1, 1, 2, 3, 5, 8, 23, 27, 79, 47, 119, 145......, y como veis a partir del 8 comienza a fallar. La última versión es la siguiente:
La generación de la serie yo la probé y funciona correctamente, para verificarlo envíala directamente al Lcd. Despues en lo demás no veo errores  :?
Título: Re: Guardar serie de fibonacci en eeprom y ver en LCD
Publicado por: ramirez en 24 de Junio de 2009, 12:17:37
He probado leer directamente, leyendo la posición 7 dela eeprom que debería ser el valor 13, pero resulta que a partir de a=7, el valor que debe ser constante y con el valor 13, cambia. Lo que he cambiado de código es lo siguiente (lo marcado en rojo):

for(a=0;a<20;a++)   {   //bucle para leer mensajes en eeprom externa y muestra por lcd
   leido=read_ext_eeprom(a);

      printf(lcd_putc,"\n %d ~ Fibo=  %u ",a,read_ext_eeprom(7));
      delay_ms(1000);                  //retraso para que se vea en pantalla los mensajes
   }

Título: Re: Guardar serie de fibonacci en eeprom y ver en LCD
Publicado por: Nocturno en 24 de Junio de 2009, 12:21:27
Prueba a imprimir a la vez que vas almacenando el dato en la eeprom, así al menos podrás confirmar que la generación es correcta y el problema está en la escritura / lectura de la eeprom.

Título: Re: Guardar serie de fibonacci en eeprom y ver en LCD
Publicado por: ramirez en 24 de Junio de 2009, 12:57:39
He hecho lo que me has dicho, una escritura y su posterior lectura, pero de esta forma también salen cosas raras, el programa que he puesto es el siguiente:

/////////////////////////////////////////////////////////////////////////////////
////////////   SERIE FIBONACCI    //////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
///  0, 1, 1, 2, 3, 5, 8 ........                                            ///

#include <16f648a.h>            //pic a utilizar
#use delay(CLOCK=4000000)         //Fosc=4Mhz
#fuses XT,NOPUT,NOPROTECT,NOBROWNOUT,NOLVP,NOWDT   //comandos para el programador
#define use_portb_lcd TRUE         //utilizar el port b para lcd
#define EEPROM_SDA PIN_A1          //definimos los pines donde...
#define EEPROM_SCL PIN_A0          //la eeprom ira conectada
#include <24256.c>               //libreria de eeprom externa 24LC256
#include <lcd.c>                //libreria de lcd

///PROGRAMA
void main(void){

   int dir;               //direccion de eeprom a escribir y leer mensajes
   int valor=0;
   int suman1=0;
   int suman2=1;
   int leido=0;

   lcd_init();             //inicializa lcd
   init_ext_eeprom();          //inicializa eeprom

   lcd_putc("\f~ Escribiendo en...\n24LC256\n");
   delay_ms(100);
   
 for(dir=0;dir<20;dir++)
   {
   
switch(dir){
   case 0:
         write_ext_eeprom(dir,suman1);
         break;
   case 1:
         write_ext_eeprom(dir,suman2);
         break;
   case 2:
         valor=suman1+suman2;
         write_ext_eeprom(dir,valor);
         break;

   Default:
   valor=valor;
   suman1=suman2;
   suman2=valor;
   valor=suman1+suman2;
   write_ext_eeprom(dir,valor);      //proceso de escribir...

   }
   
   lcd_putc("\fFin de escritura en\n24LC256");
   delay_ms(1000);
   lcd_putc("\f>>>Leyendo...\n");
   delay_ms(1000);
   leido=read_ext_eeprom(dir);
   printf(lcd_putc,"\n %d ~ Fibo=  %u ",dir,read_ext_eeprom(leido));
   delay_ms(1000);                  //retraso para que se vea en pantalla los mensajes
   }
   output_a(0b00);                     //apago port a
   lcd_putc("\fFin de lectura!");
 

      }                        //...final

Título: Re: Guardar serie de fibonacci en eeprom y ver en LCD
Publicado por: Suky en 24 de Junio de 2009, 13:08:37
La serie esta se genera bien. Yo lo probé con el virtual terminal:
Código: C
  1. #include <16f648a.h>            //pic a utilizar
  2. #use delay(CLOCK=4000000)         //Fosc=4Mhz
  3. #fuses HS,NOPUT,NOPROTECT,NOBROWNOUT,NOLVP,NOWDT   //comandos para el programador
  4. #define use_portb_lcd TRUE         //utilizar el port b para lcd
  5. #define EEPROM_SDA PIN_A1          //definimos los pines donde...
  6. #define EEPROM_SCL PIN_A0          //la eeprom ira conectada
  7. #include <24256.c>               //libreria de eeprom externa 24LC256
  8. #include <lcd.c>                //libreria de lcd
  9. #use rs232(baud=9600,parity=N,xmit=PIN_B2,rcv=PIN_B1,bits=8)
  10.  
  11. ///PROGRAMA
  12. void main(void){
  13.  
  14.    int dir;               //direccion de eeprom a escribir y leer mensajes
  15.    int a;
  16.    int valor=0;
  17.    int suman1=0;
  18.    int suman2=1;
  19.    int leido=0;
  20.    
  21.    printf("\f~ Escribiendo Serie");
  22.    
  23.    for(dir=0;dir<20;dir++){
  24.       delay_ms(100);
  25.       switch(dir){
  26.             case 0:
  27.                   valor=suman1;
  28.                   break;
  29.             case 1:
  30.                   valor=suman2;
  31.                   break;
  32.             case 2:
  33.                   valor=suman1+suman2;
  34.                   break;
  35.             Default:
  36.             suman1=suman2;
  37.             suman2=valor;
  38.             valor=suman1+suman2;
  39.          }
  40.          printf("\n\r %u ~ s1=%u, s2=%u ~ Fibo= %u ",dir,suman1,suman2,valor);
  41.    }
  42.    printf("Fin de Serie");
  43.    }                        //...final

Adjunto una imagen de lo que genera. El problema puede ser la simulación de proteus en lectura y escritura de la eeprom.
Título: Re: Guardar serie de fibonacci en eeprom y ver en LCD
Publicado por: ramirez en 24 de Junio de 2009, 13:49:34
Gracias de nuevo por el interés mostrado, ahora tengo dos puntos si no os importa:
1: a partir del número 14, el valor ya no lo hace bien, esto es debido a que la variable es "int" y solo puedo ver 8 bits (hasta 255), ¿pero si en su lugar pongo una variable tipo "long", ya sería 16 bits?

2: La segunda cuestión que tengo es acerca de virtual terminal, ya que no se como obtenerlo de proteus y no puedo simularlo como lo ha hecho Suky, lo único que he visto son ejemplos del foro, pero no se como hacer un ejemplo.

Os doy las gracias de nuevo

Título: Re: Guardar serie de fibonacci en eeprom y ver en LCD
Publicado por: Suky en 24 de Junio de 2009, 14:52:34
Gracias de nuevo por el interés mostrado, ahora tengo dos puntos si no os importa:
1: a partir del número 14, el valor ya no lo hace bien, esto es debido a que la variable es "int" y solo puedo ver 8 bits (hasta 255), ¿pero si en su lugar pongo una variable tipo "long", ya sería 16 bits?

2: La segunda cuestión que tengo es acerca de virtual terminal, ya que no se como obtenerlo de proteus y no puedo simularlo como lo ha hecho Suky, lo único que he visto son ejemplos del foro, pero no se como hacer un ejemplo.

Os doy las gracias de nuevo



1º. Si long es de 16 bits. Así en ese caso necesitarias usar 2 posiciones de la memoria, aparte de separar el long en dos de 8 bits que puede hacerse con make.
Cita de: Ayuda CCS
Syntax:
 i8 = MAKE8(var, offset)
Parameters:
 var is a 16 or 32 bit integer.
offset is a byte offset of 0,1,2 or 3.
Returns:
 An 8 bit integer
Function:
 Extracts the byte at offset from var. Same as: i8 = (((var >> (offset*8)) & 0xff) except it is done with a single byte move.

Después en proteus el virtual terminal esta en la sección de Virtual Instrument Mode.
Título: Re: Guardar serie de fibonacci en eeprom y ver en LCD
Publicado por: ramirez en 25 de Junio de 2009, 10:53:35
Efectivamente, utilizando visual terminal, funcina correctamente. Pero siguiendo con el mismo tema, me ha surgido ahora la duda para utilizar "long", para de esta forma poder ver en la serie hasta el 65535, pero al nombrar la variable: long, obtengo los mismos resultados que si es int. Los únicos cambios que he hecho en el programa son (marcado en rojo):

long valor=0;
.
.
printf("\n\r %u ~ s1=%u, s2=%u ~ Fibo= %Lu  ",dir,suman1,suman2,valor);

¿porqué ocurre esto?

De nuevo gracias
Título: Re: Guardar serie de fibonacci en eeprom y ver en LCD
Publicado por: Suky en 25 de Junio de 2009, 11:02:41
Efectivamente, utilizando visual terminal, funcina correctamente. Pero siguiendo con el mismo tema, me ha surgido ahora la duda para utilizar "long", para de esta forma poder ver en la serie hasta el 65535, pero al nombrar la variable: long, obtengo los mismos resultados que si es int. Los únicos cambios que he hecho en el programa son (marcado en rojo):

long valor=0;
.
.
printf("\n\r %u ~ s1=%u, s2=%u ~ Fibo= %Lu  ",dir,suman1,suman2,valor);

¿porqué ocurre esto?

De nuevo gracias
suman1 y suman2 también deben ser log.
Título: Re: Guardar serie de fibonacci en eeprom y ver en LCD
Publicado por: ramirez en 25 de Junio de 2009, 11:11:04
Todo correcto, una vez más gracias por tu colaboración.