sábado, 30 de enero de 2010

SDCC i2c LM75


#include <pic16f873a.h>
#include <i2c.h>
typedef unsigned int word;
word at 0x2007 CONFIG = _HS_OSC & _WDT_OFF & _PWRTE_ON & _BODEN_ON & _LVP_OFF & _CPD_OFF & _WRT_OFF & _DEBUG_OFF & _CP_OFF;

//-- Pines de conexionado para el LCD
#define RW RA2
#define RS RA1
#define E RA0


//-- Valor inicial del timer0 para hacer una pausa de 10ms
//-- Divisor del prescar a 256
#define T_10ms 61

/*********************************************/
/* Habilitar el dato escrito en el puerto B */
/*********************************************/
void enable()
{
//-- Hay que garantizar un tiempo minimo de 500ns
//-- A 20Mhz, las instrucciones tardan 200ns.
//-- Por eso nos curamos en salud y repetimos la instruccion
//-- tres veces.
E=1; E=1; E=1;
E=0; E=0; E=0;
}

/**********************************/
/* Enviar un comando al LCD */
/**********************************/
void lcd_cmd(unsigned char cmd)
{
RS=0;
PORTB=cmd;
enable();
cmd<<=4;
PORTB=cmd;
enable();
delay(1);
}

/*********************************/
/* Escribir un dato en el lcd */
/*********************************/
void lcd_write(unsigned char car)
{
RS=1;
PORTB=car;
enable();
car<<=4;
PORTB=car;
enable();
delay(1);
}

unsigned char ConfigLM75()
{
// Envia Bit de Start
i2c_SendStart();
i2c_WaitMSSP();

// 2º Envio la direccion del modulo
i2c_SendByte(0b10010000);
i2c_WaitMSSP();
if (i2c_CheckACK()!=0) {
i2c_fail();
return 0; // Ha habido un error, salgo de la rutina
}


i2c_SendByte(0b00000000);
i2c_WaitMSSP();
if (i2c_CheckACK()!=0) {
i2c_fail();
return 0; // Ha habido un error, salgo de la rutina
}

// termino el envio
i2c_SendStop();
i2c_WaitMSSP();

return 1;
}

unsigned char LeerLM75(unsigned char address, unsigned char *datoh, unsigned char *datol)
{
i2c_SendStart();
i2c_WaitMSSP();

i2c_SendByte(address);

i2c_WaitMSSP();
if (i2c_CheckACK()!=0) {
i2c_fail();
return 0; // Ha habido un error, salgo de la rutina
}

*datoh=i2c_ReadByte();

i2c_SendAck();
i2c_WaitMSSP();

*datol=i2c_ReadByte();

// Mando NACK
i2c_SendNack();
i2c_WaitMSSP();

// Mando el Stop
i2c_SendStop();
i2c_WaitMSSP();

return 1;
}

void DEC_ASCII(unsigned char dato, unsigned char *D1, unsigned char *D2,unsigned char *D3)
{
*D1 = dato / 100;
*D2 = (dato % 100) / 10;
*D3 = (dato % 100) % 10;

*D1 = 0b00110000 | *D1;
*D2 = 0b00110000 | *D2;
*D3 = 0b00110000 | *D3;
}
/*-----------------------------------------------*/
void main(void)
{
unsigned char ret;
unsigned char datoh, datol, D1, D2, D3;

TRISB=0b00001111;
TRISA=0b00000000;
ADCON1=0x06;

//-- Configurar temporizador para hacer pausas
T0CS=0; PSA=0;
//-- Configurar el prescaler (division entre 64)
PS2=1; PS1=1; PS0=1;

i2c_configure();
//-- Pausa inicial
delay(10);

//Inicializando el LCD
RW=0; E=0;
lcd_cmd(0b00101000);
lcd_cmd(0b00000110);
lcd_cmd(0b00001110);
lcd_cmd(0b00000010);
lcd_cmd(0b00000001);

ConfigLM75();

delay(10);

while(1){
lcd_cmd(0b00000010);
delay(10);
ret=LeerLM75(0b10010001, &datoh, &datol);
if (ret==1) {
DEC_ASCII(datoh, &D1, &D2, &D3);
lcd_write(D1);
lcd_write(D2);
lcd_write(D3);
}else{
LED = 1;
}
}
}

Las resistencias pullup son de 4K7 (Lauraa n.n)


No hay comentarios:

IRC

#freenode->#usljujuy

Seguidores

Eventos n_n

Tira Ecol Nano,Bilo y Luca