Τροφοδοτικό Ds1307. Το Σημειωματάριο μου: Βιβλιοθήκη DS1307

Το DS1307 ονομάζεται επίσης RTC (Ρολόι πραγματικού χρόνου). Αυτό το τσιπ είναι ένα ρολόι και ένα ημερολόγιο σε πραγματικό χρόνο. Η επικοινωνία με το μικροκύκλωμα πραγματοποιείται μέσω της διεπαφής I 2 C. Το πλεονέκτημά του είναι ότι λειτουργεί (μετράει χρόνο) όταν η κύρια τροφοδοσία είναι απενεργοποιημένη από εφεδρική πηγή τροφοδοσίας 3 βολτ (για παράδειγμα, από μπαταρία CR3022). Όμως το DS1307 έχει ένα μειονέκτημα: δεν ελέγχει αν τα δεδομένα που εισάγονται είναι σωστά. Για να εργαστείτε με το μικροκύκλωμα, θα χρειαστείτε ένα ελάχιστο κιτ: χαλαζία στα 32768 Hz, μια μπαταρία 3 volt και δύο αντιστάσεις 4,7 kOhm. Διάγραμμα σύνδεσης DS1307:

Εργασία με DS1307 σε BASCOM-AVR

Για να ξεκινήσετε να εργάζεστε με το μικροκύκλωμα, πρέπει να διαμορφώσετε τις θύρες στις οποίες είναι συνδεδεμένο το μικροκύκλωμα· για να το κάνετε αυτό, χρησιμοποιήστε την εντολή Διαμόρφωση:
Διαμόρφωση Sda =(Θύρα μικροελεγκτή στην οποία είναι συνδεδεμένο το σκέλος SDA του τσιπ DS1307)
Διαμόρφωση Scl =(Θύρα μικροελεγκτή στην οποία είναι συνδεδεμένο το σκέλος SCL του τσιπ DS1307)
Για παράδειγμα:
Config Sda = Portb.1
Config Scl = Portb.0

Αφού διαμορφώσετε τις θύρες, μπορείτε να ξεκινήσετε να εργάζεστε με το τσιπ: ανάγνωση και εγγραφή δεδομένων. Η ώρα και η ημερομηνία από το τσιπ DS1307 μπορεί να διαβαστεί ως εξής:

I2cstart I2cwbyte &HD0 I2cwbyte &H00 I2cstart I2cwbyte &HD1 I2crbyte (μεταβλητή στην οποία γράφουμε τα δευτερόλεπτα), Ack I2crbyte (μεταβλητή στην οποία γράφουμε τα λεπτά), Ack I2crbyte (μεταβλητή στην οποία γράφουμε τις ώρες2cwbyte), Ack I2crbyte (μεταβλητή στην οποία γράφουμε τις ώρες) γράψτε τον αριθμό της ημέρας της εβδομάδας), Ack I2crbyte (μεταβλητή στην οποία γράφουμε την ημερομηνία), Ack I2crbyte (μεταβλητή στην οποία γράφουμε τον αριθμό του μήνα), Ack I2crbyte (μεταβλητή στην οποία γράφουμε το έτος), Nack I2cstop

Αφού διαβάσετε τα δεδομένα, πρέπει να τα μετατρέψετε σε δεκαδική μορφή, ως εξής:
(μεταβλητή δευτερολέπτων) = Makedec((μεταβλητή δευτερολέπτων) )
(μεταβλητή λεπτά) = Makedec((μεταβλητή λεπτά) )
(μεταβλητή ρολογιού) = Makedec((μεταβλητή ρολογιού) )
(μεταβλητή ημέρα της εβδομάδας) = Makedec((μεταβλητή ημέρα της εβδομάδας) )
(μεταβλητή ημερομηνίας) = Makedec((μεταβλητή ημερομηνίας) )
(μεταβλητή μήνα) = Makedec((μεταβλητή μήνα) )
(μεταβλητή έτους) = Makedec((μεταβλητή έτους) )

Ακολουθεί ένα παράδειγμα ανάγνωσης της ώρας και της ημερομηνίας και μετατροπής σε δεκαδική μορφή:

I2cstart I2cwbyte &HD0 I2cwbyte &H00 I2cstart I2cwbyte &HD1 I2crbyte Seco , Ack Name κορυφή Seco = Makedec(seco) Mine = Makedec(mine) Ώρα = Makedec(ώρα) Ημέρα = Makedec(ημέρα) Dat = Makedec(ημέρα) Μήνας = Makedec(μήνας) Έτος = Makedec(έτος)

Μάθαμε πώς να διαβάζουμε δεδομένα, τώρα ας προσπαθήσουμε να γράψουμε δεδομένα στο DS1307. Σαν αυτό:
(Η μεταβλητή που θα γράψουμε) = Makebcd((Η μεταβλητή που θα γράψουμε) )
I2cstart
I2cwbyte&HD0
Ι2cwbyte(Το κελί στο οποίο θα γράψουμε τα δεδομένα)
Ι2cwbyte(Η μεταβλητή που θα γράψουμε)
I2cstop

Σημειώστε ότι η εντολή Makebcdμετατρέπει τη μεταβλητή σε δυαδική δεκαδική μορφή. Αριθμοί και ονομασίες κυττάρων:

Ακολουθεί ένα παράδειγμα γραφής μεταβλητής δευτερολέπτων:
Seco = Makebcd(seco)
I2cstart
I2cwbyte&HD0
I2cwbyte 0
I2cwbyte Seco
Ι2cstop
Παρεμπιπτόντως, πρέπει να σημειωθεί ότι όταν το DS1307 ξεκινά για πρώτη φορά (για παράδειγμα, όταν συνδέετε μια εφεδρική μπαταρία), το μικροκύκλωμα θα επιστρέψει μια τιμή 80 σε δευτερόλεπτα, πράγμα που σημαίνει ότι το ρολόι έχει σταματήσει. Για να τα εκτελέσετε, σημειώστε την τιμή 1 σε δευτερόλεπτα. Εάν το DS1307 επιστρέψει τιμή 255 ή 168 κατά την ανάγνωση οποιωνδήποτε δεδομένων, αυτό σημαίνει ότι το τσιπ δεν έχει συνδεθεί σωστά ή ότι δεν υπάρχει εφεδρική μπαταρία.

Πρακτική εργασία με το τσιπ DS1307

Τώρα ας προσπαθήσουμε να δουλέψουμε με το τσιπ DS1307 στην πράξη: ας συναρμολογήσουμε ένα απλό ρολόι με ρύθμιση ώρας χρησιμοποιώντας κουμπιά. Για να γίνει αυτό, ας πάρουμε το ίδιο το τσιπ DS1307, τον μικροελεγκτή Attiny2313, την ένδειξη LCD στον ελεγκτή HD44780 και πολλά διακριτά εξαρτήματα. Ας συνθέσουμε ένα απλό διάγραμμα:

Και ας γράψουμε ένα απλό πρόγραμμα χρησιμοποιώντας τις γνώσεις που αποκτήθηκαν:

$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 .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 Cursor Off Do I2cstart I2cwbyte &HD0 I2cwbyte &H00 I2cstart I2cwbyte &HD1 I2crbyte Seco , Ack I2crbyte Mine , Ack I2crbyte Hour , Nack I2cstop Seco = Makedec(seco) Mine = Makedec(mine) Lodchour = Makedec(mine) Hour = Makedec(mine) Hour = ":" ; Δικος μου; ":" ; seco ; " " Αν Pind.5 = 0 then Incr Mine = Makebcd(mine) I2cstart I2cwbyte &HD0 I2cwbyte 1 I2cwbyte Mine I2cstop Waits 100 End If If Pind.4 = 0 then Incr Hour Hour = Makebcd(ώρα I2cwbyte I2cwte I2cw2c Ώρα I2cstop Waitms 100 End If Loop End

DS1307- τσιπ ρολογιού σε πραγματικό χρόνο με διεπαφή I2C(TWI). Το ρολόι/ημερολόγιο αποθηκεύει τις ακόλουθες πληροφορίες: δευτερόλεπτα, λεπτά, ώρες, ημέρα, ημερομηνία, μήνα και έτος. Το τέλος του μήνα προσαρμόζεται αυτόματα για μήνες με λιγότερες από 31 ημέρες, συμπεριλαμβανομένης της προσαρμογής για δίσεκτα έτη. Το ρολόι λειτουργεί σε 24ωρη ή 12ωρη μορφή με ένδειξη AM/PM. Το DS1307 διαθέτει ενσωματωμένο κύκλωμα παρακολούθησης ισχύος που ανιχνεύει την απώλεια ισχύος και αλλάζει αυτόματα το κύκλωμα σε τροφοδοσία μπαταρίας.

Vbat- Είσοδος μπαταρίας για οποιαδήποτε τυπική κυψέλη λιθίου 3 Volt ή άλλη πηγή ενέργειας. Για κανονική λειτουργία, η τάση της μπαταρίας πρέπει να διατηρείται μεταξύ 2,5 και 3,5 V. Το επίπεδο στο οποίο απαγορεύεται η πρόσβαση στο ρολόι πραγματικού χρόνου και στη μνήμη RAM χρήστη έχει οριστεί εσωτερικά σε 1,25 x Vbat. Μια μπαταρία λιθίου με χωρητικότητα 35 mAh ή μεγαλύτερη είναι αρκετή για να τροφοδοτήσει το DS1307 για περισσότερα από 10 χρόνια ελλείψει ρεύματος.
SCL(Είσοδος σειριακού ρολογιού) - Το SCL χρησιμοποιείται για το συγχρονισμό της μεταφοράς δεδομένων μέσω της σειριακής διεπαφής.
Σ.Δ.Α.(Serial Data Input/Output) - SDA - είσοδος/έξοδος δεδομένων για σειριακή διεπαφή 2 συρμάτων. Αυτή είναι μια έξοδος ανοιχτής αποστράγγισης που απαιτεί μια εξωτερική αντίσταση έλξης.
SQW/OUT(Τετράγωνο / Πρόγραμμα οδήγησης εξόδου) - Όταν το bit SQWE έχει ρυθμιστεί στο 1, η έξοδος SQW/OUT παράγει παλμούς τετραγωνικών κυμάτων σε μία από τις τέσσερις συχνότητες: 1 Hz, 4 kHz, 8 kHz, 32 kHz. Η ακίδα SQW/OUT είναι ανοιχτή αποστράγγιση και απαιτεί εξωτερική αντίσταση έλξης.
Χ1, Χ2- καλώδια για σύνδεση τυπικού κρυστάλλου χαλαζία 32.768 kHz. Το εσωτερικό κύκλωμα του ταλαντωτή είναι σχεδιασμένο να λειτουργεί με κρύσταλλο που έχει ονομαστική χωρητικότητα (CL) 12,5 pF.
GND- Γη.
VCC– Τροφοδοτικό 5 volt.

DS1307λειτουργεί ως εξαρτημένη συσκευή στο σειριακό δίαυλο. Για πρόσβαση σε αυτό πρέπει να ορίσετε την κατάσταση ΑΡΧΗκαι διαβιβάστε τον κωδικό αναγνώρισης της συσκευής ακολουθούμενο από τη διεύθυνση μητρώου. Οι επόμενοι καταχωρητές μπορούν να προσπελαστούν διαδοχικά μέχρι να οριστεί η κατάσταση ΝΑ ΣΤΑΜΑΤΗΣΕΙ. Οταν VCCπέφτει κάτω από 1,25 x Vbat, η συσκευή σταματά να επικοινωνεί και επαναφέρει τον μετρητή διευθύνσεων. Κατά τη διάρκεια αυτής της περιόδου, δεν θα ανταποκρίνεται στα σήματα εισόδου για να αποτρέψει την εγγραφή λανθασμένων πληροφοριών. Οταν VCCπέφτει κάτω από το Vbat, η συσκευή μεταβαίνει σε λειτουργία αποθήκευσης χαμηλής ισχύος. Όταν ενεργοποιείτε την τροφοδοσία, η συσκευή αλλάζει τροφοδοσία από την μπαταρία σε VCCόταν η τάση τροφοδοσίας υπερβαίνει το Vbat + 0,2V και αποκρίνεται στα σήματα εισόδου όταν VCCθα γίνει περισσότερο από 1,25 x Vbat. Όταν η τροφοδοσία είναι εντός των κανονικών ορίων, η συσκευή είναι πλήρως προσβάσιμη και τα δεδομένα μπορούν να γραφτούν και να διαβαστούν. Όταν μια μπαταρία τριών βολτ είναι συνδεδεμένη στη συσκευή και το VCC είναι κάτω από 1,25 x Vbat, η ανάγνωση και η εγγραφή απαγορεύονται. Ωστόσο, η αντίστροφη μέτρηση του χρόνου εξακολουθεί να λειτουργεί. Οταν VCCπέφτει κάτω από το Vbat, η τροφοδοσία RAM και χρονομέτρησης αλλάζει σε μια εξωτερική μπαταρία 3 V.

Οι πληροφορίες ώρας και ημερομηνίας λαμβάνονται με την ανάγνωση των αντίστοιχων μητρώων. Οι καταχωρητές ρολογιού φαίνονται στον παρακάτω πίνακα. Η ώρα και το ημερολόγιο ρυθμίζονται ή αρχικοποιούνται γράφοντας byte στους κατάλληλους καταχωρητές. Τα περιεχόμενα των καταχωρητών ώρας και ημερολογίου αποθηκεύονται σε BCD (BCD)Επομένως, πριν από την εμφάνιση πληροφοριών σε οθόνη LCD ή ένδειξη επτά τμημάτων, είναι απαραίτητο να μετατραπεί ο κώδικας BCD σε δυαδικό ή ANSII κώδικα.

Το bit 7 του καταχωρητή 0 είναι το bit Clock Halt. Όταν αυτό το bit οριστεί στο 1, η γεννήτρια σταματά. Όταν επαναφέρεται στο μηδέν, η γεννήτρια λειτουργεί και το ρολόι μετρά τον χρόνο.

Το DS1307 μπορεί να λειτουργήσει σε 12ωρη ή 24ωρη λειτουργία. Το bit 6 του καταχωρητή ρολογιού καθορίζει έναν από αυτούς τους τρόπους λειτουργίας. Όταν είναι ίση με 1, ρυθμίζεται η λειτουργία 12 ωρών. Σε λειτουργία 12 ωρών, το bit 5 high υποδεικνύει την απογευματινή ώρα. Σε λειτουργία 24 ωρών, το bit 5 είναι το δεύτερο bit 10 ωρών (20-23 ώρες).

Ο καταχωρητής ελέγχου DS1307 έχει σχεδιαστεί για να ελέγχει τη λειτουργία εξόδου SQW/OUT. Κομμάτι ΕΞΩ- Έλεγχος εξόδου. Αυτό το bit ελέγχει το επίπεδο εξόδου του pin SQW/OUT, όταν η δημιουργία μαιάνδρου είναι απενεργοποιημένη. Εάν SQWE = 0, λογικό επίπεδο στο pin SQW/OUTισούται με 1 αν ΕΞΩ= 1 και 0 - αν ΕΞΩ = 0. SQWE- Ανάλυση μαιάνδρου. Όταν αυτό το bit έχει οριστεί σε 1, ενεργοποιείται η δημιουργία τετραγωνικών κυμάτων. Η συχνότητα τετραγωνικών κυμάτων εξαρτάται από τις τιμές των bit RS0 και RS1. Αυτά τα bit ελέγχουν τη συχνότητα του τετραγωνικού κύματος όταν είναι ενεργοποιημένη η παραγωγή του. Ο παρακάτω πίνακας δείχνει τις συχνότητες που μπορούν να καθοριστούν από bit RS.

Το DS1307 υποστηρίζει αμφίδρομο δίαυλο 2 καλωδίων και πρωτόκολλο μεταφοράς δεδομένων. Η συσκευή που στέλνει δεδομένα στο δίαυλο ονομάζεται πομπός και η συσκευή που λαμβάνει δεδομένα ονομάζεται δέκτης. Η συσκευή που ελέγχει τη μετάδοση ονομάζεται κύριος. Οι συσκευές που ελέγχονται από τον κύριο είναι σκλάβοι. Ο δίαυλος πρέπει να ελέγχεται από έναν κύριο που δημιουργεί σειριακά ρολόγια (SCL), ελέγχει την πρόσβαση στο δίαυλο και δημιουργεί καταστάσεις START και STOP. Το DS1307 λειτουργεί ως slave σε ένα λεωφορείο 2 καλωδίων.

Για να εργαστείτε με το DS1307, είναι απαραίτητο να οργανώσετε μια λειτουργία ανάγνωσης από το τσιπ και μια λειτουργία εγγραφής.

1. Λειτουργία εγγραφής σε DS1307. Τα σειριακά δεδομένα και τα ρολόγια λαμβάνονται μέσω SDA και SCL. Μετά τη μετάδοση κάθε byte, μεταδίδεται ένα bit επιβεβαίωσης. ΠΑΡΑΚΑΛΩ. κράτη ΑΡΧΗΚαι ΝΑ ΣΤΑΜΑΤΗΣΕΙαναγνωρίζονται ως η αρχή και το τέλος μιας σειριακής μετάδοσης. Η αναγνώριση διεύθυνσης εκτελείται στο υλικό μετά τη λήψη της υποτελούς διεύθυνσης και του bit κατεύθυνσης. Το byte διεύθυνσης περιέχει τη διεύθυνση επτά bit του DS1307 1101000, ακολουθούμενη από ένα bit κατεύθυνσης (R/W), το οποίο είναι 0 όταν γράφεται. Μόλις ληφθεί και αποκωδικοποιηθεί το byte διεύθυνσης, το DS1307 εκδίδει μια επιβεβαίωση ΠΑΡΑΚΑΛΩστη γραμμή SDA. Αφού το DS1307 επιβεβαιώσει τη διεύθυνση slave και το bit εγγραφής, ο κύριος μεταβιβάζει τη διεύθυνση καταχωρητή στο DS1307. Αυτό θα ορίσει τον δείκτη καταχωρητή στο DS1307. Στη συνέχεια, ο κύριος θα αρχίσει να μεταδίδει byte δεδομένων στο DS1307, το οποίο θα αναγνωρίζει κάθε byte που λαμβάνεται. Στο τέλος της ηχογράφησης, ο παρουσιαστής θα δημιουργήσει μια κατάσταση ΝΑ ΣΤΑΜΑΤΗΣΕΙ.

2. Λειτουργία ανάγνωσης από το DS1307. Το πρώτο byte λαμβάνεται και επεξεργάζεται όπως στη λειτουργία υποτελούς λήψης. Ωστόσο, σε αυτή τη λειτουργία το bit κατεύθυνσης θα υποδεικνύει ότι η κατεύθυνση μετάδοσης έχει αλλάξει. Τα σειριακά δεδομένα μεταδίδονται μέσω SDA από το DS1307, ενώ τα σειριακά ρολόγια μεταδίδονται μέσω SCL στο DS1307. κράτη ΑΡΧΗΚαι ΝΑ ΣΤΑΜΑΤΗΣΕΙαναγνωρίζονται ως η αρχή και το τέλος μιας σειριακής μετάδοσης. Το byte διεύθυνσης είναι το πρώτο byte που λαμβάνεται μετά τη δημιουργία της κατάστασης από το master. ΑΡΧΗ. Το byte διεύθυνσης περιέχει τη διεύθυνση επτά bit του DS1307 1101000, ακολουθούμενη από ένα bit κατεύθυνσης (R/W), το οποίο είναι 1 όταν διαβάζεται. Μόλις ληφθεί και αποκωδικοποιηθεί το byte διεύθυνσης, το DS1307 εκδίδει μια επιβεβαίωση ΠΑΡΑΚΑΛΩστη γραμμή SDA. Στη συνέχεια, το DS1307 αρχίζει να μεταδίδει δεδομένα ξεκινώντας από τη διεύθυνση μητρώου που δείχνει ο δείκτης καταχωρητή. Εάν ο δείκτης καταχωρητή δεν έχει γραφτεί πριν από την έναρξη της λειτουργίας ανάγνωσης, τότε η πρώτη διεύθυνση που διαβάζεται είναι η τελευταία διεύθυνση που απομένει στον δείκτη καταχωρητή. Το DS1307 θα πρέπει να απορριφθεί NOASKγια να τελειώσω την ανάγνωση.

Ας δούμε τα χαρακτηριστικά της εργασίας με το DS1307 χρησιμοποιώντας το παράδειγμα ενός απλού ρολογιού που θα δείχνει ώρες, λεπτά και δευτερόλεπτα. Τα δεδομένα θα εμφανίζονται σε οθόνη LCD 16x2. Δύο κουμπιά «Ώρες+» και «Λεπτά+» θα σας επιτρέψουν να ορίσετε την επιθυμητή ώρα. Ο μικροελεγκτής Atmega 8 είναι χρονισμένος από έναν εσωτερικό ταλαντωτή με συχνότητα 1 MHz, οπότε μην ξεχάσετε να αλλάξετε τις ασφάλειες. Παρακάτω είναι ένα διάγραμμα σύνδεσης.

Το πρόγραμμα ελέγχου περιλαμβάνει σετ λειτουργιών για εργασία με το δίαυλο TWI, το ρολόι DS1307 και την οθόνη LCD.

I2CInit - προετοιμασία διαύλου.
I2CStart - μετάδοση της συνθήκης START.
I2CStop - μετάδοση της κατάστασης STOP.
I2CWriteByte - εγγραφή δεδομένων.
I2CReadByte - ανάγνωση δεδομένων.
DS1307Read - λειτουργία για ανάγνωση δεδομένων από DS1307.
DS1307Write - Λειτουργία για εγγραφή δεδομένων στο DS1307.
lcd_com - μετάδοση εντολών στην οθόνη LCD.
lcd_data - μεταφορά δεδομένων σε LCD.
lcd_string - λειτουργία εμφάνισης συμβολοσειράς στην οθόνη LCD.
lcd_num_to_str - συνάρτηση για την έξοδο ενός χαρακτήρα τύπου int.
lcd_init - Αρχικοποίηση LCD.

Παρακάτω είναι ο κωδικός του προγράμματος:

#περιλαμβάνω #περιλαμβάνω // Συνάρτηση αρχικοποίησης του διαύλου TWI void I2CInit(void) ( TWBR = 2; // Ρύθμιση της συχνότητας διαύλου 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)+(θερμοκρασία & 0x0F); DS1307Read(0x01,&temp); // Ανάγνωση του καταχωρητή λεπτών λεπτό = (((θερμοκρασία & 0xF0) >> 4)*10)+(θερμοκρασία & 0x0F); DS1307Read(0x02,&temp); // Ανάγνωση της ώρας εγγραφής ρολογιού = (((θερμοκρασία & 0xF0) >> 4)*10)+(θερμοκρασία & 0x0F); lcd_com(0xC4); lcd_num_to_str(ώρα, 2); // Εμφάνιση του ρολογιού lcd_com(0xC7); lcd_num_to_str(λεπτό, 2); // Εμφάνιση των λεπτών lcd_com(0xCA); lcd_num_to_str(δεύτερο, 2); // Εμφάνιση δευτερολέπτων if((PINC & (1<< PC0)) == 0) // Если нажата кнопка { while((PINC & (1 << PC0)) == 0){} // Ждем отпускания кнопки hour++; // Увеличиваем часы на 1 if(hour >23) ώρα = 0; // Μετατροπή από δυαδικό σε BCD και εγγραφή σε DS1307 uint8_t temp; θερμοκρασία = ((ώρα/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) λεπτό = 0; // Μετατροπή από δυαδικό σε BCD και εγγραφή σε DS1307 uint8_t temp; θερμοκρασία = ((λεπτό/10)<< 4)|(minute%10); DS1307Write(0x01, temp); _delay_ms(100); } } }

Οι κριτικές σχετικά με αυτό το ρολόι στο Διαδίκτυο είναι οι πιο αντιφατικές. Κάποιοι λένε ότι το ρολόι είναι υπέροχο, ενώ άλλοι το αποκαλούν κακή δημιουργία του Ντάλας. Και έτσι, για να διώξω όλες τις ψεύτικες φήμες, έβγαλα τη μικρούχα από το στασίδι και άρχισα να πειραματίζομαι.

Ιδιαιτερότητες:

  • Πολύ χαμηλή κατανάλωση ενέργειας. Ο κατασκευαστής υπόσχεται 10 χρόνια λειτουργίας ρολογιού από μία τυπική μπαταρία. CR2032
  • 56 byte μνήμης για την αποθήκευση δεδομένων χρήστη. Νομίζω ότι δεν είναι μια ιδιαίτερα απαραίτητη επιλογή, αλλά μπορεί να είναι χρήσιμη σε κάποιον.
  • Προγραμματιζόμενη έξοδος για χρονομέτρηση εξωτερικών συσκευών. Μπορεί να εξάγει 1 Hz, 4,096 kHz, 8,192 kHz και 32,768 kHz.
  • 24ωρη και 12ωρη λειτουργία

Pinout

Οι ακίδες του ρολογιού βρίσκονται ως εξής:

Χ1, Χ2— Καρφίτσες για σύνδεση συντονιστή χαλαζία σε συχνότητα 32,768 kHz
VBAT— Έξοδος για σύνδεση εφεδρικής μπαταρίας 3 volt
GND- Γη
Σ.Δ.Α.- Γραμμή δεδομένων διαύλου i2c
SCL— Γραμμή ρολογιού λεωφορείου i2c
SQW/OUT– σήμα εξόδου για χρονομέτρηση εξωτερικών συσκευών
VCC- Τροφοδοτικό 5 volt

Σύνδεση με τον ελεγκτή
Το δέσιμο είναι ελάχιστο. Θα χρειαστείτε χαλαζία 32,768 kHz, ένα ζεύγος αντιστάσεων για τη λειτουργία του διαύλου i2c και μια μπαταρία τριών βολτ.

Σωστή διάταξη πίνακα
Η ακρίβεια του ρολογιού, και μάλιστα η απόδοση του ρολογιού γενικότερα, εξαρτάται από τη διάταξη της πλακέτας τυπωμένου κυκλώματος. Ο Ντάλας στο φύλλο δεδομένων του συνιστά τη μείωση του μήκους των αγωγών από το μικροκύκλωμα στον αντηχείο χαλαζία στο ελάχιστο και τον περιβάλλοντα αυτών των αγωγών με ένα ορθογώνιο συνδεδεμένο στη γείωση. Επιπλέον, για αξιοπιστία, κόλλησα καλώδια που πήγαιναν στο έδαφος στο σώμα χαλαζία και τοποθέτησα έναν πυκνωτή 0,1 uF παράλληλα με το τροφοδοτικό.

Παρεμπιπτόντως, μπορεί να λειτουργήσει χωρίς χαλαζία. Για να γίνει αυτό, ένα εξωτερικό σήμα ρολογιού με συχνότητα 32,768 kHz παρέχεται στο σκέλος X1 και το X2 παραμένει αιωρούμενο στον αέρα.

Οργάνωση μνήμης ρολογιού
Αυτή η μικροσκοπική συσκευή είναι εξοπλισμένη με 64 byte μνήμης. Τα πρώτα οκτώ byte λειτουργούν. Αποθηκεύουν ώρα, ημερομηνία, ημέρα της εβδομάδας. Τα υπόλοιπα διατίθενται στις ανάγκες του χρήστη. Μπορείτε να αποθηκεύσετε, για παράδειγμα, κάποιες ρυθμίσεις ή κάτι άλλο σε αυτές. Φυσικά, όταν χάνεται η εφεδρική ισχύς, όλες οι πληροφορίες σε αυτή τη μνήμη καταστρέφονται. Όλη η εργασία με το ρολόι (ανάγνωση και ρύθμιση της ώρας/ημερομηνίας) καταλήγει στην ανάγνωση και εγγραφή των απαραίτητων κελιών μνήμης.

Όλοι οι αριθμοί στη μνήμη αποθηκεύονται σε δυαδική δεκαδική μορφή. Αυτό σημαίνει ότι δύο ψηφία μπορούν να αποθηκευτούν σε ένα byte. Για παράδειγμα, ο αριθμός 0x23 περιέχει τον αριθμό 2 και τον αριθμό 3. Για κάθε αριθμό, εκχωρούνται 4 bit. Γιατί γίνεται αυτό; Για ευκολία και εξοικονόμηση μνήμης. Εκτός από την ώρα και την ημερομηνία, πολλά bit ρυθμίσεων αποθηκεύονται στη μνήμη:

  • Παύση του ρολογιού- ελέγχει το ρολόι. Όταν ρυθμιστεί το bit, το ρολόι σταματά. Για να ξεκινήσετε το ρολόι, πρέπει να γράψετε 0 σε αυτό το bit. Αφού συνδέσετε την εφεδρική μπαταρία, αυτό το bit ρυθμίζεται και το ρολόι δεν μετράει την ώρα! Πρέπει να το θυμάστε αυτό.
  • 24/12 - αυτό το bit για την επιλογή της λειτουργίας ρολογιού. Όταν αυτό το bit είναι ίσο με ένα, χρησιμοποιείται η λειτουργία 12 ωρών. Διαφορετικά 24 ώρες. Εάν χρησιμοποιείται η λειτουργία 12 ωρών, τότε το πέμπτο bit δείχνει AM ή PM τώρα. Αν το bit είναι 1 τότε σημαίνει PM. Σε λειτουργία 24 ωρών, αυτό το bit χρησιμοποιείται για την αποθήκευση δεκάδων ωρών σε συνδυασμό με το bit 4.
  • Παραγωγή— ελέγχει την κατάσταση του σκέλους SQW/OUT. Το bit έχει ρυθμιστεί - το αρχείο καταγραφής είναι στο πόδι 1. Επαναφορά - στο πόδι 0. Για να ελέγξετε με αυτόν τον τρόπο, το bit SQWEπρέπει να γίνει επαναφορά.
  • SQWE- όταν ρυθμιστεί το bit, εμφανίζονται ορθογώνιοι παλμοί στο σκέλος SQW/OUT.
  • RS1, RS0— αυτά τα bits ρυθμίζουν τη συχνότητα παλμού. Η εξάρτηση της συχνότητας από τον συνδυασμό bit φαίνεται στον παρακάτω πίνακα:

Λογισμικό

Για να εργαστείτε με το ρολόι DS1307, γράφτηκε μια απλή βιβλιοθήκη που περιέχει τις ακόλουθες βασικές λειτουργίες:

DS_start— ξεκινά το ρολόι. Μπορείτε επίσης να ξεκινήσετε το ρολόι ρυθμίζοντας την ώρα.
DS_stop- σταματά το ρολόι
DS_set_time —Ρύθμιση της ώρας. Πριν καλέσετε τη διαδικασία, πρέπει να βάλετε δευτερόλεπτα σε tmp1, λεπτά σε tmp2 και ώρες σε tmp3. Ρολόι σε 24ωρη μορφή.
DS_get_time: —ανάγνωση του χρόνου από ένα ρολόι. Τα δευτερόλεπτα θα καταγράφονται σε tmp1, τα λεπτά σε tmp2, οι ώρες σε tmp3
DS_get_date:— ανάγνωση της ημερομηνίας από το ρολόι. Η ημέρα θα καταγραφεί σε tmp1, μήνας σε tmp2, έτος σε tmp3
DS_set_date: —ορίζοντας την ημερομηνία. Πριν καλέσετε τη διαδικασία, πρέπει να βάλετε την ημέρα σε tmp1, τον μήνα σε tmp2 και το έτος σε tmp3 (2 τελευταία ψηφία)

Οι ρουτίνες για τη ρύθμιση/ανάγνωση ώρας και ημερομηνίας μπορούν να δέχονται/επιστρέφουν δεδομένα εισόδου σε BCD και δεκαδική μορφή. Για να επιλέξετε την επιθυμητή μορφή, πρέπει να σχολιάσετε ή να αφαιρέσετε το σχόλιο τρεις γραμμές σε κάθε διαδικασία (υπάρχουν σημειώσεις σχετικά με αυτό στον κώδικα).

Το πρόγραμμα δοκιμής σάς επιτρέπει να ελέγχετε το ρολόι μέσω UART (ταχύτητα 9600, ο ελεγκτής λειτουργεί στα 8 MHz). Κατά την εκκίνηση, εμφανίζεται αμέσως η ώρα, η ημερομηνία και μια προτροπή για εισαγωγή εντολών από το 1 έως το 3. Όταν επιλέγετε την επιλογή 1, η ώρα/ημερομηνία διαβάζεται ξανά. Η επιλογή 2 σάς επιτρέπει να ορίσετε την ώρα και η επιλογή 3 την ημερομηνία. Εάν θέλετε να δοκιμάσετε να παίξετε με το ρολόι, περιλαμβάνεται ένα αρχείο προσομοίωσης στο αρχείο προέλευσης.

Ακρίβεια
Εδώ πολλά εξαρτώνται από τον χαλαζία που χρησιμοποιείται και τη διάταξη του πίνακα. Το φύλλο δεδομένων αναφέρει ότι η χωρητικότητα χαλαζία πρέπει να είναι 12,5 pF. Λένε ότι είναι καλύτερο να χρησιμοποιείτε κρύσταλλα από μητρικές πλακέτες. Για να διορθώσετε τη διαδρομή, μπορείτε να κολλήσετε έναν πυκνωτή κοπής στον συντονιστή και να τον χρησιμοποιήσετε για να αλλάξετε τη συχνότητα εντός μικρών ορίων. Προσωπικά, αυτό το ρολόι μου δουλεύει εδώ και δύο μέρες και είναι 3 δευτερόλεπτα πίσω. Κάτι μου λέει ότι το πρόβλημα είναι στην ικανότητα του χαλαζία, θα δοκιμάσω ένα άλλο και θα αναφέρω.

συμπέρασμα
Δεν είναι κακό ρολόι. Ιδανικό για ερασιτεχνική χρήση. Αν και κάποιοι γράφουν για δυσλειτουργίες, δεν τις έχω συναντήσει ακόμα.

Το DS1307 είναι μια μικρή μονάδα σχεδιασμένη για τη μέτρηση του χρόνου. Συναρμολογείται με βάση το τσιπ DS1307ZN και τροφοδοτείται από μπαταρία λιθίου (LIR2032), η οποία του επιτρέπει να λειτουργεί αυτόνομα για μεγάλο χρονικό διάστημα. Επίσης στη μονάδα υπάρχει μια μη πτητική μνήμη EEPROM 32 KB (AT24C32). Το μικροκύκλωμα AT24C32 και το DS1307ZN συνδέονται με έναν κοινό δίαυλο χρησιμοποιώντας τη διεπαφή I2C.

Τεχνικές προδιαγραφές

Τάση τροφοδοσίας: 5V
Θερμοκρασία λειτουργίας: – 40℃ … + 85℃
Μνήμη: 56 byte (μη πτητική)
Μπαταρία : LIR2032 (αυτόματη ανίχνευση πηγής ενέργειας)
Διεπαφή: I2C
Διαστάσεις: 28mm x 25mm x 8mm

Γενικές πληροφορίες

Η χρήση της μονάδας DS1307 είναι συχνά πολύ δικαιολογημένη, για παράδειγμα, όταν τα δεδομένα διαβάζονται σπάνια, σε διαστήματα άνω της μιας εβδομάδας, είναι παράλογο ή αδύνατο να χρησιμοποιηθούν οι ίδιοι πόροι του ελεγκτή. Η παροχή αδιάλειπτης τροφοδοσίας, για παράδειγμα, σε πλακέτες Arduino για μεγάλο χρονικό διάστημα είναι ακριβή, ακόμη και όταν χρησιμοποιείτε μπαταρία.
Χάρη στη δική του μνήμη και αυτονομία, είναι δυνατή η καταγραφή συμβάντων (με αυτόνομη παροχή ρεύματος) όπως αλλαγές θερμοκρασίας και ούτω καθεξής, τα δεδομένα αποθηκεύονται στη μνήμη και μπορούν να διαβαστούν από τη μνήμη της μονάδας. Έτσι, η μονάδα DS1307 χρησιμοποιείται συχνά όταν οι ελεγκτές Arduino πρέπει να γνωρίζουν την ακριβή ώρα, να ενεργοποιήσουν κάποιο συμβάν κ.λπ.

Η ανταλλαγή δεδομένων με άλλες συσκευές πραγματοποιείται μέσω της διεπαφής I2C από τις ακίδες SCL και SDA. Οι πυκνωτές C1 και C2 είναι απαραίτητοι για τη μείωση του θορύβου κατά μήκος της γραμμής ισχύος. Για να διασφαλιστεί η σωστή στάθμη των σημάτων SCL και SDA, τοποθετούνται αντιστάσεις R2 και R3 (ανασύρονται μέχρι το τροφοδοτικό). Για να ελέγξετε τη λειτουργικότητα της μονάδας, ένα σήμα SQ ορθογώνιου σχήματος με συχνότητα 1 Hz παρέχεται στον ακροδέκτη 7 του τσιπ DS1307Z. Τα στοιχεία R4, R5, R6, VD1 είναι απαραίτητα για την επαναφόρτιση της μπαταρίας λιθίου. Επίσης, η πλακέτα έχει ένα κάθισμα (U1) για την εγκατάσταση ενός αισθητήρα θερμοκρασίας DS18B20 (αν χρειάζεται, μπορείτε να τον κολλήσετε), μπορείτε να διαβάσετε τις ενδείξεις από τον πείρο DS, που είναι συνδεδεμένος στο τροφοδοτικό, μέσω μιας αντίστασης R1 με αντίσταση 3,3 kOhm. Το διάγραμμα κυκλώματος και ο σκοπός των επαφών φαίνονται στα παρακάτω σχήματα.

Υπάρχουν δύο ομάδες επαφών στην πλακέτα, με βήμα 2,54 mm, για βολική σύνδεση με το breadboard, θα χρησιμοποιήσω συνδέσμους καρφίτσας, πρέπει να συγκολληθούν.

Πρώτη ομάδα επαφών:
DS: Έξοδος DS18B20 (1-σύρμα)


VCC: Τροφοδοτικό μονάδας «+».
GND: Τροφοδοτικό μονάδας “-”.

Δεύτερη ομάδα επαφών:
SQ: Είσοδος 1 MHz
DS: Έξοδος DS18B20 (1-σύρμα)
SCL: Σειριακό ρολόι
SDA: γραμμή δεδομένων (Serial Dфta)
VCC: Τροφοδοτικό μονάδας «+».
GND: Τροφοδοτικό μονάδας "-".
ΝΥΧΤΕΡΙΔΑ:

Φόρτιση της μπαταρίας
Όπως περιγράφεται, η μονάδα σας μπορεί να φορτίσει την μπαταρία, αυτό υλοποιείται χρησιμοποιώντας τα εξαρτήματα R4, R5, R6 και τη δίοδο D1. Αλλά αυτό το κύκλωμα έχει ένα μειονέκτημα: μέσω των αντιστάσεων R4 και R6, η μπαταρία αποφορτίζεται (όπως σημείωσε ο χρήστης ALEXEY, όχι πολύ). Επειδή η μονάδα καταναλώνει λίγο ρεύμα, μπορείτε να αφαιρέσετε το κύκλωμα τροφοδοσίας· για να το κάνετε αυτό, αφαιρέστε τα R4, R5, R6 και VD1, αντικαταστήστε το R6 με ένα βραχυκυκλωτήρα (αφού αφαιρέσετε τα εξαρτήματα, μπορείτε να χρησιμοποιήσετε μια κανονική μπαταρία CR2032).

Σύνδεση του DS1307 στο Arduino

Απαιτούμενα ανταλλακτικά:
Arduino UNO R3 x 1 τεμ.
Σύρμα DuPont, 2,54 mm, 20 cm x 1 τεμ.
Καλώδιο USB 2.0 A-B x 1 τεμ.
Ρολόι πραγματικού χρόνου RTC DS1307 x 1 τεμ.

Σύνδεση:
Για να συνδέσετε το ρολόι πραγματικού χρόνου DS1307, πρέπει να κολλήσετε τους ακροδέκτες των ακροδεκτών στην πρώτη ομάδα ακίδων. Στη συνέχεια, συνδέουμε τα καλώδια SCL (DS1307) στον ακροδέκτη 4 (Arduino UNO) και SDA (DS1307) στον ακροδέκτη 5 (Arduino UNO), το μόνο που μένει είναι να συνδέσουμε το VCC στο +5V και το GND στο GND. Παρεμπιπτόντως, οι έξοδοι της διεπαφής I2C είναι διαφορετικές σε διαφορετικές πλακέτες Arduino· ο σκοπός της καθεμίας φαίνεται παρακάτω.

Ρύθμιση της ώρας DS1307
Πρώτα απ 'όλα, πρέπει να κατεβάσετε και να εγκαταστήσετε τη βιβλιοθήκη "DS1307RTC" και "TimeLib" στο περιβάλλον ανάπτυξης Arduino IDE, στη συνέχεια πρέπει να ορίσετε την ώρα, να ανοίξετε το παράδειγμα από τη βιβλιοθήκη DS1307RTC "File" -> "Examples" - > "DS1307RTC" -> "SetTime" ή αντιγράψτε τον παρακάτω κωδικό.

// Συνδέστε τη βιβλιοθήκη DS1307RTC const char *monthName = ( "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct " , "Νοέμβριος", "Δεκέμβριος" ); tmElements_t tm; void setup() ( bool parse=false; bool config=false; // λάβετε την ημερομηνία και την ώρα εκτέλεσης του μεταγλωττιστή if (getDate(__DATE__) && getTime(__TIME__)) ( parse = true; // και διαμορφώστε το RTC με αυτές οι πληροφορίες εάν (RTC.write(tm)) ( config = true; ) ) Serial.begin(9600); while (!Serial) ; // περιμένετε για καθυστέρηση σειριακής παρακολούθησης Arduino(200); if (ανάλυση && config) ( Serial.print("DS1307 configured Time="); Serial.print(__TIME__); Serial.print(", Date="); Serial.println(__DATE__); ) else if (ανάλυση) ( Serial.println("DS1307 Σφάλμα επικοινωνίας:-("); Serial.println("Ελέγξτε το κύκλωμά σας"); ) else ( Serial.print("Δεν ήταν δυνατή η ανάλυση των πληροφοριών από τον μεταγλωττιστή, Time=\""); Serial.print(__TIME__); Serial.print("\", Date=\""); Serial.print(__DATE__); Serial.println("\""); ) ) void loop() ( ) bool getTime(const char *str) (int Hour, Min, Sec; if (sscanf(str, "%d:%d:%d", &Hour, &Min, &Sec) != 3) return false; tm.Hour = Hour; tm.Minute = Min; tm. Second = Sec; return true; ) bool getDate(const char *str) (char Month; int Ημέρα, Έτος; uint8_t monthIndex; if (sscanf(str, "%s %d %d", Μήνας, &Ημέρα, &Έτος) != 3) return false; για (monthIndex = 0; monthIndex< 12; monthIndex++) { if (strcmp(Month, monthName) == 0) break; } if (monthIndex >= 12) επιστροφή ψευδής; tm.Day = Ημέρα; tm.Month = monthIndex + 1; tm.Year = CalendarYrToTm(Year); επιστροφή αληθινή? )

Κατεβάστε το σκίτσο

Φορτώνουμε αυτό το σκίτσο στον ελεγκτή Arduino (ο χρόνος λαμβάνεται από το λειτουργικό σύστημα), ανοίγουμε το "Port Monitoring"

Πρόγραμμα
Υπάρχει ένα άλλο παράδειγμα στη βιβλιοθήκη, μπορείτε να το ανοίξετε DS1307RTC "File" -> "Examples" -> "DS1307RTC" -> "ReadTest"

/* Η δοκιμή πραγματοποιήθηκε στο Arduino IDE 1.6.12 Ημερομηνία δοκιμής 23/11/2016. */ #περιλαμβάνω // Συμπεριλάβετε τη βιβλιοθήκη Wire #include // Συμπεριλάβετε τη βιβλιοθήκη TimeLib #include // Συνδέστε το void setup() της βιβλιοθήκης DS1307RTC ( Serial.begin(9600); // Ρυθμίστε τον ρυθμό μεταφοράς δεδομένων ενώ (!Serial) ; // Περιμένετε να συνδεθεί η σειριακή θύρα. Απαιτείται μόνο για καθυστέρηση Leonardo(200); // Περιμένετε 200 μs Serial.println("DS1307RTC Read Test"); // Εξαγωγή δεδομένων στη σειριακή θύρα Serial.println("-------------------" ); // Εξαγωγή δεδομένων στη σειριακή θύρα ) void loop() ( tmElements_t tm; if (RTC.read(tm)) ( Serial.print("Ok, Time = "); print2digits(tm.Hour); Serial.write (":"); print2digits (tm.Minute); Serial.write(":"); print2digits(tm.Second); Serial.print(", Date (D/M/Y) = "); Serial.print (tm.Day); Serial .write("/"); Serial.print(tm.Month); Serial.write("/"); Serial.print(tmYearToCalendar(tm.Year)); Serial.println() . (); ) else ( Serial .println("Σφάλμα ανάγνωσης DS1307! Ελέγξτε το κύκλωμα."); Serial.println(); ) delay(9000); ) delay(1000); ) void print2digits(int number) ( if (number >= 0 && number)< 10) { Serial.write("0"); } Serial.print(number); }

Κατεβάστε το σκίτσο

Φορτώνουμε αυτόν τον κωδικό στον ελεγκτή Arduino, ανοίγουμε το "Port Monitoring"

Αυτή η βιβλιοθήκη γράφτηκε για εύκολη διασύνδεση και χρήση της μονάδας DS1307 με Arduino ήchipKit χωρίς την ανάγκη της βιβλιοθήκης Wire.
Αυτή η βιβλιοθήκη χρησιμοποιεί τη γρήγορη λειτουργία (400 kHz) της διεπαφής υλικού I2C από προεπιλογή.
Αυτή η βιβλιοθήκη δεν είναι εγγυημένη ότι θα λειτουργεί όταν εργάζεστε ταυτόχρονα με τη βιβλιοθήκη Wire και μοιράζεστε επαφές.

Δομή:

Χρόνος;
Δομή διαχείρισης δεδομένων ώρας και ημερομηνίας.
Μεταβλητές:
ώρα, λεπτά, δευτερόλεπτα:Για τον προσδιορισμό των δεδομένων χρόνου
ημερομηνία, Δευτέρα, έτος:Για να ορίσετε δεδομένα ημερομηνίας
κάτω:Ημέρα της εβδομάδας από Δευτέρα
Παράδειγμα:Χρόνος t; // Ορίστε μια δομή με το όνομα t της κλάσης "time"

DS1307_RAM;
Buffer για χρήση σε συνδυασμό με ReadBuffer() και WriteBuffer().
Μεταβλητές:
Κύτταρο:Συστοιχία byte για αποθήκευση δεδομένων, με δυνατότητα ανάγνωσης ή εγγραφής στη μνήμη RAM του τσιπ.
Παράδειγμα: DS1307_RAM ramBuffer; //Δηλώστε ένα buffer για χρήση

Ορισμένα κυριολεκτικά:

Ημέρες της εβδομάδας

Χρησιμοποιείται σε συνδυασμό με το setDOW() και το Time.dow
ΔΕΥΤΕΡΑ: 1
ΤΡΙΤΗ: 2
ΤΕΤΑΡΤΗ: 3
ΠΕΜΠΤΗ: 4
ΠΑΡΑΣΚΕΥΗ: 5
ΣΑΒΒΑΤΟ: 6
ΚΥΡΙΑΚΗ: 7

Μήκος τίτλου
Χρησιμοποιείται σε συνδυασμό με τα getTimeStr(), getDateStr(), getDOWStr() και getMonthStr()
FORMAT_SHORT: 1 (πλήρης τίτλος)
FORMAT_LONG: 2 (συντομευμένο (3 γράμματα) όνομα)

Μορφή ημερομηνίας
Χρησιμοποιείται σε συνδυασμό με το getDateStr()
FORMAT_LITTLEENDIAN: 1 (ηη.μμ.εεεε)
FORMAT_BIGENDIAN: 2 (εεεε.μμ.ηη)
FORMAT_MIDDLEENDIAN: 3 (μμ.ηη.εεεε)

Συχνότητα εξόδου SQW

Χρησιμοποιείται σε συνδυασμό με το 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)

