Autor Tema: Guardar valores de contador 0-999 en memoria EEPROM  (Leído 3899 veces)

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

Desconectado juanes79

  • PIC10
  • *
  • Mensajes: 41
Re:Guardar valores de contador 0-999 en memoria EEPROM
« Respuesta #15 en: 13 de Octubre de 2016, 11:12:37 »
Nuevamente gracias por guiarme en este proceso de aprendizaje con ustedes. Especialmente al usuario KILLERJC

Este es el programa que tengo en el momento para tratar de almacenar en la memoria EEPROM el valor del contador, el cual va de 0 a 999.

Programa en MPLABX

// librerias
#include "mcc_generated_files/mcc.h"
#include <xc.h>  //se incluye librerias xc8
#include <stdio.h>
#include <stdlib.h>
#include <htc.h>
# define LCD_RS RD6
# define LCD_EN RD7
#define LCD_DATA PORTB
#define Lib_Int_EEProm.c
char centenas, decenas, unidades; //defino variables char.solo van de 0 a 9

// declaracion de variables
union Data_EE MyVar; //main.c:15: error: (1442) type used in variable definition is incomplete
                    //main.c:15: warning: (374) missing basic type; int assumed




unsigned int valor16;
unsigned char   valor8_1;
unsigned char   valor8_2;
unsigned char centenas = 9;
unsigned char decenas = 9;
unsigned char unidades = 9;
uint16_t cont = 0;

// funciones
void lcd_init (void); //inicializacion del LCD
void set_lcd (void);  //Configuracion del LCD
void lcd_puts(const char * s); //cadenas de caracteres al LCD
void lcd_putch(char c); //
void lcd_goto(unsigned char pos); // Direcciones en el LCD
void lcd_write(unsigned char c); //Escritura en el LCD
void binbcd ()



{
  centenas=cont/100;
  decenas=(cont%100)/10;
  unidades=cont%10;
}

void main(void)
{
   
unidades = eeprom_read(0x00);
decenas =  eeprom_read(0x01);
centenas = eeprom_read(0x02);
MyVar.valor8_1 = eeprom_read(0x00); //tengo duda si esta instruccion va aqui
MyVar.valor8_2 = eeprom_read(0x01); //tengo duda si esta instruccion va aqui


cont = read_16bits_eeprom(0x00);//Lee lo de la posicion 0x00 y 0x01, lo junta y lo pone en contador
// me sale el siguiente error




SYSTEM_Initialize(); //inicia el sistema

lcd_init();  //LLAMO FUNCION DE INICIALIZACION
   while(1) //ciclo  while para no hacer nada.ya mostro el mesaje
      {
   lcd_goto(0);   // selecciono primera línea
   lcd_puts("LA CARGA ES 1000 ");
          lcd_goto(0x40);   // Selecciono segunda línea
   lcd_puts("CANTIDAD:   ");  //mensaje para la segunda linea

        while(1)
        {
            while(cont<1000)
           {
               if(RD5==0) //Suciche para poner el contador a cero
               {
                   __delay_ms(10);
                   cont=-1;
              binbcd();
                lcd_goto(0X4B); // Ubico centenas en poscion CB del LCD
                lcd_putch(centenas+48); // sumo 48 para pasar a ASCLL
                lcd_goto(0X4C);        //Ubico decenas en posicion CC del LCD
                lcd_putch(decenas+48); //sumo 48 para pasar a ASCLL
                lcd_goto(0X4D);     //Ubico unidades en posicion CE DEL LCD
                lcd_putch(unidades+48); //Sumo 48 para pasar a Ascll
                __delay_ms(10);


               }
               else

               if(RD3==1) //S4 simula un sensor para activar el conteo

          { break;}


              RA0=1;
           __delay_ms(100);
              RA0=0;
                cont++;
               // eeprom_write(0x09,cont);

                 if(unidades == 10)
                 { decenas++; unidades = 0;}

                 else if(decenas == 10)
                 { centenas++; decenas = 0;}

                 else if (centenas == 10)
                 { centenas = 0; }

                eeprom_write(0x00,unidades);
                eeprom_write(0x01,decenas);
                eeprom_write(0x02,centenas);
                eeprom_write(0x00,MyVar.valor8_1);
                eeprom_write(0x01,MyVar.valor8_2);
                binbcd();
                lcd_goto(0X4B); // Ubico centenas en poscion CB del LCD
                lcd_putch(centenas+48); // sumo 48 para pasar a ASCLL
                lcd_goto(0X4C);        //Ubico decenas en posicion CC del LCD
                lcd_putch(decenas+48); //sumo 48 para pasar a ASCLL
                lcd_goto(0X4D);     //Ubico unidades en posicion CE DEL LCD
                lcd_putch(unidades+48); //Sumo 48 para pasar a Ascll
                __delay_ms(100);    //Incremento cuenta cada 500 ms

               
       write_16bits_eeprom(cont,0x00);       //Lee lo de la posicion 0x00 y 0x01, lo junta y lo pone en contador
            }
        }
    }
}
void lcd_init(void) //funcion de inicializacion del LCD
{
LCD_DATA=2; // se manda el dato 2 al puerto para iniciar el LCD
set_lcd(); // se la funcion de configuracion
LCD_DATA=56; // mando el dato 56 al puerto para 8 bits,2 lineas y 5x7
set_lcd();   // llamo funcion de configuracion
LCD_DATA=12; // mando el dato 12 para prender el LCD con cursor
set_lcd();
LCD_DATA=6;
set_lcd();
LCD_DATA=1;
set_lcd();
}

