Ds1307 məftil diaqramı montajçısı. AVR təlim kursu

Dərs 17

1-ci hissə

Real vaxt saatı DS1307

Proqramlaşdırma dərslərimizə davam edirik MK AVR.

Və bu gün çox yaxşı bir mikrosxemlə tanış olacağıq DS1307. Bu çip təmsil edir real vaxt saatı (real vaxt saatı və ya RTC).

Həmçinin, mikrokontroller və bu çip arasında əlaqə interfeysdən istifadə edərək baş verəcəyinə görə I2C, bu avtobusun proqramlaşdırılması mövzusunu bir daha gücləndirəcəyik.

Bu mikrosxem şirkət tərəfindən təqdim olunur Dallas, burada onun pinout və əsas texniki xüsusiyyətləri var

Burada görürük ki, SDA və SCL ayaqlarımız var, hansı məqsədini çox yaxşı bilirik. 32768 Hz tezliyində bir kvars rezonatorunu birləşdirmək üçün X1 və X2 sancaqları, güc sancaqları - VCC və GND, müəyyən registrlərin parametrlərindən asılı olaraq 1 saniyə və ya digər tezlik davam edən impulslar üçün çıxış, həmçinin batareya üçün müsbət kontakt var. əsas enerji söndürüldükdə saatın tıqqıltısını saxlamaq üçün bağlıdır. Bu batareyanın mənfi kontaktını ümumi elektrik naqilinə bağlayırıq.

Bu çipin planar və DIP paketlərində mövcud olduğunu da görürük.

Bu mikrosxem həm 3 voltdan, həm də 5 voltdan enerji ala bilər.

I2C interfeysi vasitəsilə bu mikrosxemə giriş, prinsipcə, eyni şəkildə baş verir. son dərsdə istifadə etdiyimiz yaddaş çipi kimi. Əlbəttə ki, bəzi nüanslar olacaq, lakin bu barədə daha sonra.

Bu çipi EEPROM çipinin quraşdırıldığı eyni modulda quraşdırdığımdan və bir mübadilə avtobusumuz olduğundan, DS1307 çipi, əlbəttə ki, ünvandan fərqli olduğu ünvanda ünvanlandığını "tanıyacaq". EEPROM çipinə aiddir.

Burada məlumatları qəbul edən və ötürən mikrosxemin diaqramları verilmişdir

Bu çipə daxil olacağımız ünvan mavi rənglə vurğulanır.

Əsasən. EEPROM çipinin diaqramları ilə çox fərq görmürük.

İdarəetmədə başqa bir fərq yaddaşın ünvanlanmasının artıq bir bayt olacağıdır, çünki yaddaş hüceyrələri və ya qeydiyyatdan keçir Bu mikrosxem çox azdır.

Bu registrlər belədir

Bu registrlərin məqsədi:

00h- saniyə. Saniyələr ikili onluq formatda saxlanılır. Yəni, aşağı 4 bit saniyə vahidlərini, daha yüksək üç bit isə onlarla saxlayır. Bir SH biti də var - bu çip başlanğıc bitidir.

01h- dəqiqə. Eyni şəkildə saxlanılır.

02h- daha universal reyestr. Saatın saxlandığı yer budur. Dörd ən az əhəmiyyətli bitdə vahidlər, sonrakı iki yuxarıda onlarla, növbəti 6-cı bitdə günorta və ya günortadan əvvəl olmasının bayrağı var, 7-ci bitdə saxlama rejimi var - 12 saat və ya 24 saat.

03h- həftənin günü. Ən az əhəmiyyətli 3 bitdə saxlanılır, qalan bitlər istifadə edilmir.

04 saat— ayın günü burada, həmçinin ikilik onluq formatda saxlanılır. Dörd ən az əhəmiyyətli bit birləri ehtiva edir, sonrakı iki daha yüksək olanlar onlarla ehtiva edir, qalan bitlər istifadə edilmir.

05 saat- ildəki ayın sayı - saatla eyni şəkildə ikilik onluq formatda saxlanılır.

06 saat- ilin nömrəsi və tam dörd rəqəmli deyil, yalnız iki rəqəmli. Ən az əhəmiyyətli dörd bit birdir, ən yüksək dörd bit isə onlarladır.

Biz bu yeddi registrdən istifadə edəcəyik. Son registr mikrosxemin nəbz çıxışında nəbz tezliyini konfiqurasiya etmək üçün nəzərdə tutulmuşdur, bu, registrin aşağı iki bitində edilir; standart olaraq 1 Hz tezliyi olacaq, bu, iki nöqtəni qırpmaq üçün kifayətdir, ona görə də bu bitlərdən istifadə etməyəcəyik. SOWE və OUT bitləri də kvadrat dalğa formasını konfiqurasiya etmək və işə salmaq üçün istifadə olunur.

Bu çiplə işləmək üçün bir layihə adı ilə adi şəkildə yaradılmışdır Saatım 1307, EEPROM ilə əlaqəli fayllar oradan silindi və fayllar əlavə edildi RTC.cRTC.h.

#ifndefMAIN_H_

#müəyyənləşdirməkMAIN_H_

#müəyyənləşdirməkF_CPU8000000UL

#daxildir

#daxildir

#daxildir

#daxildir

#daxildir

#daxildir"usart.h"

#daxildir"twi.h"

#daxildir"RTC.h"

#endif/* MAIN_H_ */

Əsas faylda MyClock1307.c həftənin vaxtını, tarixini və gününü saxlamaq üçün qlobal dəyişənlər yaradaq və ondan sonra bütün lazımsız şeyləri sildikdən sonra tam məzmun belə olacaq

#daxildir"main.h"

imzasızcharsan, min, saat, gün, Tarix, ay, il;

intəsas( boş)

I2C_Init();

USART_Init(8);

ikən(1)

Əvvəlki koddan qalan yalnız I2C və USART-ın işə salınmasıdır.

İndi birtəhər çipi ümumiyyətlə işə salmalıyıq. Mikrosxem yenidirsə və ya heç istifadə olunmayıbsa və ya kimsə CH bitinin dəyərini hansısa məqsəd üçün dəyişdiribsə, o, hələ "işləmir".

Yaxşı, ümumiyyətlə, mikrosxem registrlərindəki bütün dəyərləri təyin etdikdən sonra o başlayacaq və saatımız başlayacaq.

Qoşulma və ya dövrə də əvvəlki dərsdən istifadə olunur, yəni terminal proqramında USART avtobusu vasitəsilə vaxta baxacağıq.

Buna görə də, əslində, əvvəlki dərsdən əldə etdiyimiz biliklərdən istifadə edərək, vaxtı təyin etmək üçün bir funksiya yazmaq üçün yazacağıq.

İlk növbədə, biz, əlbəttə, START şərtini keçəcəyik

//Vaxtı təyin edin

I2C_Start Condition();

Sonra 0 yazma biti ilə ünvanı ötürürük

I2C_Start Condition();

I2C_SendByte(0b11010000);

Gəlin 0 ünvanına gedək, yəni yaddaşın ilk registrinin yerləşdiyi hissəsinə

I2C_SendByte(0b11010000);

I2C_SendByte(0); //0x00-a keçin

Mikrosxemin registrlərinə hər hansı bir dəyər yazmazdan əvvəl xatırlayırıq ki, əvvəlcə nömrələri registrlər üçün əlverişli olan BCD formatına çevirməliyik. Bunun üçün RTC.c faylına keçib belə bir funksiya yazacağıq. Bu, çox asan olacaq və heç bir izahata ehtiyac yoxdur.

imzasızcharRTC_ConvertFromBinDec( imzasızcharc)

{

imzasızcharch= (( c/10)<<4)|( c%10);

qayıtmaqch;

}