Λειτουργίες:

DS1307 (SDA, SCL);
Εκκίνηση της βιβλιοθήκης χρησιμοποιώντας τη διεπαφή I2C
Επιλογές:
SDA:Πείρο σύνδεσης για ακροδέκτη SDA DS1307 (Pin 5, δεδομένα)
SCL:Πείρος σύνδεσης για ακροδέκτη SCL DS1307 (ακίδα 6, χρονισμός)
Παράδειγμα: DS1307 rtc(SDA, SCL); // Εκκινήστε τη βιβλιοθήκη DS13071 χρησιμοποιώντας τη διεπαφή I2C
Σημείωση:Το DS1307 μπορεί να συνδεθεί σε οποιεσδήποτε δωρεάν ακίδες Arduino. Εάν το κύκλωμα χρησιμοποιεί ήδη το δίαυλο I2C και προσπαθείτε να συνδεθείτε στις ίδιες ακίδες, τότε αυτή η βιβλιοθήκη δεν θα λειτουργήσει, επειδή οποιοδήποτε πρωτόκολλο συμβατό με TWI απαιτεί αποκλειστική πρόσβαση σε pin.

αρχίζουν();
Αρχικοποίηση σύνδεσης στο DS1307
Επιλογές:Οχι
ΕΠΙΣΤΡΟΦΗ:Οχι

