GRACIAS:
Como siempre angelgris está ahí!!
podrias pasarme en fichero para incluirlo y el Hardi2c.c del que se refiere la libreria.
he estado retocando la libreria de hitech y me da que no esta bien tanta definicion de pines y puertos, algo no lo reconoce bien o no lo ejecuta bien en un pic16.
//********************************************************************
// INCLUDES NECESARIOS
//********************************************************************
#include <pic16f1937.h>
#include <htc.h>
#include <EEPROM_ROUTINES.H>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
//********************************************************************
//DEFINEs PRINCIPALES
//********************************************************************
#define _XTAL_FREQ 10000000
#define PIC_CLK 10000000 // cristal 10MHz
#define I2C_BAUD 100000 // velocidad 100 KHz
//CONFIGURACION DE LA LCD
#define LcdControlPort PORTC // Uso el puerto A para los bits de control
#define LcdRWBit 1 // El bit 2 del puerto A para RW
#define LcdRSBit 0 // El bit 3 del puerto A para RS
#define LcdENBit 2 // El bit 1 del puerto A para EN
#define LcdDataPort PORTA // Uso el puerto D para los datos
#define LcdD4 0 // Solo utilizar para protocolo de 4 Bits(USA 0, AL 3)
//
//********************************************************************
//OTROS INCLUDEs
//********************************************************************
#include <LIB_LCD.H>
//
//********************************************************************
//FUNCIONES DE BITS
//********************************************************************
#define set_bit(ADDRESS,BIT) (ADDRESS |= (1<<BIT))
#define clear_bit(ADDRESS,BIT) (ADDRESS &= ~(1<<BIT))
#define flip_bit(ADDRESS,BIT) (ADDRESS ^= (1<<BIT))
#define test_bit(ADDRESS,BIT) (ADDRESS & (1<<BIT))
//
//********************************************************************
//DEFINICION DE VARIABLES
//********************************************************************
unsigned char data1,i;
char text[10];
unsigned char respuesta;
unsigned char dato;
char RW;
//
//********************************************************************
//***************************RUTINAS**********************************
//********************************************************************
/**************************************************************************
* Libreria para protocolo I2C Master por HardWare para HiTech *
***************************************************************************
***************************************************************************
* *
* Antes de incluir este archivo en nuestro programa hay que definir *
* algunos parametros. Estos son *
* *
* PIC_CLK (se usa para calcular el valor de SSPADD) *
* I2C_BAUD (velocidad de transferencia) *
* *
***************************************************************************
***************************************************************************
* *
* En esta libreria se encuentran las siguientes funciones *
* *
* setup_i2c(char) (inicializa el puerto I2C) *
* start_i2c() (envia start, inicia transmision) *
* rstar_i2c() (envia restart, reinicia transmision) *
* stop_i2c() (envia stop, termina transmision) *
* write_i2c(char) (envia un byte) *
* read_i2c(char) (recibe un byte y envia ack o noack) *
* *
* La funcion write_i2c() devuelve 0 si el dispositivo responde o 1 si el *
* dispositivo no responde. *
* *
* A la funcion read_i2c() hay que pasarle 0 si se quiere responder al *
* disipositivo o 1 si no se quiere responder *
* *
* En esta libreria estan definidos los parametros I2C_MASTER, I2C_SLAVE, *
* I2C_10BIT_ADDRESS. Eston son utilizados en la funcion setup_i2c(char) *
* *
* Tambien estan definidos ACK y NOACK que son los utilizados para *
* responder o no al dispositivo *
* *
***************************************************************************
* Ejemplo de configuracion y utilizacion
#define PIC_CLK 10000000 // cristal 10MHz
#define I2C_BAUD 100000 // velocidad 100 KHz
#include "HardI2c.c"
void main (void);
{
unsigned char respuesta;
unsigned char dato;
......
......
......
setup_i2c (I2C_MASTER);
start_i2c();
respuesta = write_i2c (0b10101110); // comunicacion para escribir en una 24C02C
if (respuesta == ACK)
{
write_i2c (0x00); // indico la direccion a escribir
write_i2c (0xF5); // escribo el dato F5
write_i2c (0x06); // escribo el dato 06
}
stop_i2c();
// colocar un delay necesario para que termine de grabar la memoria
start_i2c();
respuesta = write_i2c (0b10101110); // comunicacion para escribir en una 24C02C
if (respuesta == ACK)
{
write_i2c (0x00); // indico la direccion de memoria
rstart_i2c(); // reinicio la transmisión
respuesta = write_i2c (0b10101111); // comunicacion para leer en una 24C02C
if (respuesta == ACK)
{
dato = read_i2c (ACK); // leo el dato y respondo
dato = read_i2c (NOACK); // leo el dato y no respondo
}
}
stop_i2c();
}
*/
#if defined (PIC_CLK) && defined (I2C_BAUD)
#define I2C_MASTER 0x38
#define I2C_SLAVE 0x26
#define I2C_10BIT_ADDRESS 0x01
#ifndef ACK
#define ACK 0
#endif
#ifndef NOACK
#define NOACK 1
#endif
void setup_i2c (char x)
{
TRISC3 = 1;
TRISC4 = 1;
SSPSTAT = 0;
SSPCON = x;
SSPCON2 = 0;
if (SSPM3 == 1) SSPADD = (unsigned char)((PIC_CLK/(4*I2C_BAUD)) - 1);
}
char start_i2c (void)
{
while (( SSPCON2 & 0x1F ) || RW );
SEN = 1;
return !BCLIF;
}
void rstart_i2c (void)
{
while (( SSPCON2 & 0x1F ) || RW );
RSEN = 1;
}
void stop_i2c (void)
{
while (( SSPCON2 & 0x1F ) || RW );
PEN = 1;
}
char write_i2c (unsigned char data)
{
if (SSPM3 == 1)
{
while (( SSPCON2 & 0x1F ) || RW );
SSPBUF = data;
while (RW == 1);
return ACKSTAT;
}
else
{
SSPBUF = data;
CKP = 1;
return 0;
}
}
unsigned char read_i2c (unsigned char respuesta)
{
unsigned char dato;
if (SSPM3 == 1)
{
while (( SSPCON2 & 0x1F ) || RW );
RCEN = 1;
while (( SSPCON2 & 0x1F ) || RW );
dato = SSPBUF;
while (( SSPCON2 & 0x1F ) || RW );
ACKDT = respuesta;
ACKEN = 1;
return dato;
}
else
{
dato = SSPBUF;
return dato;
}
}
#else
#error Faltan definir parametros
#endif
//********************************************************************
//ROUTINE FOR INICIALICE ALL PORTS AND DEVICES OF SYSTEM
//********************************************************************
void init(void)
{
//OSCCON = 0b11101011; //RELOJ INTERNO A 4MHz
//OSCCON = 0b11101011;//OSCCON = 0b11101011; //RELOJ INTERNO
OSCTUNE = 0b00000000;
INTCON=0b00000000;//DESABILITA LAS INTERRUPCIONES
FVRCON = 0b10000011; //REGULADOR DE VOLTAJE lo cambiamos en cada lectura (depende de que midamos)
//BIT 7: 0- APAGADO 1- ENCENDIDO
//INIC PORTA
//IOCA = 0x00; WPUA = 0x00;
PORTA = 0x00; LATA = 0x00; ANSELA = 0b11100000; TRISA = 0b11100000;
//INIC PORTB
//IOCB = 0x00;
WPUB = 0X00;
PORTB = 0x00; LATB = 0x00; ANSELB = 0b00011111; TRISB = 0b11011111;//ver en ansel b el rb0 si es dig o ana (cap)
//INIC PORTC
//PORTC = 0x00; LATC = 0x00; TRISC = 0b00000000;
//INIC PORTD
PORTD = 0x00; LATD = 0x00; ANSELD = 0b00000000; TRISD = 0b00000000; //COMPRUEBA LAS ENTRADAS PARA LAS ANALOGICAS E/V
//INIC PORTE
PORTE = 0x00; LATE = 0x00; ANSELE = 0x00; TRISE = 0b00000001; //
//
IOCIF=0;
IOCBF = 0b00000000;
IOCIF=0;
InitLcd();
di();
IOCBF = 0b00000000;
IOCIF=0;
}
//********************************************************************
//RUTINA DE INTERRUPCIONES
//********************************************************************
static void interrupt isr(void)
{
}//fin de isr
//
//********************************************************************
//RUTINA PRESENTA EN LCD
//********************************************************************
//
void SHOW_LCD(void)
{
//char * SHOW_TEMP;
//int * seba;
ClearLcd();
GotoxyLcd (1,1);
WriteStrLcd ("TEMP= ");
//itoa(text,MCP,10);
GotoxyLcd (7,1);
//WriteStrLcd(dato);
//GotoxyLcd (12,1);
//WriteStrLcd (" ßC ");
__delay_ms(2000);
}
//*********************************************************************************
//**************************PROGRAMA PRINCIPAL*************************************
//*********************************************************************************
void main(void)
{
init();
setup_i2c (I2C_MASTER);
start_i2c();
respuesta = write_i2c (0b10100000); // comunicacion para escribir en una 24C02C
if (respuesta == ACK)
{
write_i2c (0x00); // indico la direccion a escribir
write_i2c (0xF5); // escribo el dato F5
write_i2c (0x06); // escribo el dato 06
}
stop_i2c();
// colocar un delay necesario para que termine de grabar la memoria
__delay_ms(1000);
start_i2c();
respuesta = write_i2c (0b10100000); // comunicacion para escribir en una 24C02C
if (respuesta == ACK)
{
write_i2c (0x00); // indico la direccion de memoria
rstart_i2c(); // reinicio la transmisión
respuesta = write_i2c (0b10100001); // comunicacion para leer en una 24C02C
if (respuesta == ACK)
{
dato = read_i2c (ACK); // leo el dato y respondo
dato = read_i2c (NOACK); // leo el dato y no respondo
}
}
stop_i2c();
SHOW_LCD();
}
¿como veis las cosas tan claras?, donde puedo mirar para enterarme más?
ClearLcd();
GotoxyLcd (1,1);
WriteStrLcd ("sensor mcp9804");
__delay_ms(10);
start_i2c();
respuesta = write_i2c (0b10010010);
if (respuesta == ACK)
{
write_i2c (0x01);
write_i2c (0x00);
write_i2c (0x00);
}
stop_i2c();
__delay_ms(10);
while(1)
{
start_i2c();
respuesta = write_i2c (0b10010010);
if (respuesta == ACK)
{
write_i2c (0x05);
}
//rstart_i2c();
start_i2c();
respuesta = write_i2c (0b10010011);
if (respuesta == ACK)
{
// write_i2c (0x00);
MSB = read_i2c (ACK);
// dato = read_i2c (NOACK);
LSB = read_i2c (NOACK);
}
stop_i2c();
//convertir
MSB = MSB & 0x1F;
if ((MSB & 0x10)== 0x10)
{
MSB = MSB & 0x0F;
TEMP = 256 - (MSB*16 + LSB /16);
}
else
{
TEMP = (MSB*16 + LSB /16);
}
ClearLcd();
GotoxyLcd (1,1);
WriteStrLcd ("TEMP= ");
itoa(text,TEMP,10);
GotoxyLcd (7,1);
WriteStrLcd(text);
__delay_ms(100);
}
#define PIC_CLK 16000000 // cristal 10MHz para lib de i2c
#define _XTAL_FREQ 16000000 //para los delays
#define I2C_BAUD 100000 // velocidad 100 KHz