void set_lcd (void) // funcion de configuracion
{
    LCD_RS=0; //RS en cero para indicar al LCD que es configuracion
    LCD_EN=1; // se habilita la operacion
   __delay_ms(2); //retardo necesario para la operacion
    LCD_EN=0; // termina la operacion
}
//Voy a una poscion especifica del LCD
void lcd_goto(unsigned char pos) // funcion de direcciones
{
   LCD_RS = 0; //RS en cero para configuracion
   lcd_write(0x80+pos); //sumo 80H a pos que viene con un dato
}
void lcd_write(unsigned char c) // funcion de escritura en el LCD
{
   LCD_EN=1;//habilito la operacion
   LCD_DATA = ( c );//mando al puerto el dato que hay en C.
   __delay_ms(2); //retardo necesario para la operacion
   LCD_EN=0;// termino la operacion
}
/* Escribo una cadena de caracteres en el LCD */
void lcd_puts(const char * s)
{
   LCD_RS = 1; //habilito operacion
   while(*s) //mientras haya caracteres en la cadena enviada
      lcd_write(*s++); //pase al siguiente
}
/* Escribo un caracter en el LCD */
void lcd_putch(char c)
{
   LCD_RS = 1;   //habilito escritura en LCD
   lcd_write( c );
}


Errores que salen después de  compilar este programa.