Παράδειγμα: rtc.begin(); //Εκκινήστε τη σύνδεση στο DS1307

getTime();
Διαβάστε τα τρέχοντα δεδομένα από το DS3231.
Επιλογές: Οχι
ΕΠΙΣΤΡΟΦΗ:Μορφή χρονοδομής
Παράδειγμα: t = rtc.getTime(); // Διαβάστε την τρέχουσα ημερομηνία και ώρα.


getTimeStr();
Διαβάστε την τρέχουσα ώρα ως μεταβλητή συμβολοσειράς.
Επιλογές:
μορφή:<необязательный параметр>
FORMAT_LONG "ΩΩ:ΛΛ:ΔΣ" (Προεπιλογή)
FORMAT_SHORT "ΩΩ:ΛΛ"
ΕΠΙΣΤΡΟΦΗ:Μια τιμή συμβολοσειράς που περιέχει την τρέχουσα ώρα, με ή χωρίς δευτερόλεπτα.
Παράδειγμα: Serial.print(rtc.getTimeStr()); // Αποστολή τρέχουσας ώρας μέσω σειριακής θύρας

getDateStr(]]);
Διαβάστε την τρέχουσα ημερομηνία ως μεταβλητή συμβολοσειράς.
Επιλογές:
slformat: <необязательный параметр>
FORMAT_LONG 4ψήφιο έτος (ΕΕΕΕ) (Προεπιλογή)
FORMAT_SHORTδιψήφιο έτος (YY)
μορφή: <необязательный параметр>
FORMAT_LITTLEENDIAN"ΗΗ.ΜΜ.ΕΕΕΕ" (Προεπιλογή)
FORMAT_BIGENDIAN"ΕΕΕΕ.ΜΜ.ΗΗ"
FORMAT_MIDDLEENDIAN"ΜΜ.ΗΗ.ΕΕΕΕ"
διαιρών: <необязательный параметр>
Σύμβολο για διαίρεση.Προκαθορισμένο "."
ΕΠΙΣΤΡΟΦΗ:Μια τιμή συμβολοσειράς που περιέχει την τρέχουσα ημερομηνία στην καθορισμένη μορφή.
Παράδειγμα: Serial.print(rtc.getDateStr()); // Αποστολή τρέχουσας ημερομηνίας μέσω σειριακής θύρας (σε μορφή "ΗΗ.ΜΜ.ΕΕΕΕ")

