DS1307 napajanje. Moja bilježnica: biblioteka DS1307

DS1307 se još naziva i RTC (Sat realnog vremena). Ovaj čip je sat i kalendar u realnom vremenu. Komunikacija s mikro krugom se odvija preko I 2 C sučelja. Njegova prednost je što radi (broji vrijeme) kada je glavno napajanje isključeno iz rezervnog izvora napajanja od 3 volta (na primjer, iz CR3022 baterije). Ali DS1307 ima jedan nedostatak: ne provjerava da li su uneseni podaci tačni. Za rad s mikro krugom trebat će vam minimalni komplet: kvarc na 32768Hz, 3-voltna baterija i dva otpornika od 4,7 kOhm. Šema povezivanja DS1307:

Rad sa DS1307 u BASCOM-AVR

Da biste započeli rad s mikrokolo, trebate konfigurirati portove na koje je mikrokolo spojeno da biste to učinili, koristite naredbu Config:
Config Sda =(Port mikrokontrolera na koji je spojena SDA noga DS1307 čipa)
Config Scl =(Priključak mikrokontrolera na koji je spojena SCL noga DS1307 čipa)
Na primjer:
Config Sda = Portb.1
Config Scl = Portb.0

Nakon konfigurisanja portova, možete početi raditi s čipom: čitati i pisati podatke. Vrijeme i datum sa DS1307 čipa mogu se pročitati ovako:

I2cstart I2cwbyte &HD0 I2cwbyte &H00 I2cstart I2cwbyte &HD1 I2crbyte (varijabla u koju upisujemo sekunde), Ack I2crbyte (varijabla u koju upisujemo minute), Ack I2crbyte (varijabla u kojoj upisujemo sate), Ack I2crbyte u koju upisujemo (varijabla) upisujemo broj dana u sedmici), Ack I2crbyte (varijabla u koju upisujemo datum), Ack I2crbyte (varijabla u koju upisujemo broj mjeseca), Ack I2crbyte (varijabla u koju upisujemo godinu), Nack I2cstop

Nakon čitanja podataka, potrebno ih je pretvoriti u decimalni format, ovako:
(promenljiva sekunda) = Makedec((promenljiva sekunda) )
(promenljiva minuta) = Makedec((promenljiva minuta) )
(varijabla sata) = Makedec((varijabla sata) )
(promenljiva dana u nedelji) = Makedec((promenljiva dana u nedelji) )
(datum varijabla) = Makedec((datum varijabla) )
(mjesečna varijabla) = Makedec((mjesečna varijabla) )
(godišnja varijabla) = Makedec((godišnja varijabla) )

Evo primjera čitanja vremena i datuma i pretvaranja u decimalni format:

I2cstart I2cwbyte &HD0 I2cwbyte &H00 I2cstart I2cwbyte &HD1 I2crbyte Seco , Ack I2crbyte Mine , Ack I2crbyte Sat , Ack I2crbyte Dan , Ack I2crbyte Dat , Ack I2crbyte Idec, Ack I2crbyte Idec ( Mesec I2crbyte Idec 2 seco M) ine = Makedec(moj) Sat = Makedec(sat) Dan = Makedec(dan) Datum = Makedec(dat) Mjesec = Makedec(mjesec) Godina = Makedec(godina)

Naučili smo kako čitati podatke, a sada pokušajmo zapisati podatke u DS1307. Volim ovo:
(Varijabla koju ćemo zapisati) = Makebcd((Varijabla koju ćemo zapisati) )
I2cstart
I2cwbyte&HD0
I2cwbyte(Ćelija u koju ćemo upisati podatke)
I2cwbyte(Varijabla koju ćemo zapisati)
I2cstop

Imajte na umu da je komanda Makebcd pretvara varijablu u binarni decimalni format. Brojevi i oznake ćelija:

Evo primjera pisanja varijable sekundi:
Seco = Makebcd(seco)
I2cstart
I2cwbyte&HD0
I2cwbyte 0
I2cwbyte Seco
I2cstop
Usput, treba napomenuti da kada se DS1307 pokrene prvi put (na primjer, pri povezivanju rezervne baterije), mikrokolo će vratiti vrijednost od 80 u sekundi, što znači da je sat zaustavljen. Da biste ih pokrenuli, zapišite vrijednost 1 u sekundama. Ako DS1307 vrati vrijednost od 255 ili 168 prilikom čitanja bilo kakvih podataka, to znači da čip nije ispravno povezan ili da nema rezervne baterije.

Praktičan rad sa DS1307 čipom

Pokušajmo sada raditi s DS1307 čipom u praksi: sastavite jednostavan sat sa podešavanjem vremena pomoću dugmadi. Da bismo to učinili, uzmimo sam DS1307 čip, Attiny2313 mikrokontroler, LCD indikator na HD44780 kontroleru i nekoliko diskretnih komponenti. Hajde da sastavimo jednostavan dijagram:

I napišimo jednostavan program koristeći stečeno znanje:

$regfile = "attiny2313.dat" $crystal = 4000000 Config Lcdpin = Pin , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , Db7 = Portb.7 , E = Portb.3 , Rs = Portb , Rs = Portb. .2 Config Lcd = 16 * 2 Config Pind.5 = Input Config Pind.4 = Input Config Sda = Portb.1 Config Scl = Portb.0 Dim Seco As Byte Dim Mine As Byte Dim Hour As Byte Initlcd Cls Kursor Isključen Do I2cstart I2cwbyte &HD0 I2cwbyte &H00 I2cwbyte I2cwbyte &HD1 I2crbyte Seco , Ack I2crbyte Mine , Ack I2crbyte Sat , Nack I2cstop Seco = Makedec(seco) Mine = Makedec(mine) Hour = Makedec (sat1c) Hour L. ":" ; Mine; ":" ; seco; " " Ako je Pind.5 = 0 Onda Incr Mine = Makebcd(moj) I2cstart I2cwbyte &HD0 I2cwbyte 1 I2cwbyte Mine I2cstop Waitms 100 Kraj Ako je Pind.4 = 0 Onda Incr Hour Sat = Makebcd(hour) I2cwbyte I2cwbyte I2cwbyte I2cwbyte Sat I2cstop Waitms 100 End If Loop End