CLEAN SUCCESSFUL (total time: 295ms)
make -f nbproject/Makefile-default.mk SUBPROJECTS= .build-conf
make[1]: Entering directory `C:/Users/juan/MPLABXProjects/LCD.X'
make  -f nbproject/Makefile-default.mk dist/default/production/LCD.X.production.hex
make[2]: Entering directory `C:/Users/juan/MPLABXProjects/LCD.X'
"C:\Program Files\Microchip\xc8\v1.38\bin\xc8.exe" --pass1  --chip=16F1937 -Q -G  --double=24 --float=24 --opt=default,+asm,+asmfile,-speed,+space,-debug --addrqual=ignore --mode=free -P -N255 --warn=0 --asmlist --summary=default,-psect,-class,+mem,-hex,-file --output=default,-inhx032 --runtime=default,+clear,+init,-keep,-no_startup,+osccal,-resetbits,-download,-stackcall,+clib --output=-mcof,+elf:multilocs --stack=compiled:auto:auto "--errformat=%%f:%%l: error: (%%n) %%s" "--warnformat=%%f:%%l: warning: (%%n) %%s" "--msgformat=%%f:%%l: advisory: (%%n) %%s"    -obuild/default/production/mcc_generated_files/pin_manager.p1  mcc_generated_files/pin_manager.c
"C:\Program Files\Microchip\xc8\v1.38\bin\xc8.exe" --pass1  --chip=16F1937 -Q -G  --double=24 --float=24 --opt=default,+asm,+asmfile,-speed,+space,-debug --addrqual=ignore --mode=free -P -N255 --warn=0 --asmlist --summary=default,-psect,-class,+mem,-hex,-file --output=default,-inhx032 --runtime=default,+clear,+init,-keep,-no_startup,+osccal,-resetbits,-download,-stackcall,+clib --output=-mcof,+elf:multilocs --stack=compiled:auto:auto "--errformat=%%f:%%l: error: (%%n) %%s" "--warnformat=%%f:%%l: warning: (%%n) %%s" "--msgformat=%%f:%%l: advisory: (%%n) %%s"    -obuild/default/production/mcc_generated_files/mcc.p1  mcc_generated_files/mcc.c
"C:\Program Files\Microchip\xc8\v1.38\bin\xc8.exe" --pass1  --chip=16F1937 -Q -G  --double=24 --float=24 --opt=default,+asm,+asmfile,-speed,+space,-debug --addrqual=ignore --mode=free -P -N255 --warn=0 --asmlist --summary=default,-psect,-class,+mem,-hex,-file --output=default,-inhx032 --runtime=default,+clear,+init,-keep,-no_startup,+osccal,-resetbits,-download,-stackcall,+clib --output=-mcof,+elf:multilocs --stack=compiled:auto:auto "--errformat=%%f:%%l: error: (%%n) %%s" "--warnformat=%%f:%%l: warning: (%%n) %%s" "--msgformat=%%f:%%l: advisory: (%%n) %%s"    -obuild/default/production/main.p1  main.c
main.c:15: error: (1442) type used in variable definition is incomplete
main.c:52: error: (198) undefined struct/union "Data_EE"
main.c:52: error: (182) illegal conversion between types

unsigned char -> union Data_EE
main.c:53: error: (198) undefined struct/union "Data_EE"
main.c:53: error: (182) illegal conversion between types
unsigned char -> union Data_EE
main.c:56: warning: (361) function declared implicit int
main.c:116: error: (198) undefined struct/union "Data_EE"
main.c:116: error: (182) illegal conversion between types
union Data_EE -> unsigned char
main.c:116: error: (181) non-scalar types can't be converted to other types
main.c:117: error: (198) undefined struct/union "Data_EE"
main.c:117: error: (182) illegal conversion between types
union Data_EE -> unsigned char
main.c:117: error: (181) non-scalar types can't be converted to other types
main.c:128: warning: (361) function declared implicit int
make[2]: *** [build/default/production/main.p1] Error 1
make[1]: *** [.build-conf] Error 2
(908) exit status = 1
make[2]: Leaving directory `C:/Users/juan/MPLABXProjects/LCD.X'
make[1]: Leaving directory `C:/Users/juan/MPLABXProjects/LCD.X'
make: *** [.build-impl] Error 2

BUILD FAILED (exit value 2, total time: 4s)

Desconectado juanes79

  • PIC10
  • *
  • Mensajes: 41
Re:Guardar valores de contador 0-999 en memoria EEPROM
« Respuesta #16 en: 13 de Octubre de 2016, 11:23:06 »
Gracias amigo KILLERJC por tus sabias respuestas.

Este es el código que tengo en el momento:

// librerias
#include "mcc_generated_files/mcc.h"
#include <xc.h>  //se incluye librerias xc8
#include <stdio.h>
#include <stdlib.h>
#include <htc.h>
# define LCD_RS RD6
# define LCD_EN RD7
#define LCD_DATA PORTB
#define Lib_Int_EEProm.c
char centenas, decenas, unidades; //defino variables char.solo van de 0 a 9

// declaracion de variables
union Data_EE MyVar; //main.c:15: error: (1442) type used in variable definition is incomplete
                    //main.c:15: warning: (374) missing basic type; int assumed




unsigned int valor16;
unsigned char   valor8_1;
unsigned char   valor8_2;
unsigned char centenas = 9;
unsigned char decenas = 9;
unsigned char unidades = 9;
uint16_t cont = 0;

// funciones
void lcd_init (void); //inicializacion del LCD
void set_lcd (void);  //Configuracion del LCD
void lcd_puts(const char * s); //cadenas de caracteres al LCD
void lcd_putch(char c); //
void lcd_goto(unsigned char pos); // Direcciones en el LCD
void lcd_write(unsigned char c); //Escritura en el LCD
void binbcd ()



{
  centenas=cont/100;
  decenas=(cont%100)/10;
  unidades=cont%10;
}

void main(void)
{
   
unidades = eeprom_read(0x00);
decenas =  eeprom_read(0x01);
centenas = eeprom_read(0x02);
MyVar.valor8_1 = eeprom_read(0x00); //tengo duda si esta instruccion va aqui
MyVar.valor8_2 = eeprom_read(0x01); //tengo duda si esta instruccion va aqui


cont = read_16bits_eeprom(0x00);//Lee lo de la posicion 0x00 y 0x01, lo junta y lo pone en contador
// me sale el siguiente error




SYSTEM_Initialize(); //inicia el sistema

lcd_init();  //LLAMO FUNCION DE INICIALIZACION
   while(1) //ciclo  while para no hacer nada.ya mostro el mesaje
      {
   lcd_goto(0);   // selecciono primera línea
   lcd_puts("LA CARGA ES 1000 ");
          lcd_goto(0x40);   // Selecciono segunda línea
   lcd_puts("CANTIDAD:   ");  //mensaje para la segunda linea

        while(1)
        {
            while(cont<1000)
           {
               if(RD5==0) //Suciche para poner el contador a cero
               {
                   __delay_ms(10);
                   cont=-1;
              binbcd();
                lcd_goto(0X4B); // Ubico centenas en poscion CB del LCD
                lcd_putch(centenas+48); // sumo 48 para pasar a ASCLL
                lcd_goto(0X4C);        //Ubico decenas en posicion CC del LCD
                lcd_putch(decenas+48); //sumo 48 para pasar a ASCLL
                lcd_goto(0X4D);     //Ubico unidades en posicion CE DEL LCD
                lcd_putch(unidades+48); //Sumo 48 para pasar a Ascll
                __delay_ms(10);


               }
               else

               if(RD3==1) //S4 simula un sensor para activar el conteo

          { break;}


              RA0=1;
           __delay_ms(100);
              RA0=0;
                cont++;
               // eeprom_write(0x09,cont);

                 if(unidades == 10)
                 { decenas++; unidades = 0;}

                 else if(decenas == 10)
                 { centenas++; decenas = 0;}

                 else if (centenas == 10)
                 { centenas = 0; }

                eeprom_write(0x00,unidades);
                eeprom_write(0x01,decenas);
                eeprom_write(0x02,centenas);
                eeprom_write(0x00,MyVar.valor8_1);
                eeprom_write(0x01,MyVar.valor8_2);
                binbcd();
                lcd_goto(0X4B); // Ubico centenas en poscion CB del LCD
                lcd_putch(centenas+48); // sumo 48 para pasar a ASCLL
                lcd_goto(0X4C);        //Ubico decenas en posicion CC del LCD
                lcd_putch(decenas+48); //sumo 48 para pasar a ASCLL
                lcd_goto(0X4D);     //Ubico unidades en posicion CE DEL LCD
                lcd_putch(unidades+48); //Sumo 48 para pasar a Ascll
                __delay_ms(100);    //Incremento cuenta cada 500 ms

               
       write_16bits_eeprom(cont,0x00);       //Lee lo de la posicion 0x00 y 0x01, lo junta y lo pone en contador
            }
        }
    }
}
void lcd_init(void) //funcion de inicializacion del LCD
{
LCD_DATA=2; // se manda el dato 2 al puerto para iniciar el LCD
set_lcd(); // se la funcion de configuracion
LCD_DATA=56; // mando el dato 56 al puerto para 8 bits,2 lineas y 5x7
set_lcd();   // llamo funcion de configuracion
LCD_DATA=12; // mando el dato 12 para prender el LCD con cursor
set_lcd();
LCD_DATA=6;
set_lcd();
LCD_DATA=1;
set_lcd();
}