getDOWStr();
Διαβάστε την τρέχουσα ημέρα της εβδομάδας ως μεταβλητή συμβολοσειράς.
Επιλογές:
μορφή:<необязательный параметр>
FORMAT_LONGΗμέρα της εβδομάδας στα Αγγλικά (Προεπιλογή)
FORMAT_SHORTΣυντομευμένο όνομα της ημέρας της εβδομάδας στα Αγγλικά (3 χαρακτήρες)
ΕΠΙΣΤΡΟΦΗ:Μια τιμή συμβολοσειράς που περιέχει την τρέχουσα ημέρα της εβδομάδας σε πλήρη ή συντομευμένη μορφή.
Παράδειγμα: Serial.print(rtc.getDOWStr(FORMAT_SHORT)); // Στείλτε το συντομευμένο όνομα της τρέχουσας ημέρας της εβδομάδας μέσω της σειριακής θύρας

getMonthStr();
Διαβάστε τον τρέχοντα μήνα ως μεταβλητή συμβολοσειράς.
Επιλογές:
μορφή:<необязательный параметр>
FORMAT_LONGόνομα μήνα στα Αγγλικά (Προεπιλογή)
FORMAT_SHORTΣυντομευμένο όνομα μήνα στα Αγγλικά (3 χαρακτήρες)
ΕΠΙΣΤΡΟΦΗ:Μια τιμή συμβολοσειράς που περιέχει τον τρέχοντα μήνα σε πλήρη ή συντομευμένη μορφή.
Παράδειγμα: Serial.print(rtc.getMonthStr()); // Αποστολή ονόματος τρέχοντος μήνα μέσω σειριακής θύρας