Yaxşı, bir ədədi ikilik-onluq formatdan ondalığa çevirərək tərs tipli bir funksiya yazaq. Onun köməyi ilə biz, əksinə, oxuma vaxtının oxunuşlarını qavrayışımız üçün əlverişli bir formaya çevirəcəyik (HRI - insan tərəfindən oxunan interfeys)

imzasızcharRTC_ConvertFromDec( imzasızcharc)

{

imzasızcharch= (( c>>4)*10+(0b00001111&c));

qayıtmaqch;

}

Burada da hər şey çox aydındır, baytın yüksək tetradını sağa sürüşdürürük, onu ona vururuq və aşağı tetradı əlavə edirik (yüksək tetradı sıfırlarla maskalayırıq)

Bu funksiyaların prototiplərini fayla yazaq RTC.c

#daxildir"main.h"

imzasızcharRTC_ConvertFromDec( imzasızcharc); //BCD ədədini ondalığa çevirin

imzasızcharRTC_ConvertFromBinDec( imzasızcharc);

Proqramçı, yaddaş çipi və USB-TTL adapteri olan RTC DS1307 modulunu buradan əldə etmək olar:

Proqramçı (etibarlı satıcı) USBASP USBISP 2.0

VİDEO TƏLİMATINA baxın (şəkilin üzərinə klikləyin)

Göndərmə Baxışları: 7,354

DS1307 həmçinin RTC (Real Time Clock) adlanır. Bu çip real vaxt saatı və təqvimdir. Mikrosxem ilə əlaqə I 2 C interfeysi vasitəsilə həyata keçirilir. Lakin DS1307-nin bir çatışmazlığı var: daxil edilmiş məlumatların düzgün olub olmadığını yoxlamır. Mikrosxem ilə işləmək üçün sizə minimal dəst lazımdır: 32768Hz tezliyində kvars, 3 voltluq batareya və iki 4,7 kOhm rezistor. Bağlantı diaqramı DS1307:

BASCOM-AVR-də DS1307 ilə işləmək

Mikrosxemlə işləməyə başlamaq üçün bunun üçün mikrosxemin bağlı olduğu portları konfiqurasiya etməlisiniz, əmrdən istifadə edin; konfiqurasiya:
Sda konfiqurasiyası =(DS1307 çipinin SDA ayağının qoşulduğu mikrokontroller portu)
Konfiqurasiya Scl =(DS1307 çipinin SCL ayağının qoşulduğu mikrokontroller portu)
Misal üçün:
Konfiqurasiya Sda = Portb.1
Config Scl = Portb.0

Limanları konfiqurasiya etdikdən sonra çiplə işləməyə başlaya bilərsiniz: məlumatları oxumaq və yazmaq. DS1307 çipindən vaxt və tarix belə oxuna bilər:

I2cstart I2cwbyte &HD0 I2cwbyte &H00 I2cstart I2cwbyte &HD1 I2crbyte (saniyələri yazdığımız dəyişən), Ack I2crbyte (dəqiqələri yazdığımız dəyişən), Ack I2crbyte (saatları yazdığımız dəyişən), Ack I2crbyte (bizim dəyişən) həftənin gününün nömrəsini yazın), Ack I2crbyte (tarixi yazdığımız dəyişən), Ack I2crbyte (ay nömrəsini yazdığımız dəyişən), Ack I2crbyte (ilin yazıldığı dəyişən), Nack I2cstop

Məlumatı oxuduqdan sonra onu onluq formata çevirməlisiniz, məsələn:
(saniyə dəyişəni) = Makedec((saniyə dəyişəni) )
(dəqiqə dəyişəni) = Makedec((dəqiqə dəyişəni) )
(saat dəyişəni) = Makedec((saat dəyişəni) )
(həftənin günü dəyişən) = Makedec((həftənin günü dəyişən) )
(tarix dəyişəni) = Makedec((tarix dəyişəni) )
(ay dəyişəni) = Makedec((ay dəyişəni) )
(il dəyişəni) = Makedec((il dəyişəni) )

Saat və tarixi oxumaq və onu onluq formata çevirmək nümunəsi:

I2cstart I2cwbyte &HD0 I2cwbyte &H00 I2cstart I2cwbyte &HD1 I2crbyte Seco, Ack I2crbyte Mine, Ack I2crbyte Hour, Ack I2crbyte Day, Ack I2crbyte Dat, Ack I2c, Nack I2c, Ack I2c, stop Seco = Makedec (seco M) ine = Makedec (mina) Saat = Makedec(saat) Gün = Makedec(gün) Dat = Makedec(dat) Ay = Makedec(ay) İl = Makedec(il)

Biz məlumatları oxumağı öyrəndik, indi DS1307-yə məlumat yazmağa çalışaq. Bunun kimi:
(Yazacağımız dəyişən) = Makebcd((Yazacağımız dəyişən) )
I2cstart
I2cwbyte və HD0
I2cwbayt(Məlumatları yazacağımız xana)
I2cwbayt(Yazacağımız dəyişən)
I2cstop

Qeyd edək ki, əmr Makebcd dəyişəni ikili onluq formata çevirir. Hüceyrə nömrələri və təyinatları:

Budur, saniyə dəyişəninin yazılması nümunəsi:
Seco = Makebcd(seco)
I2cstart
I2cwbyte və HD0
I2cwbyte 0
I2cwbyte Seco
I2cstop
Yeri gəlmişkən, qeyd etmək lazımdır ki, DS1307-ni ilk dəfə işə saldığınız zaman (məsələn, batareyanı birləşdirərkən ehtiyat güc) çip saniyə ərzində 80 dəyərini qaytaracaq, yəni saat dayanıb. Onları işə salmaq üçün saniyələr ərzində 1 dəyərini yazın. Əgər DS1307 hər hansı məlumatı oxuyarkən 255 və ya 168 dəyərini qaytarırsa, bu, çipin düzgün qoşulmadığını və ya ehtiyat batareyanın olmadığını bildirir.

DS1307 çipi ilə praktiki iş

İndi praktikada DS1307 çipi ilə işləməyə çalışaq: yığaq sadə saat düymələrdən istifadə edərək vaxt təyini ilə. Bunu etmək üçün DS1307 çipinin özünü, Attiny2313 mikro nəzarət cihazını, HD44780 nəzarətçisində LCD göstəricini və bir neçə diskret komponenti götürək. Sadə bir diaqramı birləşdirək:

Və əldə edilmiş biliklərdən istifadə edərək sadə bir proqram yazaq:

$regfile = "attiny2313.dat" $crystal = 4000000 Konfiqurasiya Lcdpin = Pin , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , Db7 = Portb.7 , E = Portb.3 , 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 Bayt kimi Dim Mina Bayt kimi Dim Saat Bayt kimi Başlanğıc Cls Kursor Söndürülür I2cstart edin I2cwbyte &HD0 I2cwbyte &H00 I2cstart I2cwbyte &HD1 I2crbyte Seco , Ack I2crbyte Mine , Ack I2crbyte Mine , Nack I2cstop Seco = Makedec(seco) Mine = Makedec(mina) Saat =1c saat; ":" ; mənim; ":" ; seco; " " Pind.5 = 0 Əgər Pind.5 = 0 Olsa Incr Mine Mine = Makebcd(mina) I2cstart I2cwbyte &HD0 I2cwbyte 1 I2cwbyte Mine I2cstop Waitms 100 End If Pind.4 = 0 Onda Daxil Saat Saatı = Makebcd(saat) IHD & I2bycwte I2bycwte Saat I2cstop Gözləyir 100 Son Əgər Döngə Sonu

İnternetdə bu saat haqqında rəylər ən ziddiyyətlidir. Bəziləri saatın möcüzə olduğunu deyir, bəziləri isə onu yoxsul Dallas əsəri adlandırır. Beləliklə, bütün yalan şayiələri dağıtmaq üçün zibildən mikruxanı çıxartdım və təcrübə aparmağa başladım.