DS1307- čip za sat realnog vremena sa interfejsom I2C(TWI). Sat/kalendar pohranjuje sljedeće informacije: sekunde, minute, sate, dan, datum, mjesec i godinu. Kraj mjeseca se automatski prilagođava za mjesece s manje od 31 dana, uključujući prilagođavanje za prijestupne godine. Sat radi u 24-satnom ili 12-satnom formatu sa AM/PM indikatorom. DS1307 ima ugrađeno kolo za praćenje napajanja koje detektuje gubitak struje i automatski prebacuje krug na napajanje iz baterije.

Vbat- Ulaz baterije za bilo koju standardnu ​​3V litijumsku ćeliju ili drugi izvor napajanja. Za normalan rad, napon baterije se mora održavati između 2,5 i 3,5 V. Nivo na kojem je zabranjen pristup satu realnog vremena i korisničkom RAM-u interno je postavljen na 1,25 x Vbat. Litijumska baterija kapaciteta 35 mAh ili više dovoljna je za napajanje DS1307 više od 10 godina u nedostatku napajanja.
SCL(Ulaz serijskog sata) - SCL se koristi za sinhronizaciju prijenosa podataka preko serijskog sučelja.
S.D.A.(Serijski ulaz/izlaz podataka) - SDA - ulaz/izlaz podataka za 2-žični serijski interfejs. Ovo je izlaz otvorenog drena za koji je potreban eksterni pull-up otpornik.
SQW/OUT(Square Square / Output Driver) - Kada je SQWE bit postavljen na 1, SQW/OUT izlaz proizvodi kvadratne impulse na jednoj od četiri frekvencije: 1 Hz, 4 kHz, 8 kHz, 32 kHz. SQW/OUT pin je otvorenog odvoda i zahtijeva eksterni pull-up otpornik.
X1, X2- provodnici za povezivanje standardnog kvarcnog kristala 32,768 kHz. Unutrašnje kolo oscilatora je dizajnirano da radi sa kristalom koji ima nominalni kapacitet (CL) od 12,5 pF.
GND- Zemlja.
VCC– napajanje 5 volti.

DS1307 radi kao slave uređaj na serijskoj magistrali. Da biste mu pristupili, morate postaviti stanje START i prenijeti identifikacijski kod uređaja nakon kojeg slijedi adresa registra. Narednim registrima se može pristupiti uzastopno sve dok se stanje ne postavi STOP. Kada VCC padne ispod 1,25 x Vbat, uređaj prestaje da komunicira i resetuje brojač adresa. Za to vrijeme neće reagirati na ulazne signale kako bi spriječio snimanje pogrešnih informacija. Kada VCC padne ispod Vbat, uređaj prelazi u način skladištenja niske potrošnje energije. Kada uključite napajanje, uređaj prebacuje napajanje sa baterije na VCC kada napon napajanja pređe Vbat + 0,2V, i reaguje na ulazne signale kada VCC postat će više od 1,25 x Vbat. Kada je napajanje unutar normalnih granica, uređaj je potpuno dostupan i podaci se mogu pisati i čitati. Kada je na uređaj priključena baterija od tri volta i VCC je ispod 1,25 x Vbat, čitanje i pisanje su zabranjeni. Međutim, odbrojavanje vremena i dalje radi. Kada VCC padne ispod Vbat, napajanje RAM-a i mjerenja vremena se prebacuje na eksternu bateriju od 3 V.

Informacije o vremenu i datumu dobijaju se čitanjem odgovarajućih registara. Registri sata su prikazani u tabeli ispod. Vrijeme i kalendar se postavljaju ili inicijaliziraju upisivanjem bajtova u odgovarajuće registre. Sadržaj registara vremena i kalendara pohranjen je u BCD (BCD) formatu, dakle, prije prikazivanja informacija na LCD displeju ili sedmosegmentnom indikatoru, potrebno je konvertovati BCD kod u binarni ili ANSII kod.

Bit 7 registra 0 je bit zaustavljanja sata. Kada je ovaj bit postavljen na 1, generator se zaustavlja. Kada se resetuje na nulu, generator radi i sat broji vreme.

DS1307 može raditi u 12-satnom ili 24-satnom načinu rada. Bit 6 registra sata specificira jedan od ovih modova. Kada je jednak 1, postavlja se 12-satni režim. U 12-satnom režimu, bit 5 high označava popodnevno vrijeme. U 24-satnom režimu, bit 5 je drugi bit 10 sati (20-23 sata).

Kontrolni registar DS1307 je dizajniran za kontrolu rada izlaza SQW/OUT. Bit OUT- kontrola izlaza. Ovaj bit kontrolira izlazni nivo pina SQW/OUT, kada je generiranje meandra onemogućeno. Ako je SQWE = 0, logički nivo na pinu SQW/OUT jednako 1 ako OUT= 1, i 0 - ako OUT = 0. SQWE- Rezolucija meandra. Kada je ovaj bit postavljen na 1, omogućeno je generiranje kvadratnog talasa. Frekvencija kvadratnog talasa zavisi od vrednosti bitova RS0 i RS1. Ovi bitovi kontroliraju frekvenciju kvadratnog vala kada je omogućeno njegovo generiranje. Tabela ispod pokazuje frekvencije koje se mogu specificirati RS bitovima.

DS1307 podržava dvosmjernu 2-žičnu sabirnicu i protokol za prijenos podataka. Uređaj koji šalje podatke na magistralu naziva se predajnik, a uređaj koji prima podatke naziva se prijemnik. Uređaj koji upravlja prijenosom naziva se master. Uređaji kojima upravlja master su slave. Sabirnicom mora upravljati master koji generiše serijske taktove (SCL), kontroliše pristup magistrali i generiše START i STOP stanja. DS1307 radi kao slave na 2-žičnoj magistrali.

Za rad sa DS1307 potrebno je organizirati funkciju čitanja iz čipa i funkciju pisanja.

