Hola a todos,
He vuelto a retomar este fantástico proyecto.
Incluyo el codigo:
#include <16F1518.h>
#fuses XT,NOWDT,NOLVP,NOPROTECT
#use delay (clock=4000000)
#use i2c (Master, sda=PIN_C4, scl=PIN_C3)
//#include <_ds1307.c>
#BYTE TRISA = 0x85 //Variable TRISA en 85h
#BYTE PORTA = 0x05 //Variable PORTA en 05h
#BYTE TRISB = 0x86 //Variable TRISB en 86h
#BYTE PORTB = 0x06 //Variable PORTB en 06h
int ano,mes,dia,dia_set,hor,hor_2,min,min_2,sec,sec_2;
/******************************************************************************
DS1307
******************************************************************************/
void tiempo (byte &ano, byte &mes, byte &dia, byte &dia_set, byte &hor, byte &hor_2, byte &min, byte &min_2, byte &sec, byte &sec_2)
{
//ds1307_init(DS1307_OUT_1_HZ);
//set_tris_A (0x00); // 8 terminales de salida
//set_tris_B (0x00); // 8 terminales de salida
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 =i2c_read()&0x7f; //prueba
//sec = BCDaBIN (i2c_read()&0x7f); //Lectura de los 7 bits de los segundos
sec = (i2c_read()&0x7f); //Lectura de los 4 bits de los segundos
sec_2 = sec>>4;
min = (i2c_read()&0x7f); //Lectura de los 7 bits de los minutos
min_2 = min>>4;
hor = (i2c_read()&0x3f); //Lectura de los 6 bits de los horas
hor_2 = hor>>4;
dia_set = (i2c_read()&0x7); //Lectura de los 3 bits de los dias
dia = (i2c_read()&0x7f); //Lectura de los 6 bits de los dias
mes = (i2c_read()&0x1f); //Lectura de los 5 bits de los meses
ano = (i2c_read(0)&0xff); //Lectura de los 8 bits de los años
i2c_stop();
}
/******************************************************************************
PROGRAMA PRINCIPAL
******************************************************************************/
void main()
{
while(1)
{
tiempo(ano,mes,dia,dia_set,hor,hor_2,min,min_2,sec,sec_2); //Lee tiempo del DS1307
delay_ms(100);
OUTPUT_A(sec_2);
OUTPUT_B(sec);
output_high(PIN_C7);
output_high(PIN_C2);
delay_us(1000);
output_low(PIN_C6);
output_low(PIN_C1);
output_low(PIN_C5);
output_low(PIN_C0);
delay_ms(100);
OUTPUT_A(min_2);
OUTPUT_B(min);
delay_us(1000);
output_high(PIN_C6);
output_high(PIN_C1);
output_low(PIN_C7);
output_low(PIN_C2);
output_low(PIN_C5);
output_low(PIN_C0);
delay_ms(100);
OUTPUT_A(hor_2);
OUTPUT_B(hor);
delay_us(1000);
output_high(PIN_C5);
output_high(PIN_C0);
output_low(PIN_C7);
output_low(PIN_C2);
output_low(PIN_C6);
output_low(PIN_C1);
delay_ms(100);
}
}
El programa lo que hace es enviar en BCD los segundo, minutos y horas.
Lo hace de la siguiente manera:
Envía los segundos, desglosados en 2 partes, la parte alta y la parte baja.
Estas 2 partes van a unos led que se iluminaran acorde con los segundos, para que se iluminen pongo dos bits a 1 que lo que van ha hacer es que el transistor conduzca y así los led se iluminaran.
•La multiplexión de los tubos no es consecutiva, sino alterna, es decir, en un grupo están el 1,3 y 5, y en el otro el 2, 4 y 6. Lo he hecho así para que no se noten diferencias de iluminación entre los dígitos de las horas, minutos, segundos, respectivamente. Entonces en un mismo integrado hay 3 tubos con lo cual envió la información del tubo 1 y los otros tubos el 3 y el 5 también la reciben, pero el ánodo lo controla el PIC, es el PIC el que se encarga de encender y apagar los ánodos de cada tubo para así actualizar la datos.
Hago todo esto igual para los minutos y horas.
El problema es que lo hace tan rápido que en la simulación funciona mal, se mezclan las cosas
Mi nivel de programación como pueden ver es baja sobre todo en I2C.
Subo el esquema del proteus.
Muchas gracias por todo.