getUnixTime(time);
Μετατρέπει τις τιμές ώρας και ημερομηνίας σε μορφή Unix Time.
Επιλογές:
Χρόνος:Μεταβλητή που περιέχει την ημερομηνία και την ώρα για μετατροπή
ΕΠΙΣΤΡΟΦΗ: Unix Time για την παρεχόμενη τιμή χρόνου
Παράδειγμα: Serial.print(rtc.getUnixTime(rtc.getTime())); // Αποστολή τρέχουσας τιμής Unixtime μέσω σειριακής θύρας
Σημείωση:Η ώρα UNIX ή η ώρα POSIX είναι ένα σύστημα για την περιγραφή στιγμών στο χρόνο, που υιοθετήθηκε στο UNIX και σε άλλα συμβατά με POSIX λειτουργικά συστήματα. Ορίζεται ως ο αριθμός των δευτερολέπτων που έχουν περάσει από τα μεσάνυχτα (00:00:00 UTC) 1 Ιανουαρίου 1970 (Πέμπτη). ο χρόνος από αυτή τη στιγμή ονομάζεται «εποχή UNIX» (Αγγλική Εποχή Unix).

setTime (ώρα, λεπτά, δευτερόλεπτα);
Ρύθμιση της ώρας.
Επιλογές:
ώρα:Ώρες (0-23)
min:Λεπτά (0-59)
sec:Δευτερόλεπτα (0-59)
Παράδειγμα: rtc.setTime(23, 59, 59); // Ρυθμίστε την ώρα σε 23:59:59

