- Potrebni materiali:
- RTC modul:
- Povezava DS3231 RTC z mikrokrmilnikom PIC:
- Programiranje PIC za RTC modul:
- Kratka razlaga datoteke glave PIC16F877a_DS3231.h:
- Simulacija:
- Prikaz časa in datuma na LCD-prikazovalniku:
Skoraj vse vgrajene naprave so zasnovane za interakcijo z resničnim svetom. Delujejo kot most za komunikacijo med digitalnim svetom in resničnim svetom. Da bi bil ta postopek lažji in učinkovitejši, bi moral digitalni svet včasih spremljati čas in datum resničnega sveta. Tako bo digitalni svet vedel, koliko je ura / dan v resničnem svetu, in lahko celo ločil med dnevnim in nočnim časom. Lahko deluje tudi kot časovni vir za izvajanje določenih nalog ob določenem času ali datumu. Tukaj torej povezujemo RTC modul z mikrokrmilnikom PIC in prikazujemo uro in datum na LCD 16x2. Ta projekt se lahko uporablja tudi kot digitalna ura.
Potrebni materiali:
- Regulirano napajanje 5V
- PIC16F877A
- Kristalni oscilator 20 MHz
- Kondenzator 33 pf - 2 št
- Upor 10K, 5.1K, 1K
- Modul DS3231 RTC
- LONČEK -10k
- LCD modul 16 * 2
- Priključne žice
RTC modul:
Najpogostejši način, kako mikrokrmilnik spremlja čas ali datum resničnega sveta, je uporaba IC RTC. Izraz RTC pomeni uro v realnem času; ta IC spremlja čas in datum v resničnem svetu in bi te podatke delil z mikrokrmilnikom, kadar koli je to potrebno. RTC IC, ki ga tukaj uporabljamo, je najbolj priljubljen in natančen DS3231. Ta IC vsako leto odnese le nekaj sekund in je zato zelo zanesljiv. Zaradi te vadnice uporabljamo modul DS3231 RTC, ki ga je mogoče enostavno kupiti v spletu ali v lokalni trgovini s strojno opremo. Modul ima 3V kovansko celico, ki vedno napaja RTC modul, zato se bo po nastavitvi ure in datuma posodabljal, dokler je kovanska celica živa.
Modul DS3231 komunicira s pomočjo protokola I2C, zato, če se ne zavedate, kaj je to in kako se uporablja s PIC, pred nadaljevanjem preberite vadnico I2C s PIC. Tudi v tej vadnici bomo ustvarili datoteko z glavo, ki jo bomo lahko uporabili za komunikacijo z našim modulom RTC in jo tudi preizkusili na strojni opremi, tako da prikažemo čas in datum na LCD zaslonu, zato je pomembno tudi, kako se naučiti vmesnika LCD zaslon z mikrokrmilnikom PIC. Datoteko z glavo, ustvarjeno v tej vadnici za DS3231, lahko pozneje uporabite / spremenite, da bo ustrezala vašim aplikacijam.
DS3231 RTC smo z Arduinom že uporabljali v spodnjih projektih:
- Samodejni podajalnik hišnih ljubljenčkov z uporabo Arduina
- Arduino Data Logger
Povezava DS3231 RTC z mikrokrmilnikom PIC:
Shema vezja za digitalno uro na osnovi mikrokrmilnika PIC je podana spodaj. Kot smo že povedali, DS3231 deluje s pomočjo komunikacije I2C, tako da bo imel zaporedno uro (SCL) in zaporedni podatki (SDA), ki jih je treba priključiti na zatiče I2C na našem PIC, ki je zatič 18 (SCL) in zatič 23 (SDA). Vlečni upor vrednosti 4.7k se uporablja za ohranjanje vodila v stanju mirovanja.
Za prikaz trenutnega datuma in ure je na zatiče na priključku D povezan tudi LCD zaslon. Celoten diagram vezja je bil zasnovan na proteusu in je prikazan spodaj. Istega bomo uporabili za simulacijo ali programiranje kasneje v tej vadnici.
Sledite shemi vezja in ustrezno vzpostavite povezave, zgoraj prikazano polje I2C se uporablja za odpravljanje napak I2C, zato tega ne bomo vključili v naše povezave. Prav tako ni prikazano, da je treba modul RTC napajati z napajanjem + 5V z uporabo zatičev Vcc in Ground na modulu. Za povezavo sem uporabil svojo ploščo in po vzpostavitvi zahtevanih povezav je bila moja postavitev videti spodaj nekako tako.
Če ste nov v PIC Microcontrollerju, začnite z Uvod v PIC Microcontroller.
Programiranje PIC za RTC modul:
Celoten program za to digitalno uro lahko prenesete iz ZIP datoteko tukaj. Program vključuje skupaj tri datoteke z glavo. To so datoteka lcd.h za delo z LCD zaslonom, datoteka PIC16F877a_I2C.h za delo s komunikacijo I2C s PIC in na koncu PIC16F877a_DS3231.h datoteko za delo z moduli RTC. Vse tri datoteke z glavo so potrebne za ta program in so na voljo v zgornji datoteki ZIP. V nadaljevanju bom razložil glavni program, ki uporablja vse te glave datoteke za branje ure in datuma iz modula RTC ter prikaz na LCD zaslonu. Po tem bom razložil, kaj se dejansko dogaja znotraj datoteke glave RTC. Kot vedno začnite program z nastavitvijo nastavitvenih bitov in nastavitvijo frekvence ure na 20 MHz, saj je to tisto, kar uporabljamo v naši strojni opremi.
#pragma config FOSC = HS // Oscilator bitov za izbiro (HS oscilator) #pragma config WDTE = OFF // Bit Watchg Enable bit (WDT disabled) #pragma config PWRTE = ON // Power-up Timer Enable bit (PWRT enabled) # pragma config BOREN = ON // Rit-out Reset Enable bit (BOR enabled) #pragma config LVP = OFF // Nizkonapetostni (enojni napajalnik) vklopni serijski programirni bit (RB3 je digitalni I / O, HV vklopljen) Za programiranje je treba uporabiti MCLR) #pragma config CPD = OFF // Bit EEPROM Data Protection Protection bit (Data EEPROM code protection off) #pragma config WRT = OFF // Flash Program Memory Write Enable bit (Write protection off; all programski pomnilnik lahko pošljejo na naslov EECON) #pragma config CP = OFF // Bit programa za zaščito pomnilniške kode Flash programa (zaščita kode izklopljena) #define _XTAL_FREQ 20000000
Naslednji korak bi bil definiranje zatičev LCD-ja, če pogledate strojno opremo, lahko opazite, da smo zatiče LCD-ja priključili na PORT D od RD2 do RD7, zato določimo enako, kot je prikazano spodaj.
#define RS RD2 #define EN RD3 #define D4 RD4 #define D5 RD5 #define D6 RD6 #define D7 RD7
Ko ste kupili modul RTC, privzeto v njem ne bosta nastavljena pravilna ura in datum, zato ga moramo nastaviti v našem programu. Tako prijavimo spremenljivko za vsak podatek in vir v realnem času in datumu, kot je prikazano spodaj. V času nalaganja programa sta bila moj čas in datum 6.5.2018 ob 10.55, zato sem spremenljivke nastavil kot spodaj. Nastavite lahko pravi čas in datum glede na vašo dejansko vlogo
/ * Nastavite trenutno vrednost datuma in časa pod * / int sec = 00; int min = 55; int ura = 10; int datum = 06; int mesec = 05; int leto = 18; / * Nastavitev časa in datuma * /
Nato dodamo vse datoteke z glavo, o katerih smo razpravljali. Če ste program prenesli in odprli iz datoteke ZIP, potem to ne bo problem, sicer poskrbite, da bodo vse datoteke z glavo dodane v izvorno datoteko ali v imenik projekta.
#include
Ker smo PORT D uporabili kot izhodne nožice za povezovanje LCD-ja, jih moramo v našem programu prijaviti kot izhodne nožice in inicializirati LCD-zaslon, kot je prikazano spodaj
TRISD = 0x00; // Naredite zatiče vrat D kot izhodne za povezavo LCD Lcd_Start (); // Inicializacija LCD modula
Modul RTC komunicira s pomočjo protokola I2C, zato moramo omogočiti komunikacijo I2C s svojim mikrokrmilnikom PIC. Večina naprav, vključno z našimi moduli DS3231, ima delovno frekvenco I2C 100KHz, zato komunikacijo I2C začnemo s frekvenco 100KHz, kot je prikazano spodaj
I2C_Initialize (100); // Inicializirajte I2C Master z uro 100KHz
Takoj, ko vzpostavimo komunikacijo I2C z modulom RTC, najprej nastavimo trenutni čas in datum, ki smo ga vnesli v naš program. To lahko storite s klicem funkcije set_Time_Date, kot je prikazano spodaj. Ko sta čas in datum nastavljena, bo modul samodejno sledil in ju povečeval kot digitalna ura.
Set_Time_Date (); // nastavimo uro in datum na modulu RTC
Kot znak, da se je program zagnal, bomo prikazali majhno uvodno sporočilo, ki bo na zaslonu ostalo 2 sekundi. To sporočilo bo na zaslonu prikazalo RTC s PIC –Circuit Digest . Program za isto je prikazan spodaj
Lcd_Clear (); Lcd_Set_Cursor (1,1); Lcd_Print_String ("RTC s PIC"); Lcd_Set_Cursor (2,1); Lcd_Print_String ("-Velikost kroga"); __zakasnitev_ms (1500);
Znotraj naše neskončno while zanke bi morali prebrati trenutni čas in datum in nato prikaže vrednosti v našem LCD zaslonu. Za branje ure in datuma iz modula RTC lahko uporabite funkcijo Update_Current_Time_Date, kot je prikazano spodaj. Ta funkcija bo prebrala vrednost iz modula RTC in posodobila spremenljivke sek, min, uro, datum, mesec in leto s trenutnimi vrednostmi. Potem jih lahko uporabimo za svoj namen.
Update_Current_Date_Time (); // Preberite trenutni datum in uro iz modula RTC
Spremenljivke so celoštevilčnega podatkovnega tipa, pretvoriti jih moramo v posamezne znake, da jih lahko prikažemo na LCD zaslonu. Torej z operatorjem modula dobimo enkratno številko in spremenljivko delimo z 10, da dobimo desetko. Enako se naredi za vse spremenljivke.
// Razdelimo na char za prikaz na lcd char sec_0 = sec% 10; char sec_1 = (sec / 10); char min_0 = min% 10; char min_1 = min / 10; char ura_0 = ura% 10; char ura_1 = ura / 10; char datum_0 = datum% 10; char datum_1 = datum / 10; char mesec_0 = mesec% 10; char mesec_1 = mesec / 10; char leto_0 = leto% 10; char leto_1 = leto / 10;
Preostane nam le še prikaz informacij, ki smo jih pridobili na LCD zaslonu. To lahko enostavno storite s funkcijami LCD, o katerih smo že razpravljali v naši vadnici LCD. Koda za prikaz časa je torej podana spodaj, ista metoda se uporablja tudi za prikaz datuma. Po prikazu podatkov je podana zakasnitev 500 ms, ki deluje kot interval posodabljanja.
Lcd_Clear (); Lcd_Set_Cursor (1,1); Lcd_Print_String ("TIME:"); Lcd_Print_Char (ura_1 + '0'); Lcd_Print_Char (ura_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');
Kratka razlaga datoteke glave PIC16F877a_DS3231.h:
Do zdaj pojasnjene stvari zadoščajo za uporabo modula DS3231 s PIC za vaše lastne projekte, toda radovedneži bi želeli vedeti, kaj se dejansko dogaja v zaglavni datoteki, PIC pa podatke dejansko prejme iz modula RTC. preberite dalje.
Najboljši način, da to storite, je popolno branje podatkovnega lista DS3231. Če želite na kratko opisati, kaj potrebujete, modul deluje kot pomožni element PIC in naslov vseh modulov DS3231 je D0. Tako v modul zapišemo podatke, da moramo predati naslov D0, za branje podatkov iz RTC pa naslov D1. Če posredujemo naslov za pisanje modulu RTC, se pripravimo na pridobivanje podatkov iz PIC, tako da bodo posledični podatki, ki jih je zapisal PIC, prejeti in shranjeni v modulu RTC. Podobno, če pošljemo naslov za branjepotem se mora PIC pripraviti na branje vrednosti iz RTC, saj bo RTC modul začel pošiljati vse podatke, ki jih ima. Zaporedje bitov za D0 in D1 je prikazano spodaj iz obrazca. Upoštevajte, da naslov 0b11010000 pomeni D0 (pisanje), 0b11010001 pa D01 (branje)
Ko PIC pošlje naslov D0 ali D1 bodisi za pisanje bodisi za branje, bi morali naslednji podatki brati ali zapisati v vrstnem redu. Ta vrstni red je prikazan v spodnji tabeli. Torej, prvi podatki bodo v sekundah (00h), sledijo minute (01h), sledijo ure (02h), sledijo dan (03h) in do MSB temperature.
Modul RTC ne razume decimalnih vrednosti, komunicira samo prek vrednosti BCD. Torej je treba pred zapisovanjem kakršnih koli vrednosti v modul RTC pretvoriti v BCD in tudi vrednosti, prejete iz modula RTC, bodo v obliki BCD in bi morale biti pretvorjene v decimalke, da bo za nas smiselno. S tem v mislih ustvarimo vse funkcije, potrebne za uporabo modula RTC.
Funkciji BCD_2_DEC in DEC_2_BCD:
Prvi dve funkciji bi bili uporabljeni za pretvorbo podatkov BCD v decimalke, decimalke pa v BCD, saj modul RTC razume samo BCD. Formule za pretvorbo BCD v decimalno in za BCD v decimalno je
Decimalno = (BCD >> 4) * 10 + (BCD & 0x0F) BCD = ((decimalno / 10) << 4) + (decimalno% 10)
Ti dve formuli moramo uporabiti le za ustvarjanje funkcije, ki kot parameter vzame nasprotno enoto in jo pretvori v zahtevani format in vrne, funkcija za isto je prikazana spodaj
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); }
Funkcija Set_Time_Date ():
Ta funkcija bo zapisala vrednost časa in datuma iz modula PIC v modul RTC. Vrednosti realnega časa in datuma mora uporabnik posodobiti v spremenljivkah sec, min, ura, datum, mesec in leto. Te vrednosti bodo nato pretvorjene v BCD in zapisane v modul RTC.
Kot smo že razpravljali, moramo za zapis vrednosti v modul RTC prenesti naslov D0 in zapisati bikovni bit 0, da začnemo postopek pisanja. Nato lahko podatke pošljemo v vrstnem redu, kot je prikazano v zgornji tabeli.
void Set_Time_Date () { I2C_Begin (); I2C_Write (0xD0); I2C_Write (0); I2C_Write (DEC_2_BCD (sek)); // posodobitev sek I2C_Write (DEC_2_BCD (min)); // posodobitev min I2C_Write (DEC_2_BCD (ura)); // posodobitev ure I2C_Write (1); // prezremo posodabljanje dneva I2C_Write (DEC_2_BCD (datum)); // datum posodobitve I2C_Write (DEC_2_BCD (mesec)); // posodobitev meseca I2C_Write (DEC_2_BCD (leto)); // leto posodobitve I2C_End (); }
Funkcija Update_Current_Date_Time ():
Zadnja funkcija v knjižnici je tista, ki se uporablja za branje ure in datuma iz modula RTC ter njegovo posredovanje mikrokrmilniku PIC. Ta funkcija je razdeljena na tri segmente, eden za začetek branja, drugi za branje vrednosti in shranjevanje v globalne spremenljivke, kot so sek, min, ura, datum, mesec in leto. In tretji je priznanje, da je bilo branje uspešno.
Upoštevajte, da je treba za vsako dejanje komunikacijo I2C začeti in končati.
Za branje vrednosti iz RTC moramo poslati naslov D0, ki mu sledi 0. Tako bo modul RTC poslal vse vrednosti, ki jih ima, v vrstnem redu, prikazanem v zgornji tabeli. Preberemo jih lahko, da jih pretvorimo v decimalke in jih shranimo med spremenljivke v istem vrstnem redu.
Po končanem branju bo RTC modul poslal bit za potrditev, ki ga je treba prebrati in potrditi.
void Update_Current_Date_Time () { // START za branje I2C_Begin (); I2C_Write (0xD0); I2C_Write (0); I2C_End (); // PREBERI I2C_Begin (); I2C_Write (0xD1); // inicializiramo branje podatkov sec = BCD_2_DEC (I2C_Read (1)); min = BCD_2_DEC (I2C_Read (1)); ura = BCD_2_DEC (I2C_Read (1)); I2C_Read (1); datum = BCD_2_DEC (I2C_Read (1)); mesec = BCD_2_DEC (I2C_Read (1)); leto = BCD_2_DEC (I2C_Read (1)); I2C_End (); // KONEC Branje I2C_Begin (); I2C_Write (0xD1); // inicializiramo branje podatkov I2C_Read (1); I2C_End (); }
Simulacija:
Projekt je mogoče simulirati s pomočjo programske opreme za simulacijo Proteus. Vzpostavite povezave, kot je prikazano na vezju, in vstavite šestnajstiško datoteko v krmilnik PIC. Ko ga simulirate, najdete dve pojavni okenci in datum in čas, prikazana na LCD-prikazovalniku, kot je prikazano spodaj.
Majhna na vrhu prikazujeta čas in datum, ki sta trenutno v modulu RTC, drugo pojavno okno pa je razhroščevalnik I2C. Je izvrstno orodje za preverjanje, kateri podatki se dejansko prenašajo in odvajajo v napako I2C.
Prikaz časa in datuma na LCD-prikazovalniku:
Ko je vaša strojna oprema pripravljena in se koda prenese v obliki datoteke ZIP prek dane povezave, odprite program s pomočjo MPLABX IDE. Najprej morate zagnati IDE in uporabiti možnost odprtega projekta, pobrskati do vsebine v datoteki ZIP in odpreti mapo.X.
Preprosto s programom PicKit3 preverite, ali program prevaja in naložite kodo v svojo strojno opremo. Takoj, ko se program naloži, se prikaže uvodno sporočilo, nato pa se prikažeta čas in datum, kot je prikazano spodaj.
Če na LCD-prikazovalniku ni ničesar, preverite povezave in s spreminjanjem potenciometra preverite, ali je nivo kontrasta pravilno nastavljen. Tako lahko prikažete čas in datum vsem svojim projektom mikrokrmilnikov PIC in to lahko uporabite kot digitalno uro. Upam, da ste se naučili nekaj novega in uživali v učenju te vadnice. Če imate kakršne koli težave, jih objavite v spodnjih komentarjih ali na forumih za tehnično pomoč.
Prenesite celoten program PIC za ta projekt z zaglavnimi datotekami od tukaj in nadalje preglejte vse vadnice PIC tukaj.