void set_lcd (void) // funcion de configuracion
{
    LCD_RS=0; //RS en cero para indicar al LCD que es configuracion
    LCD_EN=1; // se habilita la operacion
   __delay_ms(2); //retardo necesario para la operacion
    LCD_EN=0; // termina la operacion
}
//Voy a una poscion especifica del LCD
void lcd_goto(unsigned char pos) // funcion de direcciones
{
   LCD_RS = 0; //RS en cero para configuracion
   lcd_write(0x80+pos); //sumo 80H a pos que viene con un dato
}
void lcd_write(unsigned char c) // funcion de escritura en el LCD
{
   LCD_EN=1;//habilito la operacion
   LCD_DATA = ( c );//mando al puerto el dato que hay en C.
   __delay_ms(2); //retardo necesario para la operacion
   LCD_EN=0;// termino la operacion
}
/* Escribo una cadena de caracteres en el LCD */
void lcd_puts(const char * s)
{
   LCD_RS = 1; //habilito operacion
   while(*s) //mientras haya caracteres en la cadena enviada
      lcd_write(*s++); //pase al siguiente
}
/* Escribo un caracter en el LCD */
void lcd_putch(char c)
{
   LCD_RS = 1;   //habilito escritura en LCD
   lcd_write( c );
}

Errores que me salen al compilar el programa

main.c:15: error: (1442) type used in variable definition is incomplete
main.c:52: error: (198) undefined struct/union "Data_EE"
main.c:52: error: (182) illegal conversion between types
unsigned char -> union Data_EE
main.c:53: error: (198) undefined struct/union "Data_EE"
main.c:53: error: (182) illegal conversion between types
unsigned char -> union Data_EE
main.c:56: warning: (361) function declared implicit int
main.c:116: error: (198) undefined struct/union "Data_EE"
main.c:116: error: (182) illegal conversion between types
union Data_EE -> unsigned char
main.c:116: error: (181) non-scalar types can't be converted to other types
main.c:117: error: (198) undefined struct/union "Data_EE"
main.c:117: error: (182) illegal conversion between types
union Data_EE -> unsigned char
main.c:117: error: (181) non-scalar types can't be converted to other types
main.c:128: warning: (361) function declared implicit int
(908) exit status = 1
make[2]: Leaving directory `C:/Users/juan/MPLABXProjects/LCD.X'
make[1]: Leaving directory `C:/Users/juan/MPLABXProjects/LCD.X'
make[2]: *** [build/default/production/main.p1] Error 1
make[1]: *** [.build-conf] Error 2
make: *** [.build-impl] Error 2



Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Guardar valores de contador 0-999 en memoria EEPROM
« Respuesta #17 en: 13 de Octubre de 2016, 12:34:39 »
Bien los errores son esos y veo correctamente que son,

A lo que me refiero del codigo es que pongas donde tenes definido las funciones:

       write_16bits_eeprom(cont,0x00);

Quedebo imaginar que es el archivo Lib_Int_EEProm.c

Nuevamente pusiste en el codigo un DEFINE, cuando tal ves era un INCLUDE.