Zbernica i2c: hodiny reálneho času s PCF8583P
Zo stránky SensorWiki
Záverečný projekt predmetu MIPS / LS2025 - Filip Boco
Zadanie
Zadaním tohto projektu bolo navrhnúť a realizovať hodiny reálneho času s RTC modulu PCF8583P komunikujúcim cez zbernicu I2C. Systém s mikroprocesorom ATmega328P, ktorý zobrazuje aktuálny čas pomocou UART (PuTTY) alebo LCD displeja.
Súbor:DS138833.jpg RTC čip DS1388.
Literatúra:
Analýza a opis riešenia
V zadaní špecifikovaný RTC modul PCF8583P som pri vypracovaní nepoužil. Opíšte sem čo a ako ste spravili, ak treba, doplňte obrázkami... Podrobne opíšte použité komponenty (okrem základnej dosky s ATmega328P procesorom), pridajte linky na datasheety alebo opis obvodu.

Nezabudnite doplniť schému zapojenia! V texte by ste mali opísať základné veci zo zapojenia, samotná schéma nie je dostačujúci opis.

Algoritmus a program
Algoritmus programu obsahuje hlavičkovú časť programu so zadefinovanými Výpis kódu je nižšie...
/*
uPrijekt MIPS
Filip Boco
Téma: Zbernica i2c: hodiny reálneho času
Poznámka: Namiesto čipu PCF8583P som použil čip DS1388 I2C RTC.
*/
#define F_CPU 16000000UL
#define BAUD 9600
#include <avr/io.h>
#include <util/delay.h>
#include <stdio.h>
#include "i2cmaster.h"
#include "uart.h"
#define DS1388_ADDR 0x68
/*--------------------/ Funkcie na prevod BCD na HEX a HEX na BCD /--------------------*/
static uint8_t bcd2hex(uint8_t val) {
return ((val>>4)*10)+(val&0x0F);
}
static uint8_t hex2bcd(uint8_t val) {
return ((val/10)<<4)|(val % 10);
}
/*--------------------/ I2C scenner na zistenie I2C adresy /--------------------*/
void i2c_scanner(void) {
uart_puts("I2C scanner start...\r\n");
for (uint8_t address = 1; address < 127; address++) {
i2c_start(address << 1); // Shift adresa na zápis (write)
if (i2c_write(0) == 0) {
uart_puts("Device found at 0x");
uart_put_hex(address);
uart_puts("\r\n");
}
i2c_stop();
_delay_ms(10);
}
}
/*--------------------/ Funkcie pre zápis a čítanie času na RTC module /--------------------*/
void set_time_date(uint8_t h, uint8_t m, uint8_t s, uint8_t day, uint8_t date, uint8_t month, uint8_t year) {
i2c_start_wait(DS1388_ADDR<<1 | I2C_WRITE);
i2c_write(0x01); // 0x01 register sekúnd, 0x00 sú desatiny sekundy
i2c_write(hex2bcd(s));
i2c_write(hex2bcd(m));
i2c_write(hex2bcd(h));
i2c_write(hex2bcd(day));
i2c_write(hex2bcd(date));
i2c_write(hex2bcd(month));
i2c_write(hex2bcd(year));
i2c_stop();
}
void read_time_date(uint8_t *h, uint8_t *m, uint8_t *s, uint8_t *day, uint8_t *date, uint8_t *month, uint8_t *year) {
i2c_start_wait(DS1388_ADDR<<1 | I2C_WRITE);
i2c_write(0x01); // 0x01 register sekúnd
i2c_rep_start(DS1388_ADDR<<1 | I2C_READ);
uint8_t sec = i2c_readAck();
uint8_t min = i2c_readAck();
uint8_t hour = i2c_readAck();
uint8_t d = i2c_readAck(); // d - day
uint8_t dt = i2c_readAck(); // dt - date
uint8_t mo = i2c_readAck(); // mo - month
uint8_t yr = i2c_readNak(); // yr - year
i2c_stop();
*s = bcd2hex(sec & 0x7F);
*m = bcd2hex(min);
*h = bcd2hex(hour & 0x3F);
*day = bcd2hex(d);
*date = bcd2hex(dt);
*month = bcd2hex(mo & 0x1F);
*year = bcd2hex(yr);
}
/*--------------------/ Hlavný program /--------------------*/
int main(void) {
i2c_init();
uart_init();
/*uart_puts("DS1388 RTC Test\r\n");*/
/*i2c_scanner();*/
char *days[] = {"Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"};
uint8_t h,m,s,day,date,month,year;
char buf[48];
// Nastavenie času a dátumu
/*set_time_date(6, 39, 0, 5, 13, 6, 25);*/ // 1 = Monday, ...
while (1) {
read_time_date(&h, &m, &s, &day, &date, &month, &year);
sprintf(buf, "%s %02u.%02u.20%02u %02u:%02u:%02u\r", days[day-1], date, month, year, h, m, s);
uart_puts(buf);
_delay_ms(1000);
}
}
#include <avr/io.h>
void adc_init(void); // A/D converter initialization
unsigned int adc_read(char a_pin);
Pridajte sem aj zbalený kompletný projekt, napríklad takto (použite jednoznačné pomenovanie, nemôžeme mať na serveri 10x zdrojaky.zip:
Zdrojový kód: zdrojaky.zip
Overenie
Ako ste overili funkciu, napríklad... Na používanie našej aplikácie stačia dve tlačítka a postup používania je opísaný v sekcii popis riešenia. Na konci uvádzame fotku hotového zariadenia.

Video:
Kľúčové slová 'Category', ktoré sú na konci stránky nemeňte.