Operácie

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.

Celkový pohľad na zariadenie.

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.

Schéma zapojenia.


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.

Aplikácia.

Video:



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