Olá,
Neste artigo vamos demonstrar o funcionamento de um relógio com comunicação USI I2C utilizando o pequeno ATtiny85.
O projecto montado numa placa PCB fica compacto, pois com o uso do ATtiny85 com apenas 8 pinos é interessante, no entanto no video que aprestamos abaixo esta em prototipo.
Para este trabalho vamos precisar de:
- 1 Módulo RTC DS1307 Relógio Digital de Precisão
- 1 Display LCD 16×2 HD44780
- 1 chip PCF8574 I2C
- 1 fonte alimentação 5/3.3V Breadboard
- 1 ATtiny85 MCU
O esquema de ligações será igual ao apresentado nesta imagem:
A comunicação é baseada em USI I2C, usei as bibliotecas de um projecto interessante
O Tinusaur.org que recomendo que acompanhem, pois usa-se o pequeno ATtiny85 para vários projectos.
No entanto o projecto Tinusaur não aborda o uso de LCD, por essa razão tive de desenvolver a adaptação para com o uso do PCF8574 conseguir apresentar o relógio no LCD, como podem verificar neste video:
Vejam também a simulação em Proteus:
No entanto entanto já sabem que sou fiel ao AVR Studio7, então, como programar o Attiny85?
Se quase todas as publicações explicam como programar com arduino, e como será programar sem arduino?
Este artigo fica no ar dependente d eum outro artigo que se ligará a este do qual falarei como configurar um ATtiny85 no AVR Studio sem recurso ao Arduino, para isso desenvolvi uma placa muito simples, conforme imagem da qual explicarei no próximo artigo:
Fica para breve o artigo a explicar como tudo acontece 🙂
Um pouco de codigo do main:
/*
*I2C RTC DS1307 AT24C32
*Author: Norlinux | adapted from the Tinusaur Project
*http://www.microelectronic.pt
*https://www.facebook.com/MundoDosMicrocontroladores/
*http://maquina.96.lt
*Released under GPLv3.
*Please refer to LICENSE file for licensing information.
*which can be found at http://www.gnu.org/licenses/gpl.txt
*/
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// ATtiny
// 25/45/85
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#include <avr/io.h>
#include
#include "delay_config.h"
#include <util/delay.h>
#include "USI-I2C/usi_i2c_lcd.h"
#include "USI-I2C_ATtiny/usitwim.h"
#include "USI-DS1307/ds1307tiny.h"
#include
uint8_t ds1307_adjust(void)
{
return ds1307_setdatetime(2018, 05, 18, 5, 20, 34, 00); // Set date/time
}
int main(void)
{
char Horas[16],Data[16];
//uint8_t relogio=0;
//init lcd
USI_LCD_Init();
ds1307_init();
ds1307_adjust();
_delay_ms(10);
while (1)
{
uint8_t year = ds1307_read_reg8(DS1307_REG_YEAR);
uint8_t month = ds1307_read_reg8(DS1307_REG_MONTH);
uint8_t date = ds1307_read_reg8(DS1307_REG_DATE);
uint8_t hours = ds1307_read_reg8(DS1307_REG_HOURS);
uint8_t minutes = ds1307_read_reg8(DS1307_REG_MINUTES);
uint8_t seconds = ds1307_read_reg8(DS1307_REG_SECONDS);
sprintf(Horas,"%02d:%02d:%02d",bcd2bin(hours), bcd2bin(minutes), bcd2bin(seconds));
USI_LCD_gotoxy(0,0);
USI_LCD_Text(Horas);
sprintf(Data,"%04d-%02d-%02d",bcd2bin(year) + 2000, bcd2bin(month), bcd2bin(date));
USI_LCD_gotoxy(0,1);
USI_LCD_Text(Data);
USI_LCD_LED_ONOFF(LED_ON);
_delay_ms(999);
USI_LCD_LED_ONOFF(LED_OFF);
}
}
As bibliotecas do projecto estão disponíveis neste link