1. Način snimanja u DS1307. Serijski podaci i satovi se primaju preko SDA i SCL. Nakon što se svaki bajt prenese, prenosi se bit potvrde. ASK. države START I STOP prepoznaju se kao početak i kraj serijskog prijenosa. Prepoznavanje adrese se izvodi u hardveru nakon prijema slave adrese i bita smjera. Adresni bajt sadrži sedmobitnu adresu DS1307 od 1101000, nakon čega slijedi bit smjera (R/W), koji je 0 kada je bajt adrese primljen i dekodiran, DS1307 izdaje potvrdu. ASK na liniji SDA. Nakon što DS1307 potvrdi slave adresu i bit pisanja, master prosljeđuje adresu registra DS1307. Ovo će postaviti pokazivač registra u DS1307. Master će tada početi sa slanjem bajtova podataka na DS1307, koji će potvrditi svaki primljeni bajt. Na kraju snimanja, prezenter će kreirati stanje STOP.

2. Način čitanja sa DS1307. Prvi bajt se prima i obrađuje kao u režimu slave prijemnika. Međutim, u ovom načinu rada bit će smjera pokazati da je smjer prijenosa promijenjen. Serijski podaci se prenose preko SDA od DS1307, dok se serijski taktovi prenose preko SCL u DS1307. države START I STOP prepoznaju se kao početak i kraj serijskog prijenosa. Adresni bajt je prvi bajt primljen nakon što je master generirao stanje. START. Adresni bajt sadrži sedmobitnu adresu DS1307 od 1101000, nakon čega slijedi bit smjera (R/W), koji je 1 kada je bajt adrese primljen i dekodiran, DS1307 izdaje potvrdu. ASK na liniji SDA. DS1307 tada počinje sa slanjem podataka počevši od adrese registra na koju ukazuje pokazivač registra. Ako pokazivač registra nije upisan prije pokretanja načina čitanja, tada je prva adresa koja se čita posljednja adresa koja je preostala u pokazivaču registra. DS1307 bi trebao biti poništen NOASK da završim čitanje.

Pogledajmo karakteristike rada sa DS1307 na primjeru jednostavnog sata koji će pokazivati ​​sate, minute i sekunde. Podaci će biti prikazani na LCD displeju veličine 16x2. Dva dugmeta “Sati+” i “Minute+” će vam omogućiti da podesite željeno vreme. Atmega 8 mikrokontroler je taktiran od internog oscilatora frekvencije od 1 MHz, tako da ne zaboravite promijeniti osigurače. Ispod je dijagram povezivanja.

Upravljački program uključuje skupove funkcija za rad sa TWI magistralom, DS1307 satom i LCD ekranom.

I2CInit - inicijalizacija sabirnice;
I2CStart - prijenos stanja START;
I2CStop - prijenos stanja STOP;
I2CWriteByte - pisanje podataka;
I2CReadByte - čitanje podataka;
DS1307Read - funkcija za čitanje podataka sa DS1307;
DS1307Write - Funkcija za upisivanje podataka u DS1307;
lcd_com - prijenos komande na LCD;
lcd_data - prijenos podataka na LCD;
lcd_string - funkcija za prikaz stringa na LCD-u;
lcd_num_to_str - funkcija za izlaz karaktera tipa int;
lcd_init - LCD inicijalizacija.

Ispod je programski kod:

#include #include // Funkcija inicijalizacije TWI sabirnice void I2CInit(void) ( TWBR = 2; // Postavljanje frekvencije sabirnice TWSR = (1<< TWPS1)|(1 << TWPS0); // Предделитель на 64 TWCR |= (1 << TWEN); // Включение модуля TWI } // Функция СТАРТ void I2CStart(void) { TWCR = (1 << TWINT)|(1 << TWEN)|(1 << TWSTA); // Передача условия СТАРТ while(!(TWCR & (1 << TWINT))); // Ожидание установки флага TWINT } // Функция СТОП void I2CStop(void) { TWCR = (1 << TWINT)|(1 << TWEN)|(1 << TWSTO); // Передача условия СТОП while(TWCR & (1 << TWSTO)); // Ожидание завершения передачи условия СТОП } // Функция записи данных по шине uint8_t I2CWriteByte(uint8_t data) { TWDR = data; // Загрузка данных в TWDR TWCR = (1 << TWEN)|(1 << TWINT); // Сброс флага TWINT для начала передачи данных while(!(TWCR & (1 << TWINT))); // Ожидание установки флага TWINT // Проверка статуса // Если адрес DS1307+R и принято "подтверждение"(0x18) // или адрес DS1307+W и принято "подтверждение"(0x40) // или передается байт данных и принято "подтверждение"(0x28) if((TWSR & 0xF8) == 0x18 || (TWSR & 0xF8) == 0x40 || (TWSR & 0xF8) == 0x28) return 1; // OK else return 0; // ОШИБКА } // Функция чтения данных по шине uint8_t I2CReadByte(uint8_t *data,uint8_t ack) { // Возвращаем "подтверждение" после приема if(ack) TWCR |= (1 << TWEA); // Возвращаем "неподтверждение" после приема // Ведомое устройство не получает больше данных // обычно используется для распознования последнего байта else TWCR &= ~(1 << TWEA); // Разрешение приема данных после сброса TWINT TWCR |= (1 << TWINT); while(!(TWCR & (1 << TWINT))); // Ожидание установки флага TWINT // Проверка статуса // Если принят байт данных и возвращается "подтверждение"(0x50) // или принят байт данных и возвращается "ненеподтверждение"(0x58) if((TWSR & 0xF8) == 0x50 || (TWSR & 0xF8) == 0x58) { *data = TWDR; // Читаем данные из TWDR return 1; // OK } else return 0; // ОШИБКА } // Функция чтения данных из DS1307 uint8_t DS1307Read(uint8_t address,uint8_t *data) { uint8_t res; I2CStart(); // СТАРТ res = I2CWriteByte(0b11010000); // адрес DS1307+W if(!res) return 0; // ОШИБКА // Передача адреса необходимого регистра res = I2CWriteByte(address); if(!res) return 0; // ОШИБКА I2CStart(); // Повторный СТАРТ res = I2CWriteByte(0b11010001); // адрес DS1307+R if(!res) return 0; // ОШИБКА // Чтение данных с "неподтверждением" res = I2CReadByte(data,0); if(!res) return 0; // ОШИБКА I2CStop(); // СТОП return 1; // OK } // Функция записи данных в DS1307 uint8_t DS1307Write(uint8_t address,uint8_t data) { uint8_t res; I2CStart(); // СТАРТ res = I2CWriteByte(0b11010000); // адрес DS1307+W if(!res) return 0; // ОШИБКА // Передача адреса необходимого регистра res = I2CWriteByte(address); if(!res) return 0; // ОШИБКА res = I2CWriteByte(data); // Запись данных if(!res) return 0; // ОШИБКА I2CStop(); // СТОП return 1; // OK } // Функции работы с LCD #define RS PD0 #define EN PD2 // Функция передачи команды void lcd_com(unsigned char p) { PORTD &= ~(1 << RS); // RS = 0 (запись команд) PORTD |= (1 << EN); // EN = 1 (начало записи команды в LCD) PORTD &= 0x0F; PORTD |= (p & 0xF0); // старший нибл _delay_us(100); PORTD &= ~(1 << EN); // EN = 0 (конец записи команды в LCD) _delay_us(100); PORTD |= (1 << EN); // EN = 1 (начало записи команды в LCD) PORTD &= 0x0F; PORTD |= (p << 4); // младший нибл _delay_us(100); PORTD &= ~(1 << EN); // EN = 0 (конец записи команды в LCD) _delay_us(100); } // Функция передачи данных void lcd_data(unsigned char p) { PORTD |= (1 << RS)|(1 << EN); // RS = 1 (запись данных), EN - 1 (начало записи команды в LCD) PORTD &= 0x0F; PORTD |= (p & 0xF0); // старший нибл _delay_us(100); PORTD &= ~(1 << EN); // EN = 0 (конец записи команды в LCD) _delay_us(100); PORTD |= (1 << EN); // EN = 1 (начало записи команды в LCD) PORTD &= 0x0F; PORTD |= (p << 4); // младший нибл _delay_us(100); PORTD &= ~(1 << EN); // EN = 0 (конец записи команды в LCD) _delay_us(100); } // Функция вывода строки на LCD void lcd_string(unsigned char command, char *string) { lcd_com(0x0C); lcd_com(command); while(*string != "\0") { lcd_data(*string); string++; } } // Функция вывода переменной void lcd_num_to_str(unsigned int value, unsigned char nDigit) { switch(nDigit) { case 4: lcd_data((value/1000)+"0"); case 3: lcd_data(((value/100)%10)+"0"); case 2: lcd_data(((value/10)%10)+"0"); case 1: lcd_data((value%10)+"0"); } } // Функция инициализации LCD void lcd_init(void) { PORTD = 0x00; DDRD = 0xFF; _delay_ms(50); // Ожидание готовности ЖК-модуля // Конфигурирование четырехразрядного режима PORTD |= (1 << PD5); PORTD &= ~(1 << PD4); // Активизация четырехразрядного режима PORTD |= (1 << EN); PORTD &= ~(1 << EN); _delay_ms(5); lcd_com(0x28); // шина 4 бит, LCD - 2 строки lcd_com(0x08); // полное выключение дисплея lcd_com(0x01); // очистка дисплея _delay_us(100); lcd_com(0x06); // сдвиг курсора вправо lcd_com(0x0C); // включение дисплея, курсор не видим } int main(void) { _delay_ms(100); DDRC = 0x00; PORTC = 0xFF; lcd_init(); // Инициализация LCD I2CInit(); // Инициализация шины I2C lcd_string(0x81, "«acГ Ѕa DS1307"); // Часы на DS1307 lcd_string(0xC4, " : : "); // Запускаем ход часов uint8_t temp; DS1307Read(0x00,&temp); temp &= ~(1 << 7); // обнуляем 7 бит DS1307Write(0x00,temp); while(1) { unsigned char hour, minute, second, temp; // Читаем данные и преобразуем из BCD в двоичную систему DS1307Read(0x00,&temp); // Чтение регистра секунд second = (((temp & 0xF0) >> 4)*10)+(temp & 0x0F); DS1307Read(0x01,&temp); // Čitanje registra minuta minute = (((temp & 0xF0) >> 4)*10)+(temp & 0x0F); DS1307Read(0x02,&temp); // Čitanje sata registra sat = (((temp & 0xF0) >> 4)*10)+(temp & 0x0F); lcd_com(0xC4); lcd_num_to_str(sat, 2); // Prikaz sata lcd_com(0xC7); lcd_num_to_str(minuta, 2); // Prikaz minuta lcd_com(0xCA); lcd_num_to_str(drugi, 2); // Prikazuje sekunde if((PINC & (1<< PC0)) == 0) // Если нажата кнопка { while((PINC & (1 << PC0)) == 0){} // Ждем отпускания кнопки hour++; // Увеличиваем часы на 1 if(hour >23) sat = 0; // Pretvaranje iz binarnog u BCD i pisanje u DS1307 uint8_t temp; temp = ((sat/10)<< 4)|(hour%10); DS1307Write(0x02, temp); _delay_ms(100); } if((PINC & (1 << PC1)) == 0) // Если нажата кнопка { while((PINC & (1 << PC1)) == 0){} // Ждем отпускания кнопки minute++; // Увеличиваем минуты на 1 if(minute >59) minuta = 0; // Pretvaranje iz binarnog u BCD i pisanje u DS1307 uint8_t temp; temp = ((minuta/10)<< 4)|(minute%10); DS1307Write(0x01, temp); _delay_ms(100); } } }

Recenzije o ovom satu na internetu su najkontradiktornije. Neki kažu da je sat divan, dok ga drugi nazivaju lošom kreacijom Dallasa. I tako, da bih raspršio sve lažne glasine, izvadio sam mikrukhu iz skrovišta i počeo eksperimentisati.

Posebnosti:

  • Veoma niska potrošnja energije. Proizvođač obećava 10 godina rada sata s jednom standardnom baterijom. CR2032
  • 56 bajtova memorije za pohranjivanje korisničkih podataka. Mislim da to nije posebno neophodna opcija, ali bi nekome mogla biti od koristi.
  • Programabilni izlaz za taktiranje eksternih uređaja. Može da emituje 1 Hz, 4,096 kHz, 8,192 kHz i 32,768 kHz.
  • 24-satni i 12-satni način rada

Pinout

