- Potrebné materiály:
- Modul RTC:
- Pripojenie DS3231 RTC k mikrokontroléru PIC:
- Programovanie PIC pre modul RTC:
- Stručné vysvetlenie hlavičkového súboru PIC16F877a_DS3231.h:
- Simulácia:
- Zobraziť čas a dátum na LCD:
Takmer všetky zabudované zariadenia sú navrhnuté tak, aby interagovali s reálnym svetom. Fungujú ako most na komunikáciu medzi digitálnym a skutočným svetom. Na uľahčenie a zefektívnenie tohto procesu by digitálny svet musel niekedy sledovať čas a dátum reálneho sveta. Digitálny svet tak bude vedieť, aký je deň / deň v skutočnom svete, a dokáže dokonca rozlišovať medzi denným a nočným časom. Môže tiež slúžiť ako zdroj času na vykonávanie určitých úloh v stanovenom čase alebo dátume. Takže tu prepájame RTC modul s PIC mikrokontrolérom a zobrazujeme čas a dátum na 16x2 LCD. Tento projekt je možné použiť aj ako digitálne hodiny.
Potrebné materiály:
- Regulované napájanie 5V
- PIC16F877A
- Krištáľový oscilátor 20 MHz
- Kondenzátor 33pf - 2č
- Rezistor 10K, 5,1K, 1K
- Modul RTC DS3231
- POT -10k
- Modul LCD 16 * 2
- Pripojovacie vodiče
Modul RTC:
Najbežnejším spôsobom, ako môže mikrokontrolér sledovať skutočný čas alebo dátum v reálnom svete, je použitie RTC IC. Pojem RTC znamená hodiny v reálnom čase; tento IC sleduje skutočný čas a dátum v reálnom svete a na požiadanie by tieto informácie zdieľal s mikrokontrolérom. RTC IC, ktorý tu používame, je najpopulárnejší a najpresnejší model DS3231. Tento IC sa každoročne posúva iba o pár sekúnd, a preto je vysoko spoľahlivý. Kvôli tejto príručke používame modul DS3231 RTC, ktorý sa dá ľahko kúpiť online alebo v miestnom obchode s hardvérom. Modul je dodávaný s 3V mincovou bunkou, ktorá napája modul RTC vždy, a preto po nastavení času a dátumu bude aktualizovaný, pokiaľ bude gombíková batéria nažive.
Modul DS3231 komunikuje pomocou protokolu I2C, takže ak neviete, čo to je a ako sa používa s PIC, prečítajte si pred pokračovaním návod I2C s PIC. Tiež v tomto výučbe vytvoríme hlavičkový súbor, ktorý je možné použiť na komunikáciu s našim RTC modulom a tiež ho otestovať na hardvéri zobrazením času a dátumu na LCD displeji, takže je tiež dôležité naučiť sa prepojiť LCD. displej s mikrokontrolérom PIC. Hlavičkový súbor vytvorený v tomto návode pre DS3231 možno neskôr použiť / upraviť tak, aby vyhovoval vašim aplikáciám.
DS3231 RTC s Arduino sme predtým používali v nasledujúcich projektoch:
- Automatický podávač domácich zvierat pomocou Arduina
- Záznamník údajov Arduino
Pripojenie DS3231 RTC k mikrokontroléru PIC:
Schéma zapojenia digitálnych hodín na báze mikrokontroléra PIC je uvedená nižšie. Ako už bolo povedané, DS3231 pracuje pomocou komunikácie I2C, takže bude mať kolík Serial Clock (SCL) a Serial Data (SDA), ktoré musia byť pripojené k pinom I2C na našom PIC, čo je pin 18 (SCL). a kolík 23 (SDA). Na udržanie vysokého stavu zbernice pri nečinnosti sa používa pull-up odpor s hodnotou 4,7k.
K pinom na porte D je tiež pripojený LCD displej, ktorý zobrazuje aktuálny dátum a čas. Kompletná schéma zapojenia bola navrhnutá na proteus a je uvedená nižšie. To isté použijeme na simuláciu alebo programovanie neskôr v tomto výučbe.
Postupujte podľa schémy zapojenia a podľa toho urobte pripojenia. Vyššie uvedené pole I2C sa používa na ladenie I2C, takže ho do svojich pripojení nezahrnieme. Taktiež sa nezobrazuje, že modul RTC musí byť napájaný napájaním + 5 V pomocou pinov Vcc a Ground na module. Použil som svoju breadboard na vytvorenie spojenia a po vykonaní požadovaných pripojení moje nastavenie vyzeralo asi takto nižšie.
Ak ste v mikrokontroléri PIC nováčikom, začnite kapitolou Začíname s mikrokontrolérom PIC.
Programovanie PIC pre modul RTC:
Kompletný program pre tento Digitálne hodiny možno stiahnuť zo ZIP súboru tu. Program obsahuje celkovo tri hlavičkové súbory. Sú to súbor lcd.h pre prácu s LCD displejom, súbor PIC16F877a_I2C.h pre prácu s komunikáciou I2C s PIC a nakoniec PIC16F877a_DS3231.h súbor pre prácu s modulmi RTC. Pre tento program sú potrebné všetky tri hlavičkové súbory, ktoré sú k dispozícii v súbore ZIP vyššie. Ďalej vysvetlím hlavný program, ktorý používa všetky tieto hlavičkové súbory na načítanie času a dátumu z modulu RTC a ich zobrazenie na LCD obrazovke. Potom vysvetlím, čo sa vlastne deje vo vnútri hlavičkového súboru RTC. Ako vždy začnite program nastavením konfiguračných bitov a nastavením taktovacej frekvencie na 20 MHz, pretože to je to, čo sme použili v našom hardvéri.
#pragma config FOSC = HS // Bity výberu oscilátora (HS oscilátor) #pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT deaktivovaný) #pragma config PWRTE = ON // Power Timer Enable bit (PWRT enabled) # pragma config BOREN = ON // Brown-out Reset Enable bit (BOR enabled) #pragma config LVP = OFF // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3 je digitálny I / O, HV zapnutý Na programovanie je potrebné použiť MCLR) #pragma config CPD = OFF // bit ochrany kódu pamäte EEPROM dát (ochrana kódu EEPROM dát vypnutá) #pragma config WRT = OFF // zapisovanie do pamäte Flash programu Povolenie bitov (ochrana proti zápisu vypnutá; všetka pamäť programu) možno zapísať do kontroly EECON) #pragma config CP = OFF // Bit kódu ochrany kódu pamäte programu (ochrana kódu vypnutá) #define _XTAL_FREQ 20000000
Ďalším krokom by bolo definovanie pinov LCD. Ak sa pozriete na hardvér, môžete si všimnúť, že sme pripojili piny LCD k portu PORT D z RD2 na RD7, takže definujeme to isté, ako je uvedené nižšie.
#define RS RD2 #define EN RD3 #define D4 RD4 #define D5 RD5 #define D6 RD6 #define D7 RD7
Keď ste si kúpili modul RTC, štandardne v ňom nebude nastavený správny čas a dátum, takže ho musíme nastaviť prostredníctvom nášho programu. Deklarujeme teda premennú pre každé údaje a informačný kanál v reálnom svete v čase a dátume, ako je uvedené nižšie. V čase nahrávania programu bol môj čas a dátum 6. 5. 2018 10:55, takže som nastavil premenné nižšie. Môžete nastaviť správny čas a dátum podľa aktuálnej aplikácie
/ * Nastaviť aktuálnu hodnotu dátumu a času pod * / int sec = 00; int min = 55; int hodina = 10; int dátum = 06; int mesiac = 05; int rok = 18; / * Nastavený čas a dátum * /
Ďalej pridáme všetky hlavičkové súbory, o ktorých sme diskutovali. Ak ste si program stiahli a otvorili zo súboru ZIP, nebude to problém, uistite sa, že sú všetky hlavičkové súbory pridané do vášho zdrojového súboru alebo do adresára projektu.
#include
Pretože sme použili PORT D ako výstupné kolíky na prepojenie LCD, musíme ich v našom programe deklarovať ako výstupné kolíky a inicializovať LCD displej, ako je uvedené nižšie
TRISD = 0x00; // Vyrobte kolíky portu D tak, ako by to nebolo potrebné pre rozhranie LCD Lcd_Start (); // Inicializácia LCD modulu
RTC modul komunikuje pomocou protokolu I2C, takže musíme umožniť komunikáciu I2C nášmu mikrokontroléru PIC. Väčšina zariadení vrátane našich modulov DS3231 má prevádzkovú frekvenciu I2C 100 kHz, takže komunikáciu I2C začneme s frekvenciou 100 kHz, ako je uvedené nižšie.
I2C_Initialize (100); // Inicializujte I2C Master s hodinami 100 KHz
Len čo sme nadviazali komunikáciu I2C s modulom RTC, prvá vec, ktorú urobíme, je nastavenie aktuálneho času a dátumu, ktorý sme zadali do nášho programu. To je možné vykonať volaním funkcie set_Time_Date, ako je uvedené nižšie. Keď je nastavený čas a dátum, modul ho bude automaticky sledovať a zvyšovať ich rovnako ako digitálne hodiny.
Set_Time_Date (); // nastavenie času a dátumu na module RTC
Aby sme naznačili, že program bol spustený, zobrazíme malú úvodnú správu, ktorá zostane na obrazovke 2 sekundy. Táto správa zobrazí na obrazovke RTC s PIC –Circuit Digest . Program pre to isté je uvedený nižšie
Lcd_Clear (); Lcd_Set_Cursor (1,1); Lcd_Print_String ("RTC s PIC"); Lcd_Set_Cursor (2,1); Lcd_Print_String ("-Circuit Digest"); __delay_ms (1 500);
Vnútri našej nekonečnej zatiaľ čo slučke by sme mali prečítať aktuálny čas a dátum a potom zobrazí hodnoty v našej LCD displeji. Na načítanie času a dátumu z modulu RTC je možné použiť funkciu Update_Current_Time_Date, ako je uvedené nižšie. Táto funkcia načíta hodnotu z modulu RTC a aktualizuje premenné sec, min, hodinu, dátum, mesiac a rok o aktuálne hodnoty. Potom ich môžeme použiť na náš účel.
Update_Current_Date_Time (); // Prečítajte si aktuálny dátum a čas z modulu RTC
Premenné sú celočíselného dátového typu, musíme ich previesť na jednotlivé znaky, aby sme ich mohli zobraziť na LCD obrazovke. Takže používame operátor modulu na získanie jednej číslice a delením premennej 10 na získanie desiatkovej číslice. To isté sa robí pre všetky premenné.
// Rozdelíme na char, aby sa zobrazili na lcd char sec_0 = sec% 10; char sec_1 = (s / 10); char min_0 = min% 10; char min_1 = min / 10; char hour_0 = hodina% 10; char hour_1 = hodina / 10; char date_0 = dátum% 10; char date_1 = dátum / 10; char month_0 = mesiac% 10; char month_1 = mesiac / 10; char year_0 = rok% 10; char year_1 = rok / 10;
Ostáva už iba zobraziť informácie, ktoré sme získali, na obrazovke LCD. To sa dá ľahko urobiť pomocou funkcií LCD, o ktorých sme už hovorili v našom výučbe LCD. Takže kód na zobrazenie času je uvedený nižšie, rovnaká metóda sa používa aj na zobrazenie dátumu. Po zobrazení údajov je dané oneskorenie 500 ms, aby fungovalo ako interval aktualizácie.
Lcd_Clear (); Lcd_Set_Cursor (1,1); Lcd_Print_String ("TIME:"); Lcd_Print_Char (hodina_1 + „0“); Lcd_Print_Char (hodina_0 + '0'); Lcd_Print_Char (':'); Lcd_Print_Char (min_1 + '0'); Lcd_Print_Char (min_0 + '0'); Lcd_Print_Char (':'); Lcd_Print_Char (sec_1 + '0'); Lcd_Print_Char (sec_0 + '0');
Stručné vysvetlenie hlavičkového súboru PIC16F877a_DS3231.h:
Doteraz vysvetlené veci stačia na použitie modulu DS3231 s PIC pre vaše vlastné projekty, ale pre zvedavé mysle by chceli vedieť, čo sa vlastne deje vo vnútri hlavičkového súboru a dáta sú v skutočnosti prijímané z RTC modulu PIC čítaj ďalej.
Najlepším spôsobom, ako to prekonať, je úplné prečítanie údajového listu produktu DS3231. Pre stručnú informáciu o tom, čo je potrebné, modul funguje ako podriadený PIC a adresa všetkých modulov DS3231 je D0. Takže do modulu napíšeme dáta, ktoré musia odovzdať adresu D0 a do Čítania údajov z RTC musíme odovzdať adresu D1. Ak zadáme zápisovú adresu modulu RTC, pripravíme sa na získanie údajov z PIC, takže následné dáta napísané PIC budú prijaté a uložené v RTC module. Podobne, ak pošleme adresu na čítaniepotom by sa mal PIC pripraviť na načítanie hodnôt z RTC, pretože modul RTC začne odosielať všetky údaje, ktoré má. Bitová sekvencia pre D0 aj D1 je uvedená nižšie z údajového listu. Všimnite si, že adresa 0b11010000 znamená D0 (zápis) a 0b11010001 znamená D01 (čítanie)
Keď PIC pošle adresu D0 alebo D1 buď na zápis alebo na čítanie, nasledujúce dáta by sa mali čítať alebo písať v poradí. Táto objednávka je uvedená v nasledujúcej tabuľke. Takže prvé dáta budú sek (00h) nasledované minútami (01h) nasledovanými hodinami (02h) nasledovanými dňom (03h) a až do MSB teploty.
Modul RTC nechápe desatinné hodnoty, komunikuje iba prostredníctvom hodnôt BCD. Pred zápisom akýchkoľvek hodnôt do modulu RTC by sa teda mali previesť na BCD a tiež hodnoty prijaté z modulu RTC budú vo formáte BCD a mali by sa previesť na desatinné, aby to malo pre nás zmysel. Z tohto dôvodu umožňuje vytvoriť všetky funkcie potrebné pre používanie modulu RTC.
Funkcie BCD_2_DEC a DEC_2_BCD:
Prvé dve funkcie by sa použili na prevod BCD údajov na desatinné a desatinné údaje na BCD, pretože modul RTC chápe iba BCD. Vzorce na prevod BCD na desatinné miesto a pre BCD na desatinné miesto sú
Desatinné miesto = (BCD >> 4) * 10 + (BCD a 0x0F) BCD = ((Desatinné miesto / 10) << 4) + (Desatinné miesto% 10)
Musíme len použiť tieto dva vzorce na vytvorenie funkcie, ktorá vezme opačnú jednotku ako parameter a prevedie ju na požadovaný formát a vráti ju, funkcia toho istého je uvedená nižšie
int BCD_2_DEC (int to_convert) { return (to_convert >> 4) * 10 + (to_convert & 0x0F); } int DEC_2_BCD (int to_convert) { return ((to_convert / 10) << 4) + (to_convert% 10); }
Funkcia Set_Time_Date ():
Táto funkcia zapíše hodnotu času a dátumu z PIC do modulu RTC. Hodnoty reálneho času a dátumu musí užívateľ aktualizovať v premenných sec, min, hodina, dátum, mesiac a rok. Tieto hodnoty sa potom prevedú na BCD a zapíšu sa do modulu RTC.
Ako sme diskutovali, na zápis hodnoty do modulu RTC je potrebné odovzdať adresu D0 a zapísať bitový bit 0, aby sa zahájil proces zápisu. Potom môžeme údaje odoslať v poradí, ako je uvedené v tabuľke vyššie.
void Set_Time_Date () { I2C_Begin (); I2C_Write (0xD0); I2C_Write (0); I2C_Write (DEC_2_BCD (s)); // aktualizácia sek I2C_Write (DEC_2_BCD (min)); // aktualizácia min I2C_Write (DEC_2_BCD (hodina)); // hodina aktualizácie I2C_Write (1); // ignoruj aktualizačný deň I2C_Write (DEC_2_BCD (dátum)); // dátum aktualizácie I2C_Write (DEC_2_BCD (mesiac)); // aktualizácia mesiac I2C_Write (DEC_2_BCD (rok)); // rok aktualizácie I2C_End (); }
Funkcia Update_Current_Date_Time ():
Posledná funkcia v knižnici je tá, ktorá slúži na načítanie času a dátumu z modulu RTC a ich prenos do mikrokontroléra PIC. Táto funkcia je rozdelená do troch segmentov, jeden na zahájenie procesu čítania, druhý na načítanie hodnôt a ich uloženie do globálnych premenných, ako sú sek, min, hodina, dátum, mesiac a rok. A tretie je uznanie, že čítanie bolo úspešné.
Všimnite si, že pri každej akcii by sa mala začať a ukončiť komunikácia I2C.
Aby sme mohli načítať hodnoty z RTC, musíme poslať adresu D0 nasledovanú číslom 0. To spôsobí, že modul RTC pošle všetky hodnoty, ktoré má, v poradí uvedenom v tabuľke vyššie. Len ich môžeme čítať, prevádzať na desatinné miesta a ukladať ich do premenných v rovnakom poradí.
Nakoniec po prečítaní modul RTC pošle potvrdzovací bit, ktorý by sa mal tiež prečítať a potvrdiť.
void Update_Current_Date_Time () { // ZAČAŤ čítať I2C_Begin (); I2C_Write (0xD0); I2C_Write (0); I2C_End (); // PREČÍTAJTE si I2C_Begin (); I2C_Write (0xD1); // Inicializácia načítania dát sec = BCD_2_DEC (I2C_Read (1)); min = BCD_2_DEC (I2C_Read (1)); hodina = BCD_2_DEC (I2C_Read (1)); I2C_Read (1); dátum = BCD_2_DEC (I2C_Read (1)); mesiac = BCD_2_DEC (I2C_Read (1)); rok = BCD_2_DEC (I2C_Read (1)); I2C_End (); // END Reading I2C_Begin (); I2C_Write (0xD1); // Inicializácia načítaných dát I2C_Read (1); I2C_End (); }
Simulácia:
Projekt je možné simulovať pomocou simulačného softvéru Proteus. Pripojte káble podľa schémy zapojenia a vložte hexadecimálny súbor do PIC radiča. Pri simulácii nájdete dve vyskakovacie okná a dátum a čas zobrazené na LCD displeji, ako je to znázornené nižšie.
Malý v hornej časti zobrazuje čas a dátum, ktorý je aktuálny vo vnútri modulu RTC, a druhým vyskakovacím oknom je ladiaci program I2C. Je to vynikajúci nástroj na kontrolu, aké údaje sa v skutočnosti prenášajú do a z chyby I2C.
Zobraziť čas a dátum na LCD:
Akonáhle je váš hardvér pripravený a kód sa stiahne ako súbor ZIP pomocou daného odkazu, otvorte program pomocou MPLABX IDE. Najprv musíte spustiť IDE a použiť možnosť otvoreného projektu, prejsť na obsah vo vnútri súboru ZIP a otvoriť priečinok.X.
Jednoducho skontrolujte, či sa program kompiluje, a pomocou PicKit3 nahrajte kód do svojho hardvéru. Hneď ako sa program načíta, mala by sa zobraziť úvodná správa a potom by sa mal zobraziť čas a dátum, ako je uvedené nižšie.
Pokiaľ na LCD nič nie je, skontrolujte svoje zapojenie a nastavením potenciometra sa uistite, či je správne nastavená úroveň kontrastu. Takto môžete ukázať čas a dátum všetkým svojim projektom mikrokontrolérov PIC a môžete ich použiť ako digitálne hodiny. Dúfam, že ste sa dozvedeli niečo nové a páčilo sa vám učenie tohto tutoriálu. Ak ste narazili na akýkoľvek problém, uverejnite ich v komentároch nižšie alebo na fórach so žiadosťou o technickú pomoc.
Stiahnite si odtiaľto kompletný program PIC pre tento projekt so súbormi hlavičiek a ďalej si pozrite všetky naše výukové programy PIC tu.