0% encontró este documento útil (0 votos)
223 vistas4 páginas

Lectura de Temperatura y EEPROM

Este documento describe un proyecto para leer la temperatura y hora usando dispositivos DS1621 y DS1307 respectivamente, y guardar los datos en una memoria EEPROM. Incluye código para inicializar los periféricos, leer los valores de temperatura y hora, y escribirlos en la EEPROM. También incluye código de ejemplo para los drivers de la EEPROM, RTC y sensor de temperatura.

Cargado por

legabu
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
223 vistas4 páginas

Lectura de Temperatura y EEPROM

Este documento describe un proyecto para leer la temperatura y hora usando dispositivos DS1621 y DS1307 respectivamente, y guardar los datos en una memoria EEPROM. Incluye código para inicializar los periféricos, leer los valores de temperatura y hora, y escribirlos en la EEPROM. También incluye código de ejemplo para los drivers de la EEPROM, RTC y sensor de temperatura.

Cargado por

legabu
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd

Circuito para leer la temperatura y hora de la lectura y guardar los datos en una EEPROM;

Crear un proyecto con el nombre T7_E5, copiar y pegar este código en él.

#include <16F876.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP
#use delay(clock=4000000)
#use rs232(baud=9600, xmit=pin_c6, rcv=pin_c7, bits=8,parity=N)
#use i2c(Master,sda=PIN_C4,scl=PIN_C3)

#include <lcd.c>
#include <EEPROM_24512.c> //Ficheros driver de los periféricos
#include <RTC_ds1307.c>
#include <TEMP_ds1621.c>
#include <floatee.c>

int dat_in, cnt, hr,min,sec;


int16 address=0;
int dat_serie[7];
float dato;

#int_rda //Interrupción para el puerto serie


rda_isr()
{
dat_in=getc(); //Lee el puerto serie
printf("\r");
if (dat_in=='2') //Si es "2" se visualizan los primeros datos de la eeprom
{
for(cnt=0;cnt<=6;cnt++) //Lectura de los 7 primeros bytes de la eeprom
{
dat_serie[cnt]=read_ext_eeprom(cnt);
}
for(cnt=0;cnt<=6;cnt++) //Visualización de los 7 primeros bytes de la eeprom
{
printf("Byte %u=%3u \r",cnt,dat_serie[cnt]);
}
}
}

void main() {

lcd_init();
enable_interrupts(int_rda);
enable_interrupts(global);
address=0;

printf("Pulsar 1 para leer datos\r"); //Menú para el terminal serie


printf("Pulsar 2 para visualizar datos\r");

while(1){

if(dat_in=='1') //Si es "1" se inicia la lectura y grabado en la eeprom


{
init_temp(0x01); //Inicializa el DS1621
delay_ms(100);
tiempo(hr,min,sec); //Lee tiempo del DS1307
dato = read_full_temp(0x01); //Lee temperatura del DS1621
WRITE_FLOAT_EXT_EEPROM(address,dato); //Guarda 4 bytes del FLOAT
address=address+4;
WRITE_EXT_EEPROM(address++,hr); //Guarda byte de hora
WRITE_EXT_EEPROM(address++,min); //Guarda byte de minuto
WRITE_EXT_EEPROM(address++,sec); //Guarda byte de segundo
lcd_gotoxy(1,1);
printf(lcd_putc,"Temp=%4.1f C\n",dato); //Visualiza en LCD la temperatura
printf(lcd_putc,"%2u:%2u:%2u",hr,min,sec); //Visualiza en LCD la hora
if (address==0xffff) address=0; //Cuando se termina la eeprom vuelve al principio.
}
}
}

Dentro del mismo proyecto crear un nuevo archivo fuente con el nombre EEPROM_24512.c, copiar y pegar el siguiente
código.

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);
}
Dentro del mismo proyecto crear otro archivo fuente con el nombre RTC_DS1307.c, copiar y pegar el siguiente código.

int BCDaBIN(int bcd){


int varia;
varia = bcd;
varia >>= 1;
varia &= 0x78;
return(varia + (varia >> 2) + (bcd & 0x0f));
}

void tiempo(byte &hor, byte &min, byte &sec){


i2c_start(); //Escritura
i2c_write(0xD0); //Código de escritura
i2c_write(0x00); //Puntero a la primera dirección
i2c_start(); //Lectura
i2c_write(0xD1); //Código de lectura
sec = BCDaBIN(i2c_read()&0x7f); //Lectura de los 7bit de los segundos
min = BCDaBIN(i2c_read()&0x7f); //Lectura de los 7bit de los minutos
hor = BCDaBIN(i2c_read(0)&0x3f); //Lectura de los 7bit de las horas
i2c_stop();
}

Dentro del mismo proyecto crear un archivo fuente más con el nombre RTC_DS1307.c, copiar y pegar el siguiente
código.

void init_temp(int address) {


i2c_start();
i2c_write(0x90|(address<<1)); //Genera primer byte (1001A2A1A0W)
i2c_write(0xee); //Inicia conversión
i2c_stop();
}

float read_full_temp(int address) {


signed int datah;
int datal;
float tura;

i2c_start();
i2c_write(0x90 |(address<<1)); //Genera primer byte (1001A2A1A0-W)
i2c_write(0xaa); //Leer temperatura
i2c_start();
i2c_write(0x91 |(address<<1)); //Genera primer byte (1001A2A1A0-R)
datah=i2c_read(); //Lectura parte alta
datal=i2c_read(0); //Lectura parte baja y NACK
i2c_stop();

tura=datah; //Conversión a flotante


if (datal==128) tura=tura+0.5;
return(tura);
}
Compilador C Ccs Y Simulador Proteus Para Microcontroladores Pic, Eduardo García Breijo

También podría gustarte