hola estoy haciendo un programa que tengo q terminar para la otra semana y es con el pic 18f452 lo que tengo q hacer es leer un sensor de temperatura 80 veces almacenarlo en la eeprom y luego mostrarlo en la hyperterminal bueno el programa me almacena y me lee los datos pero ene la posicion 65 hasta la 80 me salen unos datos que no concuerdan yo creo que es porque la memoria es de 63 bytes pero no se como arreglarlo
el codigo que hice es este
#include "24lc256.h"
#include "terminal.h"
#use I2C (MASTER, SDA=PIN_C4, SCL=PIN_C3, RESTART_WDT, FAST)
// Makron för minnet
#define EEROM_ADDR 0xa0 // I2C adress för EEPROM
#define EEPROM_ADRESS_LO 0x00 // Låg Adressbyte för EEPROM
#define EEPROM_ADRESS_HI 0x00 // Hög Adressbyte för EEPROM. Max (0-63)
#define EEPROM_BYTES 10 // EEPROM-bytes +1 som skrivs/läses
#define READ_DATA 1 // Läs data
#define TEMP_P1 0x0
#define TEMP_MASK 0x80
#define SENSOR_ADDR 0x9e
#define Thyst_High 23
#define Thyst_Low 128
#define Thyst_POINTER 0x2
#define ACK 1
#define NO_ACK 0
#define READ_BIT 1
#define WRITE_BIT 0
#define ZERO_DATA 0
#define GRAD0 '0'
#define GRAD5 '5'
// Globala variabler
BYTE bTemplo;
BYTE bTempThyst; // Tempvärde 1/2- grader
signed int iTemphi; // Tempvärde grader
signed int iTempThyst;
char cGrad=GRAD0;
// Funktionsprototyper
void storage_eeprom(void); // Spara i EEPROM
void las_eeprom(void); // Läs ur EEPROM
void get_temperature(void);
void set_thyst(void);
void get_thyst(void);
//Funktioner
/* Lagra i EEPROM, max 63 bytes */
void storage_eeprom(void)
{
int iCounter;
i2c_start();
i2c_write(EEROM_ADDR); // Hårdvaruadressen för minneskapseln
i2c_write(EEPROM_ADRESS_HI); // Startadress i minnet hög
i2c_write(EEPROM_ADRESS_LO); // Startadress i minnet låg
for(iCounter=0; iCounter <= 80;iCounter++)
{
i2c_write(iTempThyst); // Skriv data till eeprom
}
i2c_stop();
}
/* Läs från EEPROM, max 63 bytes */
void las_eeprom(void)
{
int iCounter;
byte bData;
BOOLEAN EndOfMemoryFlag = 1; // För att växla så att sista minnesläsningen är utan ACK
i2c_start();
i2c_write(EEROM_ADDR);
i2c_write(EEPROM_ADRESS_HI);
i2c_write(EEPROM_ADRESS_LO);
i2c_start();
i2c_write(EEROM_ADDR | READ_DATA); // Bitvis OR med 1 ger att den minst signifikanta biten blir 1 (0xA1)
// vilket betyder läs data frånEEPROM
for(iCounter =0; iCounter <= 80;iCounter++)
{
if(iCounter == 80) EndOfMemoryFlag = 0;
bData= i2c_read(EndOfMemoryFlag); // Läs 0, 1, 2... osv ur eeprom
delay_ms(300);
printf("Adress %X %2d Data %d %c \n\r",EEPROM_ADRESS_HI,iCounter,bData,cGrad,);
}
i2c_stop();
}
void get_temperature(void)
{
i2c_start();
i2c_write(SENSOR_ADDR | READ_BIT); // Bitvis OR med 1 ger att den minst signifikanta biten blir 1 (0x9F)
// vilket betyder läs data från LM75.
iTemphi = i2c_read(ACK); // Läs mest signifikanta byten, svara med en ack till LM75 när byten är läst.
bTemplo = i2c_read(NO_ACK); // Läs minst signifikanta byten, svara inte med en ack till LM75 när byten är läst.
i2c_stop();
if(bTemplo & TEMP_MASK) cGrad = GRAD5; // Lägg till 0.5 grader om LM75 byte2 är hög
else cGrad = GRAD0;
}
void set_thyst(void)
{
i2c_start();
i2c_write(SENSOR_ADDR | 0);
i2c_write(Thyst_POINTER);
i2c_write(Thyst_High);
i2c_write(Thyst_Low);
i2c_stop();
}
void get_thyst(void)
{
i2c_start();
i2c_write(SENSOR_ADDR | 0);
i2c_write(Thyst_POINTER);
i2c_start();
i2c_write(SENSOR_ADDR | READ_BIT);
iTempThyst = i2c_read(ACK);
bTempThyst = i2c_read(NO_ACK);
i2c_stop();
if(bTempThyst & TEMP_MASK) cGrad = GRAD5;
else cGrad = GRAD0;
}
void main(void)
{
int count;
startup();
set_thyst();
printf(CLR_SCR); // Rensa skärmen
do{
puts("\n\n\rI2C minneshantering");
output_bit(PIN_C2,~input(PIN_C2));
get_temperature();
delay_ms(100);
get_thyst();
for (count=0;count<80;count++){
storage_eeprom();
}
delay_ms(WAIT_500_MS);
las_eeprom(); // Läs i serieminnet
}while(TRUE);