Igle sata nalaze se na sljedeći način:

X1, X2— Pinovi za povezivanje kvarcnog rezonatora na frekvenciji od 32,768 kHz
VBAT— Izlaz za povezivanje 3-voltne rezervne baterije
GND- Zemlja
S.D.A.- linija podataka i2c sabirnice
SCL— i2c linija takta sabirnice
SQW/OUT– izlazni signal za taktiranje eksternih uređaja
VCC- napajanje od 5 volti

Povezivanje sa kontrolerom
Vezivanje je minimalno. Trebat će vam kvarc od 32,768 kHz, par otpornika za rad i2c magistrale i baterija od tri volta.

Ispravan raspored ploče
Točnost sata, kao i performanse sata općenito, zavise od rasporeda tiskane ploče. Dallas u svom datasheet-u preporučuje smanjenje dužine provodnika od mikrokola do kvarcnog rezonatora na minimum i okruživanje ovih vodiča pravokutnikom povezanim sa zemljom. Osim toga, radi pouzdanosti, zalemio sam žice koje idu u zemlju do kvarcnog tijela i postavio kondenzator od 0,1 uF paralelno s napajanjem.

Usput, može raditi i bez kvarca. Da bi se to postiglo, eksterni taktni signal sa frekvencijom od 32,768 kHz se dovodi do noge X1, a X2 ostaje suspendovan u vazduhu.

Organizacija memorije sata
Ovaj minijaturni uređaj je opremljen sa 64 bajta memorije. Prvih osam bajtova radi. Pohranjuju vrijeme, datum, dan u sedmici. Ostatak se dodjeljuje potrebama korisnika. U njih možete pohraniti, na primjer, neka podešavanja ili nešto drugo. Naravno, kada se rezervno napajanje izgubi, sve informacije u ovoj memoriji se uništavaju. Sav rad sa satom (čitanje i podešavanje vremena/datuma) svodi se na čitanje i upisivanje potrebnih memorijskih ćelija.

Svi brojevi u memoriji pohranjeni su u binarnom decimalnom formatu. To znači da se dvije cifre mogu pohraniti u jedan bajt. Na primjer, broj 0x23 sadrži broj 2 i broj 3. Za svaki broj se dodjeljuju 4 bita. Zašto se to radi? Za praktičnost i uštedu memorije. Osim vremena i datuma, nekoliko bitova postavki je pohranjeno u memoriji:

  • Zastoj sata- upravlja satom. Kada je bit postavljen, sat se zaustavlja. Da biste pokrenuli sat, potrebno je upisati 0 u ovaj bit Nakon povezivanja rezervne baterije, ovaj bit je postavljen i sat ne broji vrijeme! Morate zapamtiti ovo.
  • 24/12 - ovaj bit za odabir načina rada sata. Kada je ovaj bit jednak jedan, koristi se 12-satni način rada. Inače 24 sata. Ako se koristi 12-satni način rada, tada peti bit označava AM ili PM sada. Ako je bit 1 onda to znači PM. U 24-satnom načinu rada, ovaj bit se koristi za pohranjivanje desetina sati zajedno sa bitom 4.
  • Izlaz— kontrolira stanje noge SQW/OUT. Bit je postavljen - dnevnik je na kraku 1. Reset - na kraku 0. Za kontrolu na ovaj način, bit SQWE mora biti resetovan.
  • SQWE- kada je bit postavljen, pravokutni impulsi se pojavljuju na nožici SQW/OUT.
  • RS1, RS0— ovi bitovi određuju frekvenciju impulsa. Ovisnost frekvencije o kombinaciji bitova je u donjoj tabeli:

Softver

Za rad sa satom DS1307, napisana je jednostavna biblioteka koja sadrži sljedeće osnovne funkcije:

DS_start— pokreće sat. Sat možete pokrenuti i podešavanjem vremena.
DS_stop- zaustavlja sat
DS_set_time — Podešavanje vremena. Prije nego što pozovete proceduru, trebate staviti sekunde u tmp1, minute u tmp2 i sate u tmp3. Sat u 24-satnom formatu.
DS_get_time: — očitavanje vremena sa sata. sekunde će biti snimljene u tmp1, minute u tmp2, sati u tmp3
DS_get_date:— očitavanje datuma sa sata. Dan će biti snimljen u tmp1, mjesec u tmp2, godina u tmp3
DS_set_date: — postavljanje datuma. Prije pozivanja procedure potrebno je da unesete dan u tmp1, mjesec u tmp2 i godinu u tmp3 (zadnje 2 cifre)

Rutine za podešavanje/čitanje vremena i datuma mogu prihvatiti/vratiti ulazne podatke u BCD i decimalnom formatu. Da biste odabrali željeni format, trebate komentirati ili dekomentirati tri reda u svakoj proceduri (o tome postoje napomene u kodu).

Program za testiranje vam omogućava kontrolu sata preko UART-a (brzina 9600, kontroler radi na 8 MHz). Prilikom pokretanja, odmah se prikazuju vrijeme, datum i upit za unos komandi od 1 do 3. Kada odaberete opciju 1, vrijeme/datum se ponovo čita. Opcija 2 vam omogućava da postavite vrijeme, a opcija 3 datum. Ako želite da pokušate da se igrate sa satom, fajl simulacije je uključen u izvornu arhivu.

Preciznost
Ovdje mnogo ovisi o korištenom kvarcu i rasporedu ploče. List sa podacima navodi da bi kvarcni kapacitet trebao biti 12,5 pF. Kažu da je najbolje koristiti kristale sa matičnih ploča. Da biste ispravili hod, možete zalemiti trim kondenzator na rezonator i koristiti ga za promjenu frekvencije u malim granicama. Meni lično ovaj sat radi dva dana i kasni 3 sekunde. Nešto mi govori da je problem u kapacitetu kvarca, probaću još jedan i javiti se.

Zaključak
Nije loš sat. Idealno za amatersku upotrebu. Iako neki ljudi pišu o greškama, ja se s njima još nisam susreo.

