Sunteți pe pagina 1din 2

Muchas gracias v_pi, funciono!....

pero me parece que se hizo mas lenta la


grabacion...no se...quizas haya otro metodo mas rapido.
Aqui el codigo funcionando:

#include <p18f2550.h>
#include <delays.h>
#include <i2c.h>
//#include <usart.h>
#include <adc.h>
#include <stdlib.h>

#pragma config FOSC = XT_XT,FCMEN = OFF,IESO = OFF, CPUDIV = OSC1_PLL2


#pragma config PWRT = ON,BOR = OFF,BORV = 0
#pragma config WDT = OFF,WDTPS = 32768
#pragma config MCLRE = ON,LPT1OSC = OFF,PBADEN = OFF,CCP2MX = OFF
#pragma config STVREN = OFF,LVP = OFF,XINST = OFF,DEBUG = OFF
#pragma config CP0 = ON,CP1 = ON,CP2 = ON
#pragma config CPB = ON,CPD = ON
#pragma config WRT0 = ON,WRT1 = ON,WRT2 = ON
#pragma config WRTB = ON,WRTC = ON,WRTD = ON
#pragma config EBTR0 = ON,EBTR1 = ON,EBTR2 = ON
#pragma config EBTRB = ON

unsigned char StringData[4];

void BufferWriteI2C( unsigned char ByteControl, unsigned char HighDireccion,


unsigned char LowDireccion,
unsigned char *BufferData)

{
IdleI2C();
StartI2C();
while ( SSPCON2bits.SEN );
WriteI2C( ByteControl );
WriteI2C( HighDireccion );
WriteI2C( LowDireccion );
putsI2C(BufferData);
StopI2C();
while ( SSPCON2bits.PEN );
while (EEAckPolling(ByteControl));
}

void main(void){

unsigned int dirAlta;


unsigned int dirBaja;
unsigned int dato;

dirAlta= 0;
dirBaja= 0;

OpenADC(ADC_FOSC_RC & ADC_2_TAD & ADC_RIGHT_JUST, ADC_REF_VDD_VSS & ADC_INT_OFF,


ADC_2ANA);
OpenI2C(MASTER,SLEW_OFF);
SSPADD = 9;

while(1){
SetChanADC(0);
Delay10TCYx(1);
ConvertADC();
while(BusyADC()==1){}
dato= ReadADC();
itoa(dato,StringData);
Delay1KTCYx(5);
BufferWriteI2C(0xA0,dirAlta,dirBaja,StringData);

dirBaja = dirBaja + 4; //le sumo las cuatro posiciones (bits) correspondientes


//a los cuatro digitos del numero obtenido entre 0000 y
1023, ej: 1018
if(dirBaja >= 256){ // esto es para pasar a la segunda pagina de la memoria
(32 Bytes c/una)
dirBaja=0; // reseteo la direccion baja a 0
dirAlta = dirAlta+1; // paso a la siguiente pagina y asi sucesivamente hasta
el final de la memoria.
}
}
}

nippur:
Otra cosa, "formatee" la memoria escribiendole todos ceros hasta el final...asi si
obtengo siempre numeros de cuatro digitos ej 0015, o 0658 o 1015, etc...

===================================================================================
================================
la instruccin rotar toma el dato y desliza sus bits a izquierda o derecha, as por
ejemplo un Data=0b00010011
al realizar (Data<<4) quedara 0b00110000. En las lineas que poste toma el byte mas
significativo de la palabra (16-bits)
y lo rota a la posicin del byte menos significativo.
write_eeprom(Direccion++,(Data>>8)); write_eeprom(Direccion, Data); // Solo
transfiere los primeros 8 bits, truncando.

long i=0; // inicio de direccion de memoria


long value=0; // variable donde guardo la lectura del adc

//me meto en un bucle hasta llegar a la direccion 16384


while(i<=16384);
{
value = read_adc(); //leo el conversor
write_ext_eeprom (i,value); //escribo en la direccion 00 la parte baja del adc
i=i++; // incremento la direccion para la parte
alta
value= value>>8; // roto para guardar la parte alta
write_ext_eeprom (i,value); // guardo en la direccion siguiente la parte alta
i=i++ // incremento memoria para que guarde otro
dato
}
===================================================================================
=========================================

S-ar putea să vă placă și