RTC DS1302 Relógio Digital com LCD

Ola,

Vamos iniciar com RTC (real time clock ), neste caso podemos comprar um DS1302 por cerca de 1€.

Deparei-me com alguma dificuldade em colocar em funcionamento o DS1302 com a biblioteca que tinha encontrado, então decidi pegar em algum código existente e polir de forma a criar uma biblioteca light com as funcionalidades básicas principais.

Esta biblioteca foi testada em Atmega128, mas certamente que poderá ser usada em vários microcontroladores.

No manual do DS1302 poderá entender o funcionamento do RTC e quais os pinos que estão disponíveis para ligar ao uC.

Na biblioteca esta incluído uma estrutura que terá de ser inicializada no main do programa, um dos truques fundamentais é 1º “acertar” as horas e depois retirar essas linhas deixando o DS1302 gerir e guardar na própria pilha, por isso é que ela é imprescindível.

Então vejamos, temos de acertar as horas deste modo:

    RTC2_VALUE->day=27;

       RTC2_VALUE->month=1;

       RTC2_VALUE->year=17;

       RTC2_VALUE->wday=5;

       RTC2_VALUE->hours=21;

       RTC2_VALUE->minutes=4;

       RTC2_VALUE->seconds=00;

       rtc_set_datetime(RTC2_VALUE);

Enviamos o programa para o uC, e retiramos estas linhas de modo ao programa correr apenas com o relógio.

 

Abaixo coloco o código geral e o modo de funcionamento, utilizo um LCD 16×2 já explicado aqui, com as bibliotecas disponíveis também neste site.

 

DS1302 RTC Atmega128
/*
 * New_Lib_CS1302.c
 *
 * Created: 26-01-2017 20:43:29
 *  Author: User
 */ 


#include <avr/io.h>
#include <stdio.h>
#include <avr/interrupt.h>
#ifndef F_CPU
#define F_CPU 8000000UL
#endif
#include <util/delay.h>
#include <avr/sfr_defs.h>	
#include "lcd/lcd_lib.h"
#include "DS1302.h"



int main(void)
{
    	char buf[24] = {0};
    	char buf1[24] = {0};
	LCDinit();
	rtc_init();
	RTC2_VALUE->day=27;
	RTC2_VALUE->month=1;
	RTC2_VALUE->year=17;
	RTC2_VALUE->wday=5;
	RTC2_VALUE->hours=21;
	RTC2_VALUE->minutes=4;
	RTC2_VALUE->seconds=00;
	rtc_set_datetime(RTC2_VALUE);
	while(1)
    {
	rtc_update(RTC2_VALUE);
		sprintf(buf, "%02i/%02i/20%02i",RTC2_VALUE->day, RTC2_VALUE->month,RTC2_VALUE->year);
		sprintf(buf1, "%02i:%02i:%02i",RTC2_VALUE->hours,RTC2_VALUE->minutes, RTC2_VALUE->seconds);
		LCDprintXY(buf,0,0);
		LCDprintXY(buf1,0,1);
		_delay_ms(1000);
	   
    }

 

Exemplifico com um pequeno video para aferirem o funcionamento do DS1302, no entanto fica aqui o compromisso que irei incrementar funcionalidades ao trabalho inicial por isso a escolha do Atmega128.

Espero que gostem.

Deixe uma resposta

Your email address will not be published.

www.000webhost.com