setDate(ημερομηνία, δευτ., έτος);
Ρύθμιση ημερομηνίας.
Επιλογές:
ημερομηνία:Ημέρα (1-31)
δευτ.:Μήνας (1-12)
έτος:Έτος (2000-2099)
Παράδειγμα: rtc.setDate(16, 5, 2016); // Ορίστε την ημερομηνία στις 16 Μαΐου 2016.
Σημείωση:Δεν υπάρχει προστασία από την εισαγωγή λανθασμένης ημερομηνίας. Δηλαδή, είναι δυνατόν να μπει 31 Φεβρουαρίου, αλλά το αποτέλεσμα δεν θα είναι προβλέψιμο

setDOW(down);
Ρύθμιση της ημέρας της εβδομάδας.
Επιλογές:
κάτω: <необязательный параметр>Ημέρα της εβδομάδας (1-7)
Εάν η παράμετρος δεν έχει καθοριστεί, η τιμή της παραμέτρου θα υπολογιστεί με βάση τα δεδομένα που είναι αποθηκευμένα αυτήν τη στιγμή στο DS3231.
Παράδειγμα: rtc.setDOW(ΠΑΡΑΣΚΕΥΗ); // Ορίστε την ημέρα της εβδομάδας - Παρασκευή
Σημείωση:Ορισμός από Δευτέρα (1) έως Κυριακή (7).

