Hola Firepic, ya solucioné el problema, era una variable mal definida. Ahora estoy tratando de leer y escribir en una EEPROM de 16Kbytes que bajé del foro, pero no me compila el programa principal ni los programas que están dentro del .H; lo único que le cambié fueron los pines de lectura y escritura y el microcontrolador; le pego el código si le da una miradita
este es el principal
#include "C:\Archivos de programa\PICC\EEpromX.h"
void main()
{
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_spi(FALSE);
setup_counters(RTCC_INTERNAL,RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
//#include <16f873.h> //pic a utilizar
//#fuses XT,NOWDT,NOPROTECT,PUT,NOLVP,NOBROWNOUT //ordenes para el programador
//#fuses RC_IO //reloj interno
#use delay (clock=4000000) //Fosc=4Mhz
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7) //manejo del RS232
#define EEPROM_SDA PIN_C5 //pines para...
#define EEPROM_SCL PIN_C4 //...manejo de eeprom 24LC256
//#include <24256.c> //libreria eeprom 24LC256
///DECLARACION DE VARIABLES GLOBALES
boolean menu=1,opcion=1; //si menu=0 se muestra el menu de inicio...
//...si opcion=1 estamos en modo direccion
// opcion=0 estamos en modo dato
///DECLARACION DE FUNCIONES
BYTE gethex1( ); //verifica que esta dentro del rango y muestra por pantalla
BYTE gethex( ); //devuelve el numero en hex
///LLAMADA FUNCION INTERRUPCION
#int_rda
void rs232( )
{
BYTE i=0,j=0,value; //definicion...
EEPROM_ADDRESS address;
char digito; //...variables
disable_interrupts(global); //apago interrupcion
digito=getc( ); //almaceno dato serial(rs232) en digito
puts("****************************************************" );
switch(digito)
{
case "0": menu=!menu; //muestra menu
break;
case "1": printf("LLenando buffer..." ); //llena memoria 0xff
for(i=0; i<16;i++)
{
for(j=0; j<16;j++)
write_ext_eeprom(i*16+j,0xff);
}
puts(" Buffer completado!" );
break;
case "2": puts("Realizando Lectura..." ); //opcion que realiza la lectura modo hex
puts("00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F" );
puts("==============================================" );
for(i=0;i<16;i++)
{
for(j=0;j<16;j++)
{
printf("%2x ",read_ext_eeprom(i*16 +j) );
}
printf("|| %3x0",i );
}
puts("Lectura finalizada!" ;
break;
case "3": printf("Direccion a cambiar: " ); //opcion que realiza la escritura address = gethex( ); //le damos la direccion
printf("Nuevo valor: " );
opcion=0; //modo datos
value = gethex( ); //le damos el dato a escribir
opcion=1; //modo direcciones
printf("Realizando escritura..." );
write_ext_eeprom(address,value); //escribe en la eeprom
printf(" Escritura finalizada!" );
break;
case "4": puts("Realizando Lectura..." ); //opcion que realiza la lectura modo texto
puts("00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F" );
puts("==============================================" );
for(i=0;i<16;i++)
{
for(j=0;j<16;j++)
{
printf("%c ",read_ext_eeprom(i*16 +j) );
}
printf("||%3x0 ",i );
}
puts("Lectura finalizada!" );
break;
default: puts("Opcion incorrecta, para ver Menu pulse 0 VsZeNeR"06" );
}
puts("****************************************************" ;
enable_interrupts(global); //activamos de nuevo la interrupcion serial rs-232
}
void main(void)
{
// setup_oscillator(OSC_4MHZ); //reloj interno de 4MHz
enable_interrupts(int_rda); //activo interrupcion serial rs-232
enable_interrupts(global); //habilito la interrupcion
init_ext_eeprom( );
do
{ //bucle...
puts("Lectura/Escritura de EEPROM 24LC256 VsZeNeR"06" ); //menu...
puts("==============================================" );
puts("Seleccione opcion:" );
puts("¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨" );
puts(" 0->Ver opciones" );
puts(" 1->LLenar buffer" );
puts(" 2->Lectura modo HEX" );
puts(" 3->Escritura EEPROM" );
puts(" 4->Lectura modo TEXTO" ); //...principal
menu=1; //muestra menu solamente una vez
while(menu==1){ } //espera tecla pulsada por teclado(rs-232)
}
while(TRUE); //...infinito
}
///FUNCION QUE SELECCIONA DIGITO CORRESPONDIENTE
BYTE gethex1( )
{
char digit;
do { //espera hasta tener un dato correcto
digit = getc();
if(opcion==0) //si estamos introduciendo un dato no hace falta las restricciones
break;
}
while((digit<"0" || digit>"9") && (digit<"A" || digit>"F") && (digit<"a" || digit>"f" ));
putc(digit); //muestra por pantalla el dato introducido
if(digit<="9" ) //se ha introducido un numero
return(digit-"0" );
else //se ha introducido una letra
return((toupper(digit)-"A" )+10);
}
BYTE gethex() ///FUNCION QUE DEVUELVE EL NUMERO HEXADECIMAL
{
int lo,hi;
hi = gethex1(); //parte alta
lo = gethex1( ); //parte baja
if(lo==0xdd)
return(hi);
else
return( hi*16+lo );
}
}
}
y este es el 24256 que es necesario para el programa principal
//// Library for a 24LC256 serial EEPROM ////
//// ////
//// init_ext_eeprom(); Call before the other functions are used ////
//// ////
//// write_ext_eeprom(a, d); Write the byte d to the address a ////
//// ////
//// d = read_ext_eeprom(a); Read the byte d from the address a ////
//// ////
//// The main program may define eeprom_sda ////
//// and eeprom_scl to override the defaults below. ////
//// ////
///////////////////////////////////////////////////////////////////////////
//// (C) Copyright 1996,2003 Custom Computer Services ////
//// This source code may only be used by licensed users of the CCS C ////
//// compiler. This source code may only be distributed to other ////
//// licensed users of the CCS C compiler. No other use, reproduction ////
//// or distribution is permitted without written permission. ////
//// Derivative programs created using this software in object code ////
//// form are not restricted in any way. ////
///////////////////////////////////////////////////////////////////////////
#ifndef EEPROM_SDA
#define EEPROM_SDA PIN_C5
#define EEPROM_SCL PIN_C4
#endif
#use i2c(master, sda=EEPROM_SDA, scl=EEPROM_SCL)
#define EEPROM_ADDRESS long int
#define EEPROM_SIZE 16384
void init_ext_eeprom()
output_float(EEPROM_SCL);
output_float(EEPROM_SDA);
void write_ext_eeprom(long int address, BYTE data)
{
short int status;
i2c_start();
i2c_write(0xa0);
i2c_write(address>>8);
i2c_write(address);
i2c_write(data);
i2c_stop();
i2c_start();
status=i2c_write(0xa0);
while(status==1)
{
i2c_start();
status=i2c_write(0xa0);
}
}
BYTE read_ext_eeprom(long int address)
{
BYTE data;
i2c_start();
i2c_write(0xa0);
i2c_write(address>>8);
i2c_write(address);
i2c_start();
i2c_write(0xa1);
data=i2c_read(0);
i2c_stop();
return(data);
}