DS1307 je mali modul dizajniran za brojanje vremena. Sastavljen na bazi DS1307ZN čipa i napajan litijumskom baterijom (LIR2032), što mu omogućava da radi autonomno dugo vremena. Takođe na modulu je 32 KB stalna EEPROM memorija (AT24C32). Mikrokrug AT24C32 i DS1307ZN povezani su zajedničkom magistralom koristeći I2C sučelje.

Tehničke specifikacije

Napon napajanja: 5V
Radna temperatura: – 40℃ … + 85℃
Memorija: 56 bajtova (nestalna)
Baterija : LIR2032 (automatsko otkrivanje izvora napajanja)
Interfejs: I2C
Dimenzije: 28mm x 25mm x 8mm

Opće informacije

Upotreba modula DS1307 je često vrlo opravdana, na primjer, kada se podaci čitaju rijetko, u intervalima dužim od tjedan dana, nerazumno je ili nemoguće koristiti vlastite resurse kontrolera. Pružanje neprekidnog napajanja za, na primjer, Arduino ploče na duže vrijeme je skupo, čak i kada se koristi baterija.
Zahvaljujući vlastitoj memoriji i autonomiji, moguće je snimati događaje (sa autonomnim napajanjem) kao što su promjene temperature i tako dalje, podaci se pohranjuju u memoriju i mogu se čitati iz memorije modula. Dakle, DS1307 modul se često koristi kada Arduino kontroleri trebaju znati točno vrijeme, da pokrenu neki događaj itd.

Razmjena podataka sa drugim uređajima se vrši preko I2C sučelja sa SCL i SDA pinova. Kondenzatori C1 i C2 su neophodni za smanjenje buke duž dalekovoda. Kako bi se osigurao odgovarajući nivo SCL i SDA signala, ugrađeni su otpornici R2 i R3 (povučeni do napajanja). Za provjeru funkcionalnosti modula, SQ signal pravokutnog oblika sa frekvencijom od 1 Hz se dovodi na pin 7 DS1307Z čipa. Elementi R4, R5, R6, VD1 su neophodni za punjenje litijumske baterije. Također, ploča ima sjedište (U1) za ugradnju temperaturnog senzora DS18B20 (po potrebi možete ga zalemiti), očitavanja sa DS pina koji je spojen na napajanje možete očitati preko otpornika R1 sa otpor od 3,3 kOhm. Šema strujnog kruga i namjena kontakata mogu se vidjeti na slikama ispod.

Na ploči postoje dvije grupe kontakata, s nagibom od 2,54 mm, za praktično povezivanje s matičnom pločom, koristit ću pin konektore, potrebno ih je zalemiti.

Prva grupa kontakata:
DS: DS18B20 izlaz (1-žični)


VCC: “+” napajanje modula
GND: “-” napajanje modula

Druga grupa kontakata:
SQ: 1 MHz ulaz
DS: DS18B20 izlaz (1-žični)
SCL: Serijski sat
SDA: linija podataka (serijski Dfta)
VCC: “+” napajanje modula
GND: "-" napajanje modula
BAT:

Punjenje baterije
Kao što je opisano, vaš modul može puniti bateriju, što je implementirano pomoću komponenti R4, R5, R6 i diode D1. Ali ovaj krug ima nedostatak: kroz otpornike R4 i R6, baterija se prazni (kao što je korisnik ALEXEY primijetio, uopće ne puno). Budući da modul troši malo struje, možete ukloniti strujni krug da biste to učinili, uklonite R4, R5, R6 i VD1, zamijenite R6 kratkospojnikom (nakon uklanjanja komponenti, možete koristiti običnu CR2032 bateriju).

Povezivanje DS1307 na Arduino

Potrebni dijelovi:
Arduino UNO R3 x 1 kom.
DuPont žica, 2,54 mm, 20 cm x 1 kom.
USB 2.0 A-B kabl x 1 kom.
Sat realnog vremena RTC DS1307 x 1 kom.

Veza:
Da biste povezali DS1307 sat realnog vremena, potrebno je da zalemite pin konektore u prvu grupu pinova. Zatim povezujemo žice SCL (DS1307) na pin 4 (Arduino UNO) i SDA (DS1307) na pin 5 (Arduino UNO), sve što ostaje je spojiti VCC na +5V i GND na GND. Usput, izlazi I2C interfejsa su različiti u različitim Arduino pločama.

Podešavanje vremena DS1307
Prije svega, trebate preuzeti i instalirati biblioteku “DS1307RTC” i “TimeLib” u razvojno okruženje Arduino IDE, zatim morate podesiti vrijeme, otvoriti primjer iz biblioteke DS1307RTC “File” -> “Examples” - > “DS1307RTC” -> “SetTime” ili kopirajte kod ispod.

// Povežite biblioteku DS1307RTC const char *monthName = ( "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct " , "Nov", "Decembar" ); tmElements_t tm; void setup() ( bool parse=false; bool config=false; // dobijemo datum i vrijeme kada je kompajler pokrenut if (getDate(__DATE__) && getTime(__TIME__)) (parse = true; // i konfiguriraj RTC sa ove informacije if (RTC.write(tm)) (config = true; ) ) Serial.begin(9600) // čekanje na Arduino Serial Monitor (200); Time="); Serial.print(__TIME__); Serial.print(", Date="); Serial.println(__DATE__); else (parse) (Serial.println("DS1307 Communication Error:-("); Serial .println("Provjerite svoje kolo") else ( Serial.print("Nije moguće raščlaniti informacije iz kompajlera, Time=\""); Serial.print(__TIME__); Serial.print("\", Datum); =\"" Serial.print(__DATE__); ) void loop() () bool getTime(const char *str) (int Hour, Min, Sec; if (sscanf); (str, "%d:%d", &Hour, &Min, &Sec) != 3) return false Second = Sec return true ) bool getDate(const char *str) (char Month; int Dan, Godina; uint8_t monthIndex; if (sscanf(str, "%s %d %d", Mjesec, &Dan, &Godina) != 3) vrati false; za (Indeks mjeseca = 0; Indeks mjeseca< 12; monthIndex++) { if (strcmp(Month, monthName) == 0) break; } if (monthIndex >= 12) vrati false; tm.Day = Dan; tm.Month = indeks mjeseca + 1; tm.Year = CalendarYrToTm(Godina); return true; )

Preuzmite skicu

Ovu skicu učitavamo u Arduino kontroler (vrijeme je uzeto iz OS-a), otvaramo “Nadgledanje porta”

Program
Postoji još jedan primjer u biblioteci, možete ga otvoriti DS1307RTC “Datoteka” -> “Primjeri” -> “DS1307RTC” -> “ReadTest”

/* Testiranje je obavljeno na Arduino IDE 1.6.12 Datum testiranja 23.11.2016. */ #include // Uključuje Wire biblioteku #include // Uključuje TimeLib biblioteku #include // Povežite biblioteku DS1307RTC void setup() ( Serial.begin(9600); // Postavite brzinu prijenosa podataka dok (!Serial) ; // Sačekajte da se serijski port poveže. Potrebno samo za Leonardo delay(200); // Sačekajte 200 µs Serial.println("DS1307RTC Read Test" // Izlaz podataka na serijski port Serial.println("-------------------"); serijski port ) void loop() (tmElements_t tm; if (RTC.read(tm)) (Serial.print("Ok, Time = "); print2digits(tm.Hour); Serial.write(":") print2digits (tm.minute(":"); "); Serial.print(tmYearToCalendar(tm.Year)); else (if (RTC) .chipPresent()) ( Serial.println("DS1307 je zaustavljen. Pokrenite SetTime"); Serial.println("primjer da inicijalizirate vrijeme i počnete raditi."); Serial.println(); ) else ( Serial .println("Greška čitanja DS1307! Molimo provjerite sklop."); Serial.println(); ) kašnjenje (9000); ) kašnjenje (1000); ) void print2digits(int number) ( if (broj >= 0 && broj< 10) { Serial.write("0"); } Serial.print(number); }

Preuzmite skicu

Učitavamo ovaj kod u Arduino kontroler, otvaramo “Nadgledanje porta”

Ova biblioteka je napisana za jednostavno povezivanje i korištenje DS1307 modula sa Arduino ilichipKit bez potrebe za Wire bibliotekom.
Ova biblioteka koristi podrazumevani Fast Mode (400 kHz) I2C hardverskog interfejsa.
Ne garantuje se da će ova biblioteka raditi kada istovremeno radite sa Wire bibliotekom i dijelite kontakte.

Struktura:

Vrijeme;
Struktura upravljanja podacima o vremenu i datumu.
Varijable:
sat, min, sek: Za određivanje podataka o vremenu
datum, pon, godina: Za definiranje podataka o datumu
dou: Dan u sedmici počevši od ponedjeljka
primjer: Vrijeme t; // Definirajte strukturu pod nazivom t klase "vrijeme"

DS1307_RAM;
Međuspremnik za korištenje u sprezi sa ReadBuffer() i WriteBuffer().
Varijable:
ćelija: Niz bajtova za skladištenje podataka, sa mogućnošću čitanja ili pisanja u RAM čipa.
primjer: DS1307_RAM ramBuffer; //Deklarišemo bafer za upotrebu

Definirani literali:

Dani u sedmici

Koristi se zajedno sa setDOW() i Time.dow
PONEDJELJAK: 1
UTORAK: 2
SRIJEDA: 3
ČETVRTAK: 4
PETAK: 5
SUBOTA: 6
NEDJELJA: 7

Dužina naslova
Koristi se u kombinaciji sa getTimeStr(), getDateStr(), getDOWStr() i getMonthStr()
FORMAT_SHORT: 1 (pun naslov)
FORMAT_DUGO: 2 (skraćeni (3 slova) naziv)

Format datuma
Koristi se zajedno sa getDateStr()
FORMAT_LITTLEENDIAN: 1 (dd.mm.gggg)
FORMAT_BIGENDIAN: 2 (gggg.mm.dd)
FORMAT_MIDDLEENDIAN: 3 (mm.dd.gggg)

SQW izlazna frekvencija

Koristi se u kombinaciji sa setSQWRate()

SQW_RATE_1: 1 (1 Hz)

SQW_RATE_4K: 2 (4096 Hz)

SQW_RATE_8K: 3 (8192 Hz)

SQW_RATE_32K: 4 (32768 Hz)

Funkcije:

DS1307(SDA, SCL);
Inicijalizacija biblioteke korišćenjem I2C interfejsa
Opcije:
SDA: Priključni pin za SDA pin DS1307 (Pin 5, podaci)
SCL: Priključni pin za SCL pin DS1307 (pin 6, takt)
primjer: DS1307 rtc(SDA, SCL); // Inicijaliziraj biblioteku DS13071 koristeći I2C sučelje
Bilješka: DS1307 se može spojiti na bilo koji slobodni Arduino pinovi. Ako kolo već koristi I2C sabirnicu i pokušate se povezati na iste pinove, onda ova biblioteka neće raditi, jer bilo koji protokol kompatibilan sa TWI zahteva ekskluzivni pristup pinovima.

begin();
Inicijalizacija veze sa DS1307
Opcije: br
Povratak: br

primjer: rtc.begin(); //Inicijaliziranje veze na DS1307

getTime();
Pročitajte trenutne podatke sa DS3231.
Opcije: Ne
Povratak: Format vremenske strukture
primjer: t = rtc.getTime(); // Čitanje trenutnog datuma i vremena.


getTimeStr();
Čitajte trenutno vrijeme kao string varijablu.
Opcije:
format:<необязательный параметр>
FORMAT_LONG "HH:MM:SS" (zadano)
FORMAT_SHORT "HH:MM"
Povratak: Vrijednost niza koja sadrži trenutno vrijeme, sa ili bez sekundi.
primjer: Serial.print(rtc.getTimeStr()); // Šalje trenutno vrijeme preko serijskog porta

getDateStr(]]);
Pročitajte trenutni datum kao varijablu niza.
Opcije:
slformat: <необязательный параметр>
FORMAT_LONG 4-cifrena godina (GGGG) (Zadano)
FORMAT_SHORT 2-cifrena godina (GG)
format: <необязательный параметр>
FORMAT_LITTLEENDIAN"DD.MM.GGGG" (zadano)
FORMAT_BIGENDIAN"GGGG.MM.DD"
FORMAT_MIDDLEENDIAN"MM.DD.GGGG"
razdjelnik: <необязательный параметр>
Simbol za podjelu. Zadano "."
Povratak: Vrijednost niza koja sadrži trenutni datum u navedenom formatu.
primjer: Serial.print(rtc.getDateStr()); // Pošaljite trenutni datum preko serijskog porta (u formatu "DD.MM.GGGG")

getDOWStr();
Pročitajte trenutni dan u sedmici kao niz varijablu.
Opcije:
format:<необязательный параметр>
FORMAT_LONG Dan u sedmici na engleskom (podrazumevano)
FORMAT_SHORT Skraćeni naziv dana u sedmici na engleskom (3 znaka)
Povratak: Vrijednost niza koja sadrži tekući dan u sedmici u punom ili skraćenom formatu.
primjer: Serial.print(rtc.getDOWStr(FORMAT_SHORT)); // Slanje skraćenog naziva tekućeg dana u sedmici preko serijskog porta

getMonthStr();
Čitajte tekući mjesec kao varijablu niza.
Opcije:
format:<необязательный параметр>
FORMAT_LONG naziv mjeseca na engleskom (podrazumevano)
FORMAT_SHORT Skraćeni naziv mjeseca na engleskom (3 znaka)
Povratak: Vrijednost niza koja sadrži tekući mjesec u punom ili skraćenom formatu.
primjer: Serial.print(rtc.getMonthStr()); // Pošaljite naziv tekućeg mjeseca preko serijskog porta

getUnixTime(vrijeme);
Pretvara vrijednosti vremena i datuma u Unix format vremena.
Opcije:
vrijeme: Varijabla koja sadrži datum i vrijeme za konverziju
Povratak: Unix vrijeme za datu vrijednost vremena
primjer: Serial.print(rtc.getUnixTime(rtc.getTime())); // Šalje trenutnu Unixtime vrijednost preko serijskog porta
Bilješka: UNIX vrijeme ili POSIX vrijeme je sistem za opisivanje trenutaka u vremenu, usvojen u UNIX-u i drugim POSIX-kompatibilnim operativnim sistemima. Definiran kao broj sekundi koji je prošao od ponoći (00:00:00 UTC) 1. januara 1970. (četvrtak); vrijeme od ovog trenutka naziva se “UNIX era” (engleski Unix Epoch).

setTime(sat, min, sek);
Podešavanje vremena.
Opcije:
sat: Sati (0-23)
min: Minute (0-59)
sec: Sekunde (0-59)
primjer: rtc.setTime(23, 59, 59); // Postavite vrijeme na 23:59:59

setDate(datum, pon, godina);
Podešavanje datuma.
Opcije:
datum: Dan (1-31)
pon: Mjesec (1-12)
godina: Godina (2000-2099)
primjer: rtc.setDate(16, 5, 2016); // Postavite datum na 16. maj 2016.
Bilješka: Ne postoji zaštita od unosa pogrešnog datuma. Odnosno, moguće je ući 31. februara, ali rezultat neće biti predvidljiv

setDOW(dow);
Podešavanje dana u sedmici.
Opcije:
dou: <необязательный параметр>Dan u sedmici (1-7)
Ako parametar nije specificiran, vrijednost parametra će se izračunati na osnovu podataka koji su trenutno pohranjeni u DS3231.
primjer: rtc.setDOW(PETAK); // Postavite dan u sedmici - petak
Bilješka: Postavljeno od ponedjeljka (1) do nedjelje (7).

stop (vrijednost);
Postavite ili resetirajte zastavicu za početak sata.
Opcije:
vrijednost: istinito:Postavite CH zastavicu
lažno: Resetujte CH zastavicu
Povratak: br
primjer: rtc.halt(false); // Pokreni modul sata da radi

setOutput(enable);
Postavljanje pina SQW/OUT (pin 7) DS1307 čipa na visoko ili nisko. Ova naredba nema efekta ako je enableSQW() TRUE.
Opcije:
omogući: TRUE: Postavite pin visoko
LAŽNO: Postavite pin na nisko.
Povratak: br
primjer: rtc.setOutput(true); // Postavite SQW/OUT pin visoko

omogućitiSQW(omogućiti);
Omogućava ili onemogućuje izlaz pravougaonih impulsa date frekvencije na SQW/OUT pinu.
Opcije:
omogući: TRUE: Omogući kvadratne impulse na pin
LAŽNO: Onemogućite izlaz pravougaonog talasa
Povratak: br
primjer: rtc.enableSQW(true); // Koristite pin SQW/OUT kao generator kvadratnog talasa

setSQWRate(stopa);
Podešavanje frekvencije pravokutnih impulsa na SQW pinu.
Opcije:
stopa: SQW_RATE_1- frekvencija 1Hz
SQW_RATE_4K- frekvencija 4.096 kHz
SQW_RATE_8K- frekvencija 8,192 kHz
SQW_RATE_32K- frekvencija 32,768 kHz
Povratak: br
primjer: rtc.setSQWRate(SQW_RATE_1); // Postavite frekvenciju na SQW pinu na 1Hz

writeBuffer(bafer);
Zapišite podatke iz bafera u RAM čipa.
Opcije:
tampon: DS1307_RAM bafer
Povratak: br
primjer: rtc.writebuffer(ramBuffer); // Upisati 56 bajtova iz ramBuffer varijable u RAM čipa

readBuffer();
Čitanje podataka iz RAM-a čipa u bafer.
Opcije: br
Povratak: DS1307_RAM bafer
primjer: ramBuffer=rtc.readBuffer(); // Čita svih 56 bajtova iz RAM-a čipa u varijablu ramBuffer

poke(adresa, vrijednost);
Upišite 1 bajt u RAM čipa
Opcije:
adresa: Adresa za pisanje bajta (0-55)
vrijednost: Vrijednost za unos po adresi

(0-255)
Povratak: br
primjer: rtc.poke(15, 160); // Upiši 160 na adresu 15

zaviriti (adresa);
Pročitajte 1 bajt iz RAM-a čipa
Opcije:
adresa: Adresa za čitanje bajta (0-55)
Povratak: 1 bajt podataka pročitanih iz RAM-a čipa
primjer: b=rtc.peek(18); // Čita 1 bajt na adresi 18 i upisuje vrijednost u varijablu b

mob_info