halt(value);
Ρυθμίστε ή επαναφέρετε τη σημαία έναρξης του ρολογιού.
Επιλογές:
αξία: αληθής:Ορισμός σημαία CH
ψευδής:Επαναφέρετε τη σημαία CH
ΕΠΙΣΤΡΟΦΗ:Οχι
Παράδειγμα: rtc.halt(false); // Ξεκινήστε τη λειτουργική μονάδα ρολογιού

setOutput(enable);
Ρύθμιση του ακροδέκτη SQW/OUT (ακίδα 7) του τσιπ DS1307 ψηλά ή χαμηλά.Αυτή η εντολή δεν έχει αποτέλεσμα εάν η enableSQW() είναι TRUE.
Επιλογές:
ενεργοποίηση: TRUE: Ρυθμίστε την καρφίτσα ψηλά
ΨΕΥΔΗΣ:Ρυθμίστε τον πείρο χαμηλά.
ΕΠΙΣΤΡΟΦΗ:Οχι
Παράδειγμα: rtc.setOutput(true); // Ρυθμίστε τον ακροδέκτη SQW/OUT ψηλά

enableSQW(enable);
Ενεργοποιεί ή απενεργοποιεί την έξοδο ορθογώνιων παλμών μιας δεδομένης συχνότητας στον ακροδέκτη SQW/OUT.
Επιλογές:
ενεργοποίηση: TRUE:Ενεργοποίηση τετραγωνικών παλμών στην καρφίτσα
ΨΕΥΔΗΣ:Απενεργοποιήστε την έξοδο τετραγωνικού κύματος
ΕΠΙΣΤΡΟΦΗ:Οχι
Παράδειγμα: rtc.enableSQW(true); // Χρησιμοποιήστε τον ακροδέκτη SQW/OUT ως γεννήτρια τετραγωνικών κυμάτων

setSQWRate(rate);
Ρύθμιση της συχνότητας των ορθογώνιων παλμών στον ακροδέκτη SQW.
Επιλογές:
ποσοστό: SQW_RATE_1- συχνότητα 1Hz
SQW_RATE_4K- συχνότητα 4,096 kHz
SQW_RATE_8K- συχνότητα 8,192 kHz
SQW_RATE_32K- συχνότητα 32,768 kHz
ΕΠΙΣΤΡΟΦΗ:Οχι
Παράδειγμα: rtc.setSQWRate(SQW_RATE_1); // Ρυθμίστε τη συχνότητα στον ακροδέκτη SQW στο 1Hz

writeBuffer(buffer);
Γράψτε δεδομένα από το buffer στη μνήμη RAM του τσιπ.
Επιλογές:
ρυθμιστής: DS1307_RAM buffer
ΕΠΙΣΤΡΟΦΗ:Οχι
Παράδειγμα: rtc.writebuffer(ramBuffer); // Γράψτε 56 byte από τη μεταβλητή ramBuffer στη μνήμη RAM του τσιπ

readBuffer();
Διαβάστε δεδομένα από τη μνήμη RAM του τσιπ σε ένα buffer.
Επιλογές:Οχι
ΕΠΙΣΤΡΟΦΗ: DS1307_RAM buffer
Παράδειγμα: ramBuffer=rtc.readBuffer(); // Διαβάστε και τα 56 byte από τη μνήμη RAM του τσιπ στη μεταβλητή ramBuffer

poke(διεύθυνση, αξία);
Γράψτε 1 byte στη μνήμη RAM του τσιπ
Επιλογές:
διεύθυνση:Διεύθυνση για εγγραφή byte (0-55)
αξία:Αξία για είσοδο ανά διεύθυνση

(0-255)
ΕΠΙΣΤΡΟΦΗ:Οχι
Παράδειγμα: rtc.poke(15, 160); // Γράψτε το 160 στη διεύθυνση 15

peek(διεύθυνση);
Διαβάστε 1 byte από τη μνήμη RAM του τσιπ
Επιλογές:
διεύθυνση: Διεύθυνση για ανάγνωση byte (0-55)
ΕΠΙΣΤΡΟΦΗ:Διαβάστηκε 1 byte δεδομένων από τη μνήμη RAM του τσιπ
Παράδειγμα: b=rtc.peek(18); // Διαβάστε 1 byte στη διεύθυνση 18 και γράψτε την τιμή στη μεταβλητή b

mob_info