Xüsusiyyətlər:

  • Çox aşağı enerji istehlakı. İstehsalçı bir standart batareyadan saatın 10 il işləməsini vəd edir. CR2032
  • İstifadəçi məlumatlarını saxlamaq üçün 56 bayt yaddaş. Düşünürəm ki, bu, xüsusilə zəruri seçim deyil, amma kimsə üçün faydalı ola bilər.
  • Saat üçün proqramlaşdırıla bilən pin xarici cihazlar. 1 Hz, 4.096 kHz, 8.192 kHz və 32.768 kHz çıxış edə bilər.
  • 24 saat və 12 saat rejimi

Pinout

Saat sancaqları aşağıdakı kimi yerləşir:

X1, X2— 32,768 kHz tezliyində kvars rezonatorunu birləşdirmək üçün sancaqlar
VBAT— 3 voltluq ehtiyat batareyanı birləşdirmək üçün çıxış
GND- Yer
S.D.A.- i2c avtobus məlumat xətti
SCL— i2c avtobus saat xətti
SQW/OUT– xarici cihazların saatlanması üçün çıxış siqnalı
VCC- 5 volt enerji təchizatı

Nəzarətçiyə qoşulma
Bağlama minimaldır. Sizə 32,768 kHz kvars, i2c avtobusunu idarə etmək üçün bir cüt rezistor və üç voltluq batareya lazımdır.

Düzgün lövhə düzümü
Saatın dəqiqliyi və ümumiyyətlə saatın performansı naqillərdən asılıdır çap dövrə lövhəsi. Dallas öz məlumat vərəqində mikrosxemdən kvars rezonatoruna qədər keçiricilərin uzunluğunu minimuma endirməyi və bu keçiriciləri yerə bağlı düzbucaqlı ilə əhatə etməyi tövsiyə edir. Bundan əlavə, etibarlılıq üçün yerə gedən telləri kvars gövdəsinə lehimlədim və enerji təchizatı ilə paralel olaraq 0,1 uF kondansatör yerləşdirdim.

Yeri gəlmişkən, kvars olmadan da işləyə bilər. Bunun üçün X1 ayağına 32,768 kHz tezliyi olan xarici takt siqnalı verilir və X2 havada asılı vəziyyətdə qalır.

Saat yaddaşının təşkili
Bu miniatür cihaz 64 bayt yaddaşla təchiz olunub. İlk səkkiz bayt işləyir. Onlar həftənin vaxtı, tarixi, gününü saxlayırlar. Qalanları istifadəçinin ehtiyaclarına uyğun olaraq ayrılır. Məsələn, bəzi parametrləri və ya başqa bir şeyi onlarda saxlaya bilərsiniz. Təbii ki, ehtiyat gücü itirildikdə, bu yaddaşdakı bütün məlumatlar məhv olur. Saatla bütün işlər (oxumaq və vaxt/tarix təyin etmək) lazımi yaddaş hüceyrələrini oxumaq və yazmaqdan ibarətdir.

Yaddaşdakı bütün nömrələr ikili onluq formatda saxlanılır. Bu o deməkdir ki, bir baytda iki rəqəm saxlanıla bilər. Məsələn, 0x23 rəqəmi 2 rəqəmini və 3 rəqəmini ehtiva edir. Hər nömrə üçün 4 bit ayrılır. Bu niyə edilir? Rahatlıq və yaddaşa qənaət üçün. Vaxt və tarixə əlavə olaraq yaddaşda bir neçə bit parametrlər saxlanılır:

  • Saat Dayandı- saata nəzarət edir. Bit təyin edildikdə, saat dayanır. Saatı işə salmaq üçün bu bitə 0 yazmaq lazımdır. Bunu xatırlamaq lazımdır.
  • 24/12 - saat rejimini seçmək üçün bu bit. Bu bit birə bərabər olduqda, 12 saatlıq rejim istifadə olunur. Əks halda 24 saat. 12 saatlıq rejim istifadə edilərsə, beşinci bit indi AM və ya PM-i göstərir. Bit 1-dirsə, bu, PM deməkdir. 24 saat rejimində bu bit 4-cü bit ilə birlikdə onlarla saat saxlamaq üçün istifadə olunur.
  • Çıxış— SQW/OUT ayağının vəziyyətinə nəzarət edir. Bit quraşdırılıb - ayaqda 1. Reset - ayaqda 0. Bu şəkildə idarə etmək üçün bit SQWE sıfırlanmalıdır.
  • SQWE- bit təyin edildikdə, SQW/OUT ayağında düzbucaqlı impulslar görünür.
  • RS1, RS0— bu bitlər nəbz tezliyini təyin edir. Tezliyin bit birləşməsindən asılılığı aşağıdakı cədvəldə verilmişdir:

Proqram təminatı

DS1307 saatı ilə işləmək üçün aşağıdakı əsas funksiyaları ehtiva edən sadə bir kitabxana yazılmışdır:

DS_start- saatı başlayır. Siz həmçinin vaxtı təyin etməklə saatı işə sala bilərsiniz.
DS_stop- saatı dayandırır
DS_set_time — Vaxtın təyin edilməsi. Proseduru çağırmazdan əvvəl tmp1-də saniyə, tmp2-də dəqiqə, tmp3-də isə saat qoymaq lazımdır. Saat 24 saat formatında.
DS_get_time: - saatdan oxu vaxtı. saniyələr tmp1-də, dəqiqələr tmp2-də, saatlar tmp3-də qeyd olunacaq
DS_get_date:— saatdan tarixi oxumaq. Gün tmp1-də, ay tmp2-də, il tmp3-də qeyd olunacaq
DS_set_tarixi: - tarixi təyin etmək. Proseduru çağırmazdan əvvəl tmp1-də günü, tmp2-də ayı və tmp3-də ili (son 2 rəqəm) qoymalısınız.

Vaxtı və tarixi təyin etmək/oxumaq üçün proqramlar BCD və onluq formatda daxil edilmiş məlumatı qəbul edə/qaytara bilər. İstədiyiniz formatı seçmək üçün hər prosedurda üç sətri şərh etməli və ya şərhi silməlisiniz (kodda bununla bağlı qeydlər var).

Test proqramı UART vasitəsilə saatı idarə etməyə imkan verir (sürət 9600, nəzarətçi 8 MHz-də işləyir). Başlanğıcda vaxt, tarix və 1-dən 3-ə qədər əmrlərin daxil edilməsi tələbi dərhal göstərilir, 1-ci seçimi seçdiyiniz zaman, vaxt/tarix yenidən oxunur. Seçim 2 sizə vaxtı, seçim 3 isə tarixi təyin etməyə imkan verir. Əgər saatla oynamağa cəhd etmək istəyirsinizsə, mənbə arxivinə simulyasiya faylı daxildir.

Dəqiqlik
Burada çox şey istifadə olunan kvarsdan və lövhənin düzülüşündən asılıdır. Məlumat cədvəli kvars tutumunun 12,5 pF olması lazım olduğunu bildirir. Deyirlər ki, kvarsdan istifadə etmək daha yaxşıdır ana platalar. Vuruşu düzəltmək üçün rezonatora bir kəsmə kondansatörünü lehimləyə və kiçik məhdudiyyətlər daxilində tezliyi dəyişdirmək üçün istifadə edə bilərsiniz. Şəxsən bu saat mənim üçün iki gündür işləyir və 3 saniyə geri qalır. Bir şey mənə problemin kvarsın tutumunda olduğunu söyləyir, başqasını sınayacağam və geri hesabat verəcəyəm.

Nəticə
Pis saat deyil. Həvəskar istifadə üçün idealdır. Bəziləri nasazlıqlar haqqında yazsa da, hələ onlarla qarşılaşmamışam.

DS1307 çipindəki saatın mövzusu olduqca aktualdır - bu sadə, lakin eyni zamanda maraqlı bir cihazdır. Bundan əlavə, bu, həqiqətən faydalı ola bilər. Ancaq mikrosxemi ayrıca təsvir etməyin mənası yoxdur, buna görə də özüm üçün oxşar bir cihaz yığmaq qərarına gəldim və eyni zamanda prosesdə hansı zərbələr aldığım barədə danışdım. Cihazın hazırlığının bəzi mərhələlərini keçdiyimiz zaman inkişaf və montaj prosesinin özünü təsvir edəcəyəm.

Yeniləmə 10/17/2015
Əvvəlcə bu, bir sıra məqalələr idi, məqsədi sıfırdan hazır vəziyyətə bir cihaz yaratmaqdan danışmaq idi, lakin birdən "saat" deyilən hər şeyə alerjim oldu, buna görə hər şeyi bir məqalədə birləşdirdim. Cihaz 99,9% tamamlanıb (qalan sadəcə vintləri sıxmaqdır), lakin bunu etmək asan deyil :) Allergiya keçən kimi, son fotoşəkil görünəcək.

Gəlin ondan başlayaq ki, indiyə qədər ds1307 haqqında heç nə bilmirik, ondan başqa saatlar onun köməyi ilə hazırlanır. Buna görə də, bu mikrosxem üçün sənədləri yükləyin və orada olan "yaxşılıqların" siyahısını oxuyun. Beləliklə, birinci bənddən ümumiyyətlə aydın olur ki, onun enerji istehlakı azdır, məlumat I2C vasitəsilə ötürülür, tarix və saatı, 12 və 24 saat formatını, avtomatik tarix tənzimlənməsini öyrənə bilərsiniz. Amma ən maraqlısı dövrədir (TİPİ ƏMƏLİYYAT DÖNGƏSİ).

Biz məlumat cədvəlini çəkirik və nəyin nə olduğunu anlamağa çalışırıq. Soldan sağa gedirik, CPU - mikrokontroller (yəni atmeqamız), iki rezistor, yuxarı çəkin - bu, yuxarı çəkmək deməkdir (hər biri 10k götürə bilərsiniz), 32768 Hz-də kvars, mikrosxem özü və batareya. SQW/OUT çıxışı bizi maraqlandırmadığı müddətcə 1Hz, 4kHz, 8kHz, 32kHz tezliyi ilə atlaya bilər. Bəlkə də bu məlumat hələlik kifayətdir, nəyisə kodlaşdırmaq istərdim :)

CodeVision-da layihə yaradırıq, I2C bölməsində ds1307 tapırıq və onu layihəyə daxil edirik. Məlumatı bir yerdə, məsələn, LCD-də göstərmək yaxşı olardı və bir neçə düymə zərər verməz.

Sizə lazım olan tək şey D portu üçün LCD-ni və giriş üçün üç açılan düyməni konfiqurasiya etməkdir. Sonra, bunu etmək üçün LCD-də vaxtı göstərməliyik, gəlin CodeVision təlimatına baxaq və oradan bir nümunə götürək; Hər şeyin sadə olduğu ortaya çıxdı - vaxtı təyin edən bir funksiya var:
rtc_set_time(3,0,0); //saat 03:00:00 təyin et

olanlar. bu funksiyanı çağırdıqdan sonra h, m, s dəyişənlərində saat (h), dəqiqə (m) və saniyə (s) olacaq. Yalnız onları ekranda göstərmək qalır. Bunu necə edəcəyimizi bilirik)
Son kod belə görünəcək:

#daxildir #daxildir #daxildir #daxildir // Alfasayısal LCD Modul funksiyaları#asm .equ __lcd_port= 0x12 ; PORTD #endasm #daxildir char lcd_buf[ 33 ] ; void main(void) ( char saat, dəq, sek; PORTC= 0x07 ; DDRC= 0x00 ; // I2C avtobusunun işə salınması i2c_init() ; rtc_init(0, 0, 0) ; // LCD modulunun işə salınması lcd_init(16 )_; (3 , 0 , 0 ) isə (1 ) ( rtc_get_time(& saat,& dəq,& sek) ; lcd_clear() ; lcd_gotoxy(0 , 0 ) ; sprintf (lcd_buf, "%2d:%02d:%02d \n", saat, dəq, sek); lcd_puts(lcd_buf); gecikmə_ms(500 ); ); )

#daxildir #daxildir #daxildir // Alfasayısal LCD Modul funksiyaları #asm .equ __lcd_port=0x12 ;PORTD #endasm #include char lcd_buf; void main(void) ( char hour,min,sek; PORTC=0x07; DDRC=0x00; // I2C Bus başlatma i2c_init(); // DS1307 Real Time Clock başlatma rtc_init(0,0,0); // LCD modulu başlatma lcd_init(16); rtc_set_time(3,0,0); while (1) ( rtc_get_time(&hour,&min,&sek); lcd_clear(); lcd_gotoxy(0,0); sprintf(lcd_buf,"%2d:%02d); :%02d\n",saat,dəq,sek); lcd_puts(lcd_buf); gecikmə_ms(500); )

Proteus-da yığırıq və sınaqdan keçiririk:

Dövrə və proqram təminatı

Biz proqram təminatımızı təkmilləşdirməyə davam edəcəyik. Aşağıdakı fikirlə başlayaq: DS1307 çox tezlik yarada bilən SQW/OUT çıxışına malikdir. Bu çıxışı 1Hz-ə təyin etsəniz və bu siqnalı xarici kəsmə girişinə tətbiq etsəniz, 1307 saniyədə bir dəfə atmega8-in "quyruğunu" çəkəcəyi ortaya çıxır. Meqa üçün bu, vaxtı yeniləməyin vaxtı olduğuna dair bir siqnal olacaq. Bu, cari vaxt haqqında məlumatın saniyədə bir dəfə yenilənməsi ilə mikro nəzarətçini yükləməməyə imkan verəcəkdir.

Gəlin Int1 pinində layihəyə xarici aşağı səviyyəli kəsmə əlavə edək və çəkilişi işə salaq. DS1307 çıxışını 1Hz tezliyinə təyin edək. Yeri gəlmişkən, dərslikləri oxumaq faydalıdır, tapdım maraqlı xüsusiyyət- SCL-də açılan rezistorlar, SDA ayaqları 3.3k - 4.7k olmalıdır. Bunu nəzərə alaq.

Nəticə kod belə görünəcək:

kəsmək [ EXT_INT1] void ext_int1_isr(void ) ( time_flag= 1 ; )

interrupt void ext_int1_isr(void) ( time_flag=1; )

Kesintidə biz əsas döngədə vaxtın çıxmasına imkan verən bir bayraq təyin edirik, əgər bayraq qoyulubsa, o zaman təyin olunmayıbsa, biz heç nə etmirik;

əgər (zaman_bayraq== 1 ) ( rtc_get_time(& saat,& dəq,& sek) ; lcd_gotoxy(0 , 0 ) ; sprintf (lcd_buf, "%02d:%02d:%02d \n", saat, dəq, sek); lcd_puts(lcd_buf); )

if(time_flag==1) ( rtc_get_time(&hour,&min,&sek); lcd_gotoxy(0,0); sprintf(lcd_buf,"%02d:%02d:%02d\n",saat,min,sek); lcd_puts( lcd_buf)

İndi isə növbəti suala keçək: sprintf-dən istifadə etmək nə dərəcədə effektivdir? Boş söhbətlərə başlamamaq üçün eyni işi görən 2 ədəd kod verəcəyəm - ekranda vaxt məlumatını göstərin.

Artıq bizə məlum olan birinci seçim:

sprintf (lcd_buf, "%02d:%02d:%02d \n", saat, dəq, sek); lcd_puts(lcd_buf);

sprintf(lcd_buf,"%02d:%02d:%02d\n",saat,dəq,sek); lcd_puts(lcd_buf);

Razılaşın, istifadəsi asandır və aydındır. İndi 2 nömrəli seçim:

lcd_putchar(saat/ 10 + 0x30 ); lcd_putchar(saat% 10 + 0x30 ) ; lcd_putchar(":" ); lcd_putchar(min/ 10 + 0x30 ); lcd_putchar(min% 10 + 0x30 ); lcd_putchar(":" ); lcd_putchar(sek/ 10 + 0x30 ); lcd_putchar(sek% 10 + 0x30 );

lcd_putchar(saat/10+0x30); lcd_putchar(saat%10+0x30); lcd_putchar(":"); lcd_putchar(min/10+0x30); lcd_putchar(min%10+0x30); lcd_putchar(":"); lcd_putchar(sek/10+0x30); lcd_putchar(sek%10+0x30);

Bu çox aydın deyil, amma bunu başa düşə bilərsiniz. Onları necə müqayisə edəcəyik? Bu, çox sadə şəkildə edilir - AVR STUDIO sazlayıcısını işə salın və onların icrasına sərf olunan saat dövrlərinin sayına baxın. Beləliklə, baraban rulonu, nəticələr... Birinci kod parçası 8 MHz işləmə tezliyində 2058,25 μs-ə bərabər olan 16,466 takt dövrü üçün işlədi, ikinci kod parçası üçün bu rəqəm 12,278 takt dövrü və ya 1,534,75 idi. μs. Razılaşın, icra müddətini azaltmaq və buna görə də mikrokontrolleri ~ 25% azaltmaq sprintf-dən istifadə etməmək üçün kifayət qədər yaxşı səbəbdir. Layihəmizdən sprintf atırıq, ardınca stdio.h və lcd_buf.

Əsas döngədə kod qarışığı olduqda çirkin olur, beləliklə məlumatın çıxışı funksiyaya daxil edilə bilər. Əsas döngədə qalacaq

while (1) ( əgər (zaman_bayraq== 1) ( show_time() ; //cari vaxt haqqında məlumatı göstərin } } ;

while (1) ( if(time_flag==1) ( show_time(); //cari vaxt haqqında məlumatı göstər) );

Funksiya bəyannaməsinin özü belə görünəcək:

void show_time() ( rtc_get_time(& saat,& dəq,& sek) ; lcd_gotoxy(0 , 0 ) ; lcd_putchar(saat/ 10 + 0x30 ) ; lcd_putchar(saat% 10 + 0x30 ) _c rlcd ;_"put (min/ 10 + 0x30 ) lcd_putchar(":" ) lcd_putchar(sek/ 10 + 0x30 ) ;

void show_time() ( rtc_get_time(&hour,&min,&sek); lcd_gotoxy(0,0); lcd_putchar(saat/10+0x30); lcd_putchar(saat%10+0x30); lcd_putchar(":"); lcd/ 10+0x30); lcd_putchar(min%10+0x30);

İndi bizim proqram təminatımıza bir tarix çıxışı əlavə etməliyik. Tarixi təyin etmək aşağıdakı funksiya ilə həyata keçirilir:

rtc_set_date(6,13,10,13); //6 - həftənin günü, 13 - gün, 10 - ay, 13 - il

rtc_get_date(&həftə_gün,&gün,&ay,&il); //həftənin günü, gün, ay, il

Tarix çıxışı təşkil edilə bilər, hazırda əsas döngədə, zamanın yanında, tamamlanır mənbə belə çıxdı:

#daxildir // I2C avtobus funksiyaları #asm .equ __i2c_port= 0x18 ; PORTB .equ __sda_bit= 0 .equ __scl_bit= 1 #endasm #include // DS1307 Real Time Clock funksiyaları#daxildir // Alfasayısal LCD funksiyaları #include char saat= 0 , min= 0 , sek= 0 , gün= 0 , ay= 0 , il= 0 , həftə_günü= 0 ; bit time_bayraq = 0 ; char menyusu= 0 ; // Xarici kəsmə 1 xidmət proqramı interrupt [ EXT_INT1] void ext_int1_isr(void ) ( time_flag= 1 ; ) void show_time() ( rtc_get_time(& saat,& dəq,& sek) ; rtc_get_date(& həftə_gün,& gün,& ay,& il) ; lcd_go , 0 ) ; lcd_putchar(saat/ 10 + 0x30 ) ; lcd_putchar(min% 10 + 0x30 ) ; lcd_putchar(sek/01) ; 0x30) lcd_gotoxy(0 , 1 ) lcd_putchar(gün% 10 + 0x30 ) lcd_putchar(" /" ) 03; (ay% 10 + 0x30 ) ; lcd_putchar("/" ) lcd_putchar(il% 10 + 0x30 ) ) void main(void ) ( PORTF = 0 ;x ;x ; DDRD = 0x00 ; // I2C avtobusunun işə salınması i2c_init() ; // DS1307 Real Time Clock başlatma // SQW/OUT pinində kvadrat dalğa çıxışı: Aktivdir// Kvadrat dalğa tezliyi: 1Hz rtc_init(0, 1, 0) ; // Xarici kəsilmə(lər)in işə salınması// INT0: Off // INT1: Aktiv // INT1 Rejimi: Aşağı səviyyəli GICR|= 0x80 ; MCUCR= 0x00; GIFR= 0x80; // LCD modulunun işə salınması lcd_init(16) ; rtc_set_time(12, 0, 0); rtc_set_date(6, 13, 10, 13); #asm("sei") while (1 ) ( if (zaman_bayrağı== 1 ) ( show_time() ; ) ); )

#daxildir // I2C avtobus funksiyaları #asm .equ __i2c_port=0x18 ;PORTB .equ __sda_bit=0 .equ __scl_bit=1 #endasm #include // DS1307 Real Time Clock funksiyaları #include // Alfasayısal LCD funksiyaları #include char saat=0,min=0,sek=0,gün=0,ay=0,il=0,həftə_gün=0; bit time_flag=0; char menyusu=0; // Xarici Kesinti 1 xidmətin müntəzəm kəsilməsi void ext_int1_isr(void) ( time_flag=1; ) void show_time() ( rtc_get_time(&hour,&min,&sek); rtc_get_date(&week_day,&day,&ay,&year); lcd_gotoxy(0,0) ; lcd_putchar(":"); lcd_putchar(sek/10+0x30) 03 ); lcd_putchar("/"); lcd_putchar(il%10+0x30); DDRC=0x00; PORTD=0x08; // I2C avtobusunun işə salınması (/); DS1307 Real Zaman Saatının işə salınması // SQW/OUT pinində kvadrat dalğa çıxışı: Aktiv / / Kvadrat dalğa tezliyi: 1Hz rtc_init(0,1,0) // Xarici kəsintilərin işə salınması // INT0: Off // INT1: Aktiv // INT1 Rejimi: Aşağı səviyyəli GICR|=0x80; // LCD modulunun işə salınması lcd_init(16); rtc_set_time(12,0,0); rtc_set_date(6,13,10,13); #asm("sei") while (1) ( if(time_flag==1) ( show_time(); ) ); )

Nəticə:

Dövrə və proqram təminatı:

Menyunun təşkilinə keçək. Ən vacib sual bütün bunların necə görünməsi idi, yəni. texniki şərtləri (t.z.) formalaşdırmaq lazım idi.
Bunların ayrı ekran olmasını istədim:
-əsas ekran;
-vaxt təyini ekranı;
-tarix təyini ekranı;
-zəngli saat parametrləri ekranı.

Bu vəziyyətdə dörd düymədən istifadə edə bilərsiniz - yuxarı, aşağı, sol, sağ. Ekranlar arasında keçid yuxarı və aşağı düymələri ilə aparılmalıdır. Parametrlər müvafiq ekranda edilir. İstifadə olunan mikrokontroller atmega8-dir. Bu belə primitiv texniki termindir.

Kodun ölçüsünün kifayət qədər böyük olacağı əvvəldən aydın idi. Eyni zamanda, onu məntiqi cəhətdən bir-birinə bağlı hissələrə ayırmaq lazım idi. Parçalarla hər şey aydındır - bir ekranın işlənməsi kodun bir hissəsidir. Buna görə də, mən əsas döngəni dörd hissəyə bölməklə başladım, onların arasında keçid keçid ifadəsi ilə həyata keçirilir. Mən içəriyə funksiyalar qoyuram - dummies. C portunda 0(yuxarı) və 3(aşağı) düymələri menyu dəyişənini dəyişməyə imkan verir. Beləliklə, menyular arasında keçid edirik. Ancaq indiyə qədər belə bir proqram işləyə bilmədi, çünki funksiyalar hələ müəyyən edilməmişdi.

while (1) ( keçid (menyu) ( hal 0 : show_time(); fasilə ; hal 1 : set_time() ; fasilə ; hal 2 : set_date() ; fasilə ; hal 3 : set_alarm() ; fasilə ; ) );

while (1) ( keçid(menyu) ( hal 0: show_time(); fasilə; hal 1: təyin_vaxt(); fasilə; hal 2: təyin_tarix(); fasilə; 3-cü vəziyyət: həyəcan siqnalı(); fasilə; ) );

Növbəti addım bu funksiyaların müəyyənləşdirilməsidir, ilkin olaraq mən lcd_puts("Set time") kimi statik adlar çəkdim; Funksiyalar belə çıxdı.

void set_alarm() ( ////////siqnal parametrlərinə baxmaq lcd_gotoxy(0,0); lcd_puts("Siqnal qurmaq"); ) void set_time() ( ////////vaxt parametrlərinə baxmaq lcd_gotoxy( 0,0 lcd_puts("Vaxt təyin et");

İndi o, menyular arasında keçid edə və statik etiketlərə baxa biləcəyiniz proqram təminatı artıq işləyirdi. Bu əlamətləri həyata keçirməyin vaxtı gəldi. Əsas ekranda heç bir problem yox idi; vaxt/tarix göstəricisi əvvəlki dərsə bənzəyir.

Növbəti sual yarandı: quraşdırma prosesinin özünü necə təşkil etmək olar? Fikirləşəndən sonra mənə belə bir fikir maraqlı gəldi: yuxarı/aşağı düymələrindən istifadə edərək bizi maraqlandıran menyuya daxil oluruq, sağa sıxırıq, quraşdırma prosesinin davam etdiyini bildirən kursor görünür. Yuxarı/aşağı düymələrindən istifadə edərək dəyəri dəyişirik, sola/sağa kursoru tənzimlənən parametrlər arasında hərəkət etdiririk. Kursor sonuncu parametrin altında olduqda, sağ düyməni yenidən basmaq parametrdən çıxır. Kursor yox olur, bu, parametrləri tərk etdiyimizi və yenidən menyular arasında keçid edə biləcəyimizi göstərir.

Ancaq kiçik problemlər var, məsələn, yuxarı düymə parametrləri dəyişdirməli və eyni zamanda növbəti ekrana keçməlidir. Bunlar. bir ekranın içindəki düymələrin məntiqini ayırmaq lazım idi. Buna görə kod çox böyüdü. Məsələn, zəngli saat ekranında biz alt proqrama (alt_alarm) daxil oluruq, müvafiq olaraq, alt proqramın daxilindəki düymələr bir şəkildə, kənarda isə başqa şəkildə işlənir.

void set_alarm() //Siqnalın işlənməsi funksiyası ( //siqnal parametrləri menyusunun ekran rejimi if(sub_alarm==0) ( if(PINC.0==0) //yuxarı düyməsi - menyu ekranını dəyişdirin ( menu=0; ... .. ) ) //həyəcan parametrləri üçün alt menyu if(alt_alarm==1) ( if(PINC.0==0) //yuxarı düymə - dəyəri artır ( a_saat++; .... ) )

Parametrlər alt menyusuna getdiyiniz bir an var və eyni düymə (yenidən yuxarı düyməsini nümunə olaraq götürək) saatları və ya bəlkə də dəqiqələri dəyişə bilər. Beləliklə, başqa bir dəyişən alt Proqram təqdim edildi.
Misal üçün:

if(PINC.0==0) //yuxarı düymə ( if(subProgram==1) //subProgram=1 - saatı dəyişdirin ( a_hour++; ... ) if(subProgram==2) //subProgram=2 - dəqiqə dəyişdirin ( a_min++; ... ) əgər(subProgram==3) //subProgram=3 həyəcan bayrağını dəyişdirin ( ... ) )

Qeyd etməyə dəyər yeganə şey, həyəcan siqnalı işə salındıqda əsas ekranda göstərilən xüsusi simvoldur.

Nümunə CodeVision\examples\lcd char qovluğundakı nümunələrdən götürülmüşdür.

typedef imzasız simvol baytı; //tipi yenidən təyin edin flash bayt char_table[ 8 ] = ( //simvolunuzu çəkin 0b10000000, 0b10000100, 0b10001110, 0b10001110, 0b10001110, 0b10011111, 0b10100100, 0b11000000); // istifadəçi simvollarını təyin etmək üçün istifadə olunan funksiya etibarsız müəyyən_xarakter(bayt flash * kompüter, bayt char_code) ( bayt i, ünvan; ünvan= (char_code)<< 3 ) | 0x40 ; for (i= 0 ; i< 8 ; i++ ) lcd_write_byte(address++,* pc++ ) ; } void main(void ) { byte i, address; lcd_init(16 ) ; define_char(char_table, 0 ) ; // Simvolu LSD-yə yükləyin while (1) ( lcd_putchar(0) ; // simvolu göstərin }

typedef imzasız simvol baytı; //fleş növünü yenidən təyin edin char_table=( //xarakterinizi çəkin 0b10000000, 0b10000100, 0b10001110, 0b10001110, 0b10001110, 0b10011111, 0b10100, 0b1010, 0b1010, // istifadəçi simvollarını müəyyən etmək üçün istifadə edilən funksiya void define_char(bayt flash *pc,bayt char_code) ( bayt i,ünvan; ünvan=(char_code)<<3)|0x40; for (i=0; i<8; i++) lcd_write_byte(address++,*pc++); } void main(void) { byte i,address; lcd_init(16); define_char(char_table,0); //Грузим символ в лсд while(1) { lcd_putchar(0); //выводим символ на дисплей }

Siz 5x7 simvolu çəkə bilərsiniz, biri pikselin doldurulduğunu, sıfır isə onun doldurulmadığını bildirir. Nəticə zəng simvoludur.

Mikroproqram

Növbəti addım cihazın görünüşünü düşünməkdir. Fikrimcə, bu, LCD ekran və ön tərəfdə dörd düymə olacaq, içərisində bütün digər elementlərin yerləşdiyi çap elektron lövhəsi olacaq. Güc, Çin şarj cihazından hazırlanan enerji təchizatı ilə eyni olacaq.

Çap dövrə lövhəsindən başlayaq, bunun üçün işarələr çəkməyə imkan verən bir proqram lazımdır. Bir çox oxşar proqramlar var: P-cad, Altium, Sprint layout... Mən Altium-u yalnız ona görə bəyənirəm ki, onun elementləri olan çoxlu hazır kitabxanaları var, çünki mənim fikrimcə, öz elementlər kitabxananızı yaratmağa vaxt sərf etmək deyil. nöqtə. Bütün bu cür proqramların ümumi mənası eynidir - əvvəlcə elektrik dövrəsi çəkilir.

İzləyicidə bütün elementlər artıq elektrik dövrəsi sayəsində hansının hansıya qoşulmalı olduğunu bilir.

Yalnız elementləri rahat şəkildə təşkil etmək və onları keçiricilərlə birləşdirmək qalır.

Bir çox Arduino layihəsində müəyyən hadisələrin baş vermə vaxtını izləmək və qeyd etmək tələb olunur. Əlavə batareya ilə təchiz olunmuş real vaxt rejimində işləyən saat modulu cihazın özündə enerjinin mövcudluğundan asılı olmayaraq cari tarixi saxlamağa imkan verir. Bu yazıda Arduino lövhəsi ilə istifadə edilə bilən ən çox yayılmış RTC modulları DS1307, DS1302, DS3231 haqqında danışacağıq.

Saat modulu, bir qayda olaraq, DS1307, DS1302, DS3231 mikrosxemlərdən birini ehtiva edən kiçik bir lövhədir. Bundan əlavə, lövhədə praktik olaraq batareyanın quraşdırılması mexanizmini tapa bilərsiniz. Belə lövhələr tez-tez vaxtı, tarixi, həftənin gününü və digər xronometrik parametrləri izləmək üçün istifadə olunur. Modullar avtonom enerji ilə işləyir - batareyalar, akkumulyatorlar və Arduino-nun enerjisi söndürülsə belə saymağa davam edir. Ən çox yayılmış saat modelləri DS1302, DS1307, DS3231-dir. Onlar Arduino ilə əlaqəli RTC (real vaxt saatı) moduluna əsaslanır.

Saatlar "gənə" oxuyan adi sayğaclardan və saat generatorlarından fərqli olaraq, adi insan üçün əlverişli olan vahidlərdə sayılır - dəqiqələr, saatlar, həftənin günləri və digərləri. Arduino müxtəlif vaxt intervallarını da oxuya bilən xüsusi millis() funksiyasına malikdir. Lakin bu funksiyanın əsas çatışmazlığı ondan ibarətdir ki, taymer işə salındıqda sıfıra sıfırlanır. Onun köməyi ilə yalnız vaxtı oxuya bilərsiniz, həftənin tarixini və ya gününü təyin etmək mümkün deyil. Bu problemi həll etmək üçün real vaxt saat modullarından istifadə olunur.

Elektron sxemə mikrosxem, enerji təchizatı, kvars rezonatoru və rezistorlar daxildir. Kvars rezonatoru 32768 Hz tezliyində işləyir ki, bu da adi ikili sayğac üçün əlverişlidir. DS3231 dövrəsi yüksək dəqiqlikli dəyərlər əldə etməyə imkan verən daxili kvars və istilik stabilizasiyasına malikdir.

Məşhur RTC modullarının DS1302, DS1307, DS3231 müqayisəsi

Bu cədvəldə biz ən populyar modulların siyahısını və onların əsas xüsusiyyətlərini təqdim etdik.

adTezlikDəqiqlikDəstəklənən protokollar
DS13071 Hz, 4.096 kHz, 8.192 kHz, 32.768 kHzKvarsdan asılıdır - adətən dəyər gündə 2,5 saniyəyə çatır, gündə 1 saniyədən daha yüksək dəqiqliyə nail olmaq mümkün deyil. Həmçinin, dəqiqlik temperaturdan asılıdır.I2C
DS130232,768 kHzgündə 5 saniyəI2C, SPI
DS3231İki çıxış - birincisi 32.768 kHz, ikincisi 1 Hz-dən 8.192 kHz-ə qədər proqramlaşdırıla bilər0C-dən 40C-yə qədər temperaturda ±2 ppm.

-40C-dən 85C-yə qədər olan temperaturlarda ±3,5 ppm.

Temperaturun ölçülməsi dəqiqliyi – ±3С

I2C

Modul DS1307

DS1307 vaxtı təyin etmək üçün istifadə olunan moduldur. DS1307ZN çipi əsasında yığılır, uzun müddət avtonom işləməyi təmin etmək üçün enerji litium batareyadan verilir. Lövhədəki batareya arxa tərəfə quraşdırılmışdır. Modulda AT24C32 çipi var - bu, 32 KB uçucu olmayan EEPROM yaddaşıdır. Hər iki mikrosxem I2C avtobusu ilə birləşdirilir. DS1307 aşağı enerji istehlakına malikdir və 2100-cü il üçün saat və təqvimi ehtiva edir.

Modul aşağıdakı parametrlərə malikdir:

  • Enerji təchizatı - 5V;
  • İşləmə temperaturu diapazonu -40C ilə 85C arasında;
  • 56 bayt yaddaş;
  • Litium batareya LIR2032;
  • 12 və 24 saat rejimlərini həyata keçirir;
  • I2C interfeys dəstəyi.

Modul məlumatların olduqca nadir hallarda, bir həftə və ya daha çox fasilələrlə oxunduğu hallarda əsaslandırılır. Bu, enerjiyə qənaət etməyə imkan verir, çünki fasiləsiz istifadə hətta batareya ilə də daha çox gərginlik tələb edəcəkdir. Yaddaşın olması müxtəlif parametrləri (məsələn, temperaturun ölçülməsi) qeydiyyatdan keçirməyə və moduldan alınan məlumatları oxumağa imkan verir.

Digər cihazlarla qarşılıqlı əlaqə və onlarla məlumat mübadiləsi SCL və SDA pinlərindən I2C interfeysindən istifadə etməklə həyata keçirilir. Dövrə tələb olunan siqnal səviyyəsini təmin etməyə imkan verən rezistorları ehtiva edir. Lövhədə DS18B20 temperatur sensorunun quraşdırılması üçün də xüsusi yer var, kontaktlar 2 qrupa bölünür, addım 2,54 mm. Birinci qrup kontaktlar aşağıdakı pinləri ehtiva edir:

  • DS – DS18B20 sensoru üçün çıxış;
  • SCL - saat xətti;
  • SDA - məlumat xətti;
  • VCC - 5V;

İkinci qrup əlaqəyə aşağıdakılar daxildir:

  • SQ – 1 MHz;
  • BAT – litium batareya üçün giriş.

Arduino lövhəsinə qoşulmaq üçün sizə lövhənin özü (bu halda biz Arduino Uno-nu nəzərdən keçiririk), RTC DS1307 real vaxt saat modulu, naqillər və USB kabel lazımdır.

Kontrolleri Arduino-ya qoşmaq üçün 4 pin istifadə olunur - VCC, torpaq, SCL, SDA.. Saatdan VCC Arduino-da 5V-ə, saatdan torpaq Arduino-dan yerə, SDA - A4, SCL-ə qoşulur. - A5.

Saat modulu ilə işə başlamaq üçün DS1307RTC, TimeLib və Wire kitabxanalarını quraşdırmalısınız. İş üçün RTCLib-dən də istifadə edə bilərsiniz.

RTC modulunun yoxlanılması

Birinci kodu işə saldığınız zaman proqram moduldan məlumatları saniyədə bir dəfə oxuyacaq. Birincisi, Arduino lövhəsi kompüterə qoşulmadıqda batareyanı moduldan çıxarıb başqası ilə əvəz etsəniz, proqramın necə davrandığını görə bilərsiniz. Bir neçə saniyə gözləmək və batareyanı çıxarmaq lazımdır, nəticədə saat yenidən başlayacaq. Sonra Nümunələr→RTClib→ds1307 menyusundan nümunə seçmək lazımdır. Ötürmə sürətini 57600 bps-ə düzgün təyin etmək vacibdir.

Serial Monitor pəncərəsini açdığınız zaman aşağıdakı sətirlər görünməlidir:

Saat 0:0:0 göstərəcək. Bunun səbəbi saatın gücünü itirməsi və vaxtı saymağı dayandırmasıdır. Bu səbəbdən modul işləyərkən batareya çıxarılmamalıdır.

Modulda vaxtı təyin etmək üçün eskizdə xətti tapmaq lazımdır

RTC.adjust(TarixSaat(__DATE__, __TIME__));

Bu sətirdə real vaxt rejimində saat modulunu yandırmaq üçün istifadə olunan kompüter məlumatları olacaq. Düzgün işləmək üçün əvvəlcə kompüterdəki tarix və vaxtın düzgün olduğunu yoxlamalı və yalnız bundan sonra saat modulunu yandırmağa başlamalısınız. Quraşdırıldıqdan sonra monitor aşağıdakı məlumatları göstərəcək:

Quraşdırma düzgün aparılıb və real vaxt saatını əlavə olaraq yenidən konfiqurasiya etməyə ehtiyac yoxdur.

Vaxt oxu. Modul konfiqurasiya edildikdən sonra vaxt sorğuları göndərilə bilər. Bu, vaxt və tarix məlumatlarını ehtiva edən DateTime obyektini qaytaran now() funksiyasından istifadə etməklə edilir. Vaxt oxumaq üçün istifadə olunan bir sıra kitabxanalar var. Məsələn, RTC.year() və RTC.hour() - onlar ayrı-ayrılıqda il və saat haqqında məlumat əldə edirlər. Onlarla işləyərkən problem yarana bilər: məsələn, 1:19:59-da vaxtı göstərmək üçün sorğu veriləcək. Saat 1:20:00-ı göstərməzdən əvvəl saat 1:19:00 vaxtı göstərəcək, yəni mahiyyət etibarilə bir dəqiqə itiriləcək. Buna görə də, bu kitabxanalardan mütaliənin nadir hallarda - bir neçə gündə bir dəfə baş verdiyi hallarda istifadə etmək məsləhət görülür. Zəng vaxtı üçün başqa funksiyalar var, lakin səhvləri azaltmaq və ya qarşısını almaq lazımdırsa, indi () istifadə etmək və ondan lazımi oxunuşları çıxarmaq daha yaxşıdır.

i2C saat modulu və ekranı ilə nümunə layihə

Layihə adi bir saatdır, göstəricidə dəqiq vaxt göstəriləcək və nömrələr arasındakı iki nöqtə hər saniyədə bir dəfə yanıb-sönəcəkdir. Layihəni həyata keçirmək üçün sizə Arduino Uno lövhəsi, rəqəmsal göstərici, real vaxt saatı (bu halda yuxarıda təsvir olunan ds1307 modulu), qoşulma üçün qalxan (bu halda Troyka Shield istifadə olunur), saat və naqillər üçün batareya.

Layihə TM1637 çipində sadə dörd rəqəmli göstəricidən istifadə edir. Cihaz iki naqilli interfeysə malikdir və monitorun parlaqlığının 8 səviyyəsini təmin edir. Yalnız vaxtı saat:dəqiqə formatında göstərmək üçün istifadə olunur. Göstəricidən istifadə etmək asandır və qoşulmaq asandır. Dəqiqəlik və ya saatlıq məlumat yoxlamasının tələb olunmadığı layihələr üçün istifadə etmək faydalıdır. Vaxt və tarix haqqında daha dolğun məlumat əldə etmək üçün LCD monitorlardan istifadə olunur.

Saat modulu I2C avtobusuna aid olan SCL/SDA pinlərinə qoşulub. Siz həmçinin torpaq və güc birləşdirməlisiniz. Arduino-ya yuxarıda göstərildiyi kimi qoşulur: SDA – A4, SCL – A5, moduldan Arduino-dan yerə torpaq, VCC -5V.

Göstərici sadəcə birləşdirilmişdir - onun CLK və DIO pinləri lövhədəki istənilən rəqəmsal pinlərə qoşulur.

Eskiz. Kod yazmaq üçün saat və göstəricini işə salmağa və tərtib vaxtını qeyd etməyə imkan verən quraşdırma funksiyasından istifadə edin. Vaxtın ekrana çapı döngədən istifadə etməklə həyata keçiriləcək.

#daxildir #include "TM1637.h" #include "DS1307.h" //saat və displeylə işləmək üçün bütün lazımi kitabxanaları daxil etməlisiniz. char compileTime = __TIME__; //kompilyasiya vaxtı. #define DISPLAY_CLK_PIN 10 #define DISPLAY_DIO_PIN 11 //ekranın qoşulduğu Arduino çıxışlarından gələn nömrələr; void setup() ( display.set(); display.init(); //ekranı birləşdirin və konfiqurasiya edin. clock.begin(); //saatı yandırın. bayt saat = getInt(compileTime, 0); bayt dəqiqə = getInt( compileTime, 2 bayt = getInt(compileTime, 4); //zaman moduluna yazilmaq üçün saat.setTime(); məlumatı daxili yaddaşa daxil edin, oxumağa başlayın ) void loop() ( int8_t timeDisp; //dörd bitin hər birində göstərin. clock.getTime();//vaxt almaq üçün sorğu. timeDisp = clock.hour / 10; timeDisp. = saat.saat % 10; timeDisp = saat.dəqiqə % 10;/onluq, saat vahidləri və s. display.disp; .point(saat.second % 2 ? POINT_ON: POINT_OFF);//iki nöqtəni bir saniyədən sonra yandırın və söndürün) char getInt(const char* string, int startIndex) ( return int(string - "0") * 10 + int(string) - "0"; //zamanı ikirəqəmli tam ədədə düzgün yazmaq üçün hərəkətlər. Əks halda, ekranda sadəcə bir neçə simvol görünəcək. )

Bundan sonra eskizi yükləmək lazımdır və vaxt monitorda göstəriləcək.

Proqram bir qədər modernləşdirilə bilər. Enerji söndürüldükdə, yuxarıda yazılmış eskiz ekranda onu işə saldıqdan sonra kompilyasiya zamanı təyin edilmiş vaxtı göstərməsinə səbəb olacaqdır. Quraşdırma funksiyasında hər dəfə saat 00:00:00-dan tərtibin başlanmasına qədər keçən vaxt hesablanacaq. Bu hash enerji çıxarıldıqda saxlanılan EEPROM-da saxlananlarla müqayisə ediləcək.

Qeyri-uçucu yaddaşa və ya yaddaşdan vaxt yazmaq və oxumaq üçün siz EEPROMWriteInt və EEPROMReadInt funksiyalarını əlavə etməlisiniz. Onlar hashın EEPROM-da qeydə alınmış hash-ə uyğun olub-olmadığını/uyğun olmadığını yoxlamaq üçün lazımdır.

Layihə təkmilləşdirilə bilər. Bir LCD monitordan istifadə edirsinizsə, ekranda tarix və vaxtı göstərən bir layihə edə bilərsiniz. Bütün elementlərin əlaqəsi şəkildə göstərilmişdir.

Nəticə olaraq, kodun yeni kitabxananı (maye kristal ekranlar üçün bu, LiquidCrystal) təyin etməli və tarixi əldə etmək üçün loop() funksiyasına sətirlər əlavə etməli olacaq.

Əməliyyat alqoritmi aşağıdakı kimidir:

  • Bütün komponentləri birləşdirmək;
  • Yoxlayın - monitor ekranındakı vaxt və tarix hər saniyə dəyişməlidir. Ekrandakı vaxt düzgün deyilsə, eskizə RTC.write (tmElements_t tm) funksiyasını əlavə etməlisiniz. Yanlış vaxtlarla bağlı problemlər, saat modulunun söndürüldükdə tarix və vaxtı 00:00:00 01/01/2000-yə sıfırlaması ilə bağlıdır.
  • Yazma funksiyası kompüterdən tarix və vaxtı almağa imkan verir, bundan sonra ekranda düzgün parametrlər göstəriləcəkdir.

Nəticə

Saat modulları bir çox layihələrdə istifadə olunur. Onlar məlumatların qeydiyyatı sistemləri üçün, məişət cihazlarında verilən cədvələ uyğun işləyən taymerlər və idarəetmə cihazları yaratarkən lazımdır. Geniş yayılmış və ucuz modullarla siz zəngli saat və ya sensor məlumat kaydedici kimi layihələr yarada, məlumatı SD karta yaza və ya ekranda vaxtı göstərə bilərsiniz. Bu yazıda biz ən populyar modul növləri üçün tipik istifadə ssenarilərinə və əlaqə seçimlərinə baxdıq.


Kateqoriyalar