Buenass!!!lo prometido es deuda! aqui esta el programa que gestiona la lectura/escritura de una eeprom externa, concretamente la 24LC256:
////////////////////////////////////////////////////////////////////////////////////
// VsZeNeR"06
// 23/Enero/06
//
// Programa: RS232 Y PIC
// Version: 1.0 REVISION del programa 48
//
// Dispositivo: PIC 16F648A Compilador: CCS vs3.242
// Entorno IDE: MPLAB IDE v7.30 Simulador: Proteus 6.7sp3
//
// Notas: Se interacciona el PC con el PIC mediante RS232 para el tratamiento de la memoria
// eeprom externa 24LC256,se muestra por v.terminal un menu:
// · 0 -> Muestra nuevamente el menu
// · 1 -> LLena la eeprom a 0xFF
// · 2 -> Lee la eeprom en modo hex
// · 3 -> Escribe en la eeprom
// · 4 -> Lee la eeprom en modo texto(ASCII)
// Todas las acciones se realizan mediante la interrupcion del puerto serial.
// Al comienzo del programa, realizar el paso 1. en caso de empezar a escribir
// en la eeprom!. Decir que las funciones gethex1() y gethex() estan sacadas
// de la libreria incluida en CCS, input.c, estan puestas en el programa
// por la pequeña modificacion en la funcion gethex1() que, en este caso, solo
// permite el paso de digitos comprendidos entre 0-f o 0-F. Tener en cuenta
// que los datos a introducir deben ser en hexadecimal, por ejmeplo, en el
// caso de almacenar en la letra "a" minuscula en la posicion 0x00 de la eeprom
// 24LC256, habra que realizar los siguientes pasos:
// 1. Pulsamos 3 para escribir en la eeprom interna
// 2. Ponemos la direccion 00 (esta en hexadecimal!)
// 3. Damos el valor en hex de la letra a=61
// 4. Leemos la memoria para ver que se almacenado correctamente(pulsando 2)
//
// Conexiones: A0 -> SCK eeprom 24LC256
// A1 -> SDA eeprom 24LC256
// B2 -> TxD
// B1 -> RxD
//////////////////////////////////////////////////////////////////////////////////
#include <16f648a.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_b2, rcv=PIN_b1) //manejo del RS232
#define EEPROM_SDA PIN_A1 //pines para...
#define EEPROM_SCL PIN_A0 //...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);
}
///FUNCION QUE DEVUELVE EL NUMERO HEXADECIMAL
BYTE gethex() {
int lo,hi;
hi = gethex1(); //parte alta
lo = gethex1( ); //parte baja
if(lo==0xdd)
return(hi);
else
return( hi*16+lo );
}
Bueno, pues aqui esta!
Suerte!!!