Hola amigos del foro:
Estoy tratando de inicializar el reloj de tiempo real ds1307 y no lo consigo.
El hardware anda bien porque en lenguaje c de ccs lo activo y puedo hacerlo funcionar correctamente.
El ds1307 está conectado a un pic18f4550 mediante los pines rb0 en sda y rb1 en scl. Uso un cristal de 4mhz.
El código que estoy usando es el que sigue más abajo.
Ni siquiera puedo activar la salida de onda cuadrada de 1hz.
Si alguien me puede dar una mano se lo agradezco.
Saludos.
Jukinch
/*
Nombre del Programa: reloj.c
Compilador: c18
Fecha:
Autor: Terodáctilo y Jukinch
Descripción: uso de rtc con placa entrenadora
------------------------------------------------------------
CONEXIONES:
lcd conectado en PUERTO D
bus de datos en el nible alto conector idc rb 4 a 7
DATA7 PUERTO D.7
DATA6 PUERTO D.6
DATA5 PUERTO D.5
DATA4 PUERTO D.4
bus de control en el nible bajo conector idc rb 0 a 3
E_PIN PUERTO D.3
RS_PIN PUERTO D.2
RW_PIN PUERTO D.1
------------------------------------------------------------
MODULO I2C conector idc rb 0 a 3
en RB0 está el SDA SERIAL CLOCK
en RB1 está el SCL SERIAL DATA
------------------------------------------------------------
PULSADOR DE control RC0 en conector idc rC 0 a 3
LED DE CONTROL RC1 en conector idc rC 0 a 3
------------------------------------------------------------
*/
/*Includes*/
#include "p18F4550.h"
#include "xlcd.h"
#include "delays.h"
#include <stdlib.h> //Libreria para conversiones.
#include <i2c.h> //Libreria para bus i2c
/* Bits de configuración*/
#pragma config FOSC = XTPLL_XT,FCMEN = OFF,IESO = OFF,PLLDIV = 1, CPUDIV = OSC1_PLL2
#pragma config PWRT = ON,BOR = OFF,BORV = 0
#pragma config WDT = OFF,WDTPS = 32768
#pragma config MCLRE = ON,LPT1OSC = OFF,PBADEN = OFF,CCP2MX = OFF
#pragma config STVREN = OFF,LVP = OFF,XINST = OFF,DEBUG = OFF
#pragma config CP0 = OFF,CP1 = OFF,CP2 = OFF
#pragma config CPB = OFF,CPD = OFF
#pragma config WRT0 = OFF,WRT1 = OFF,WRT2 = OFF
#pragma config WRTB = OFF,WRTC = OFF,WRTD = OFF
#pragma config EBTR0 = OFF,EBTR1 = OFF,EBTR2 = OFF
#pragma config EBTRB = OFF
/*declaración de DEFINICIONES*/
#define CLOCK 4000000
#define TCY 1/CLOCK
#define BITRATE 100000
#define teclaDebugger PORTCbits.RC0 // tecla para avanzar en programa para controlar errores
/*declaración de variables*/
unsigned char hour=0;
unsigned char minutes=0;
unsigned char seconds=0;
unsigned char day=0;
unsigned char month=0;
unsigned char year=0;
unsigned char texto=0;
/*declaración de funciones*/
void DelayFor18TCY(void);
void DelayPORXLCD(void);
void DelayXLCD(void);
void EsperaBotonDebugger(void);
/*****Programa principal******/
/********************************************************************/
void main (void)
{
/*****configuro los puertos******/
TRISBbits.TRISB7=7; // B0=salida
TRISBbits.TRISB6=6; // B0=salida
TRISBbits.TRISB5=5; // B0=salida
TRISBbits.TRISB4=4; // B0=salida
TRISBbits.TRISB3=3; // B0=salida
TRISBbits.TRISB2=2; // B0=salida
TRISBbits.TRISB0=1; // B0=ENTRADA SDA SERIAL CLOCK
TRISBbits.TRISB1=1; // B1=ENTRADA SCL SERIAL DATA
TRISD=0b00000000; // Puerto D7:0 como salidas
LATD=0b00000000; //todas las salidas abajo
TRISCbits.TRISC0=1; // C0=ENTRADA // botón para hacer control del programa
TRISCbits.TRISC1=0; // C1=salida // led para control del programa
/***** preparo lcd para escribir ******/
Delay10KTCYx(10000); //Retardo para esperar que pase cualquier transitorio
OpenXLCD(FOUR_BIT&LINES_5X7); //inicializamos LCD con varias lineas y caracteres 5x7
WriteCmdXLCD(0x01); // Borra pantalla y vuelve al origen.-
while(BusyXLCD()){} //Preguntamos al RW si el display esta ocupado
WriteCmdXLCD(0x80); // Nos posicionamos en la la posicion x=0 Y=0
while(BusyXLCD()){}
putrsXLCD("PRUEBA RTC");
while(BusyXLCD()){}
WriteCmdXLCD(0xC0); //Nos posicionamos en la posición 8
while(BusyXLCD()){}
putrsXLCD("PULSE RC.0");
EsperaBotonDebugger();
Delay10KTCYx(100000); //Retardo para esperar que pase cualquier transitorio
WriteCmdXLCD(0x01); // Borra pantalla y vuelve al origen.-
while(BusyXLCD()){} //Preguntamos al RW si el display esta ocupado
WriteCmdXLCD(0x80); // Nos posicionamos en la la posicion x=0 Y=0
while(BusyXLCD()){}
putrsXLCD("PULSE para init");
EsperaBotonDebugger();
/***** rutina de inicialización de rtc ***************************************/
OpenI2C(MASTER,SLEW_OFF); // inicializo el i2c en modo maestro y 100khz
ADCON0 = 0X00;
ADCON1 = 0X0F;
CMCON = 0X07;
SSPADD =9; // ((CLOCK/BITRATE)/4)-1 = 9 for 100kHz @ 20MHz
IdleI2C();
StartI2C();
WriteI2C(0b11010000); // escribe la dirección del rtc (11010000= hex D0)
// y le dice que se va a escribir con el bit0 en 0
IdleI2C();
WriteI2C(0b00000000); // pone el puntero del rtc en dirección 00h
StartI2C();
WriteI2C(0b00000000); // GRABAMOS EN EL PRIMER REGISTRO 00 SEGUNDOS
// Y HABILITAMOS EL OSCILADOR con el octavo bit apagado
IdleI2C();
WriteI2C(0b00000010); // GRABAMOS EN EL SEGUNDO REGISTRO 23 MINUTOS
IdleI2C();
WriteI2C(0b00010000); // GRABAMOS EN EL TERCER REGISTRO configura reloj formato 24 hs
IdleI2C();
WriteI2C(0b00000110); // GRABAMOS EN EL CUARTO REGISTRO EL NOMBRE DE DIA DE LA SEMANA
IdleI2C();
WriteI2C(0b00011000); // GRABAMOS EN EL QUINTO REGISTRO EL NUMERO DE DIA DEL MES
IdleI2C();
WriteI2C(0b00000110); // GRABAMOS EN EL SEXTO REGISTRO EL MES
IdleI2C();
WriteI2C(0b00010000); // GRABAMOS EN EL SÉPTIMO REGISTRO EL AÑO
IdleI2C();
WriteI2C(0b00010000); // GRABAMOS EL OCTAVO Y ULTIMO REGISTRO
// Configura la salida del oscilador de onda cuadrada en 1hz
IdleI2C();
StopI2C();
Delay10KTCYx(100000); //Retardo para esperar que pase cualquier transitorio
WriteCmdXLCD(0x01); // Borra pantalla y vuelve al origen.-
while(BusyXLCD()){} //Preguntamos al RW si el display esta ocupado
WriteCmdXLCD(0x80); // Nos posicionamos en la la posicion x=0 Y=0
while(BusyXLCD()){}
putrsXLCD("YA INICIALIZO");
EsperaBotonDebugger();
// ********************************** rutina de init rtc *********************
WriteCmdXLCD(0x01); // Borra pantalla y vuelve al origen.-
while(BusyXLCD()){} //Preguntamos al RW si el display esta ocupado
WriteCmdXLCD(0x80); // Nos posicionamos en la la posicion x=0 Y=0
while(BusyXLCD()){}
putrsXLCD("i2c cargado");
WriteCmdXLCD(CURSOR_OFF & BLINK_OFF);
Delay10KTCYx(100000); //Retardo para ver lo escrito en lcd
EsperaBotonDebugger();
while(1)
{
WriteCmdXLCD(0x01); // Borra pantalla y vuelve al origen.-
while(BusyXLCD()){} //Preguntamos al RW si el display esta ocupado
WriteCmdXLCD(0x80); // Nos posicionamos en la la posicion x=0 Y=0
while(BusyXLCD()){}
putrsXLCD("Lectura i2c");
EsperaBotonDebugger();
IdleI2C();
StartI2C();
WriteI2C(0b11010001); // escribe dirección del rtc y le dice que se va a leer
WriteI2C(0x00); // pone el puntero del rtc en dirección 00h
seconds=ReadI2C();
AckI2C();
minutes=ReadI2C();
AckI2C();
hour=ReadI2C();
AckI2C();
minutes=ReadI2C();
AckI2C();
seconds=ReadI2C();
AckI2C();
day=ReadI2C();
AckI2C();
month=ReadI2C();
AckI2C();
year=ReadI2C();
NotAckI2C();
StopI2C();
WriteCmdXLCD(0x01); // Borra pantalla y vuelve al origen.-
while(BusyXLCD()){} //Preguntamos al RW si el display esta ocupado
WriteCmdXLCD(0x80); // Nos posicionamos en la la posicion x=0 Y=0
while(BusyXLCD()){}
putrsXLCD("termino lectura");
WriteCmdXLCD(CURSOR_OFF & BLINK_OFF);
EsperaBotonDebugger();
WriteCmdXLCD(0x01); // Borra pantalla y vuelve al origen.-
while(BusyXLCD()){} //Preguntamos al RW si el display esta ocupado
WriteCmdXLCD(0x80); // Nos posicionamos en la la posicion x=0 Y=0
while(BusyXLCD()){}
putrsXLCD("comienza display");
WriteCmdXLCD(CURSOR_OFF & BLINK_OFF);
EsperaBotonDebugger();
WriteCmdXLCD(0x01); // Borra pantalla y vuelve al origen.-
while(BusyXLCD()){} //Preguntamos al RW si el display esta ocupado
WriteCmdXLCD(0x80); // Nos posicionamos en la la posicion x=0 Y=0
EsperaBotonDebugger();
// btoa(hour,texto); // convierto 8 bits a caracter ascii
while(BusyXLCD()){}
putsXLCD(texto);
while(BusyXLCD()){}
EsperaBotonDebugger();
putrsXLCD(":");
while(BusyXLCD()){} //Preguntamos al RW si el display esta ocupado
btoa(minutes,texto); // convierto 8 bits a caracter ascii
while(BusyXLCD()){}
putsXLCD(texto);
while(BusyXLCD()){}
EsperaBotonDebugger();
putrsXLCD(":");
while(BusyXLCD()){} //Preguntamos al RW si el display esta ocupado
btoa(seconds,texto); // convierto 8 bits a caracter ascii
while(BusyXLCD()){}
putsXLCD(texto);
while(BusyXLCD()){}
WriteCmdXLCD(CURSOR_OFF & BLINK_OFF);
Delay10KTCYx(500); //Retardo para poder refrescar pantalla
WriteCmdXLCD(0x01); // Borra pantalla y vuelve al origen.-
while(BusyXLCD()){} //Preguntamos al RW si el display esta ocupado
WriteCmdXLCD(0x80); // Nos posicionamos en la la posicion x=0 Y=0
while(BusyXLCD()){}
putrsXLCD("termino display");
WriteCmdXLCD(CURSOR_OFF & BLINK_OFF);
EsperaBotonDebugger();
}
}// final de main
/*Funciones*/
void DelayFor18TCY(void)
{
Delay1KTCYx(1); //Retardo de 1mSeg
}
void DelayPORXLCD(void)
{
Delay1KTCYx(180); //Delay 15 mSeg
}
void DelayXLCD(void)
{
Delay1KTCYx(60);
}
void EsperaBotonDebugger(void)
{
while (PORTCbits.RC0==0)
{
}
Delay10KTCYx(10000); //Retardo para ver lo escrito en lcd
LATCbits.LATC1=1; // ENCIENDO LED C1
Delay10KTCYx(10000); //Retardo para ver lo escrito en lcd
LATCbits.LATC1=0; // APAGO LED C1
Delay10KTCYx(10000); //Retardo para ver lo escrito en lcd
LATCbits.LATC1=1; // ENCIENDO LED C1
Delay10KTCYx(10000); //Retardo para ver lo escrito en lcd
LATCbits.LATC1=0; // APAGO LED C1
Delay10KTCYx(10000); //Retardo para ver lo escrito en lcd
LATCbits.LATC1=1; // ENCIENDO LED C1
Delay10KTCYx(10000); //Retardo para ver lo escrito en lcd
LATCbits.LATC1=0; // APAGO LED C1
Delay10KTCYx(10000); //Retardo para ver lo escrito en lcd
}