#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)
sábado, 30 de enero de 2010
SDCC i2c LM75
Suscribirse a:
Enviar comentarios (Atom)
IRC
#freenode->#usljujuy
No hay comentarios:
Publicar un comentario