Σύνδεση ds1307 με μικροελεγκτή avr. Σύνδεση του κυκλώματος DS1307 στον μικροελεγκτή μέσω διασύνδεσης TWI. Χειροκίνητα σε κώδικα

Το 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

Μάθημα 17

Μέρος 1

Ρολόι πραγματικού χρόνου DS1307

Συνεχίζουμε τα μαθήματα προγραμματισμού MK AVR.

Και σήμερα θα γνωρίσουμε ένα πολύ καλό μικροκύκλωμα DS1307. Αυτό το μικροκύκλωμα είναι Ρολόι πραγματικού χρόνου (Ρολόι πραγματικού χρόνουή RTC).

Επίσης, λόγω του γεγονότος ότι η επικοινωνία μεταξύ του μικροελεγκτή και αυτού του τσιπ θα πραγματοποιηθεί χρησιμοποιώντας τη διεπαφή I2C, θα ενισχύσουμε για άλλη μια φορά το θέμα του προγραμματισμού αυτού του διαύλου.

Αυτό το μικροκύκλωμα παρουσιάζεται από την εταιρεία Ντάλας, εδώ είναι το pinout και τα κύρια τεχνικά χαρακτηριστικά του

Εδώ βλέπουμε ότι έχουμε πόδια SDA και SCL, τον σκοπό των οποίων γνωρίζουμε πολύ καλά. Υπάρχουν επίσης ακροδέκτες X1 και X2 για σύνδεση συντονιστή χαλαζία στα 32768 Hz, ακροδέκτες ισχύος - VCC και GND, έξοδος για παλμούς διάρκειας 1 δευτερολέπτου ή άλλη συχνότητα ανάλογα με τις ρυθμίσεις ορισμένων καταχωρητών, καθώς και θετική επαφή για μπαταρία που είναι συνδεδεμένο για να κρατά το ρολόι να χτυπά όταν η κύρια τροφοδοσία είναι απενεργοποιημένη. Συνδέουμε την αρνητική επαφή αυτής της μπαταρίας στο κοινό καλώδιο τροφοδοσίας.

Βλέπουμε επίσης ότι αυτό το τσιπ είναι διαθέσιμο σε επίπεδα και πακέτα DIP.

Αυτό το μικροκύκλωμα μπορεί να τροφοδοτηθεί είτε από 3 βολτ είτε από 5 βολτ.

Η πρόσβαση σε αυτό το μικροκύκλωμα μέσω της διεπαφής I2C γίνεται, κατ' αρχήν, με τον ίδιο τρόπο. ακριβώς όπως το τσιπ μνήμης που χρησιμοποιήσαμε στο τελευταίο μάθημα. Φυσικά, θα υπάρξουν κάποιες αποχρώσεις, αλλά περισσότερα για αυτό αργότερα.

Εφόσον έχω εγκαταστήσει αυτό το τσιπ στην ίδια μονάδα στην οποία είναι εγκατεστημένο το τσιπ EEPROM και έχουμε έναν δίαυλο ανταλλαγής, τότε το τσιπ DS1307 θα «αναγνωρίσει» ότι απευθύνεται, φυσικά, στη διεύθυνση που είναι διαφορετική από αυτό του τσιπ EEPROM.

Ακολουθούν διαγράμματα του μικροκυκλώματος λήψης και μετάδοσης δεδομένων

Η διεύθυνση στην οποία θα έχουμε πρόσβαση σε αυτό το τσιπ επισημαίνεται με μπλε χρώμα.

Βασικα. Δεν βλέπουμε μεγάλη διαφορά με τα διαγράμματα του τσιπ EEPROM.

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

Αυτά είναι αυτά τα μητρώα

Σκοπός αυτών των μητρώων:

00h- δευτερόλεπτα. Τα δευτερόλεπτα αποθηκεύονται σε δυαδική δεκαδική μορφή. Δηλαδή, τα χαμηλότερα 4 bit αποθηκεύουν μονάδες δευτερολέπτων και τα μεγαλύτερα τρία bit αποθηκεύουν δεκάδες. Υπάρχει επίσης ένα bit SH - αυτό είναι το bit έναρξης του τσιπ.

01 ώρα- λεπτά. Αποθηκεύεται ομοίως.

02h- ένα πιο καθολικό μητρώο. Εδώ φυλάσσεται το ρολόι. Στα τέσσερα λιγότερο σημαντικά bit υπάρχουν μονάδες, στα επόμενα δύο υψηλότερα υπάρχουν δεκάδες, στο επόμενο 6ο bit υπάρχει μια σημαία για το αν είναι απόγευμα ή πριν από το μεσημέρι, στο 7ο bit υπάρχει μια λειτουργία αποθήκευσης - 12 ώρες ή 24ωρη.

03:00- ημέρα της εβδομάδας. Αποθηκευμένα στα λιγότερο σημαντικά 3 bit, τα υπόλοιπα bit δεν χρησιμοποιούνται.

04h— η ημέρα του μήνα αποθηκεύεται εδώ, επίσης σε δυαδική δεκαδική μορφή. Τα τέσσερα λιγότερο σημαντικά bit περιέχουν ένα, τα επόμενα δύο υψηλότερα περιέχουν δεκάδες, τα υπόλοιπα bit δεν χρησιμοποιούνται.

05h- ο αριθμός του μήνα του έτους - αποθηκεύεται σε δυαδική δεκαδική μορφή με τον ίδιο τρόπο όπως το ρολόι.

06h- αριθμός έτους και όχι πλήρες τετραψήφιο, αλλά μόνο διψήφιο. Τα λιγότερο σημαντικά τέσσερα bit είναι ένα και τα υψηλότερα τέσσερα bit είναι δεκάδες.

Θα χρησιμοποιήσουμε αυτούς τους επτά καταχωρητές. Ο τελευταίος καταχωρητής έχει σχεδιαστεί για να διαμορφώνει τη συχνότητα παλμού στην έξοδο παλμού του μικροκυκλώματος· αυτό γίνεται στα δύο κατώτερα bit του καταχωρητή. από προεπιλογή θα είναι συχνότητα 1 Hz, αυτό αρκεί για να αναβοσβήνουμε την άνω και κάτω τελεία, επομένως δεν θα χρησιμοποιήσουμε αυτά τα bit. Τα bit SOWE και OUT χρησιμοποιούνται επίσης για τη διαμόρφωση και την ενεργοποίηση του τετραγωνικού κυματομορφητή.

Ένα έργο για εργασία με αυτό το τσιπ δημιουργήθηκε με τον συνηθισμένο τρόπο με το όνομα MyClock1307, τα αρχεία που σχετίζονται με το EEPROM αφαιρέθηκαν από εκεί και προστέθηκαν αρχεία RTC.cΚαι RTC.h.

#ifndefMAIN_H_

#καθορίζωMAIN_H_

#καθορίζωF_CPU8000000 UL

#περιλαμβάνω

#περιλαμβάνω

#περιλαμβάνω

#περιλαμβάνω

#περιλαμβάνω

#περιλαμβάνω"usart.h"

#περιλαμβάνω"twi.h"

#περιλαμβάνω"RTC.h"

#τέλος εαν/* MAIN_H_ */

Στο κύριο αρχείο MyClock1307.cας δημιουργήσουμε καθολικές μεταβλητές για να αποθηκεύσουμε την ώρα, την ημερομηνία και την ημέρα της εβδομάδας και μετά το πλήρες περιεχόμενο αφού αφαιρέσουμε όλα τα περιττά πράγματα σε αυτό θα είναι έτσι

#περιλαμβάνω"main.h"

ανυπόγραφοαπανθρακώνωδευτ, ελάχ, ώρα, ημέρα, ημερομηνία, μήνας, έτος;

ενθκύριος( κενός)

I2C_Init();

USART_Init(8);

Ενώ(1)

Το μόνο που μένει από τον προηγούμενο κώδικα είναι η προετοιμασία του I2C και του USART.

Τώρα πρέπει να ξεκινήσουμε με κάποιο τρόπο το τσιπ. Εάν το μικροκύκλωμα είναι καινούργιο ή δεν έχει χρησιμοποιηθεί ποτέ ή κάποιος έχει αλλάξει την τιμή του bit CH ειδικά για κάποιο σκοπό, τότε δεν «λειτουργεί» ακόμα.

Λοιπόν, γενικά, μόλις ρυθμίσουμε όλες τις τιμές στους καταχωρητές του μικροκυκλώματος, θα ξεκινήσει και το ρολόι μας θα ξεκινήσει.

Η σύνδεση ή το κύκλωμα χρησιμοποιείται και από το προηγούμενο μάθημα, δηλαδή θα δούμε την ώρα μέσω του διαύλου USART στο πρόγραμμα τερματικού.

Επομένως, μάλιστα, χρησιμοποιώντας τις γνώσεις μας από το προηγούμενο μάθημα, θα γράψουμε για να γράψουμε μια συνάρτηση ρύθμισης της ώρας.

Πρώτα απ 'όλα, θα περάσουμε φυσικά την προϋπόθεση START

//Ρυθμίστε την ώρα

I2C_StartCondition();

Στη συνέχεια μεταδίδουμε τη διεύθυνση με το bit εγγραφής 0

I2C_StartCondition();

I2C_SendByte(0b11010000);

Ας πάμε στη διεύθυνση 0, που σημαίνει στο τμήμα της μνήμης όπου βρίσκεται ο πρώτος καταχωρητής

I2C_SendByte(0b11010000);

I2C_SendByte(0); //Μετάβαση στο 0x00

Πριν γράψουμε οποιεσδήποτε τιμές στους καταχωρητές του μικροκυκλώματος, θυμόμαστε ότι πρέπει πρώτα να μετατρέψουμε τους αριθμούς σε μορφή BCD, η οποία θα είναι βολική για τους καταχωρητές. Για να το κάνουμε αυτό, θα πάμε στο αρχείο RTC.c και θα γράψουμε μια τέτοια συνάρτηση. Θα είναι πολύ εύκολο και δεν χρειάζεται καμία εξήγηση.

ανυπόγραφοαπανθρακώνωRTC_ConvertFromBinDec( ανυπόγραφοαπανθρακώνωντο)

{

ανυπόγραφοαπανθρακώνωκεφ= (( ντο/10)<<4)|( ντο%10);

ΕΠΙΣΤΡΟΦΗκεφ;

}

Λοιπόν, ας γράψουμε επίσης μια συνάρτηση αντίστροφου τύπου, μετατρέποντας έναν αριθμό από δυαδική-δεκαδική μορφή σε δεκαδικό. Με τη βοήθειά του, αντίθετα, θα μετατρέψουμε τις αναγνώσεις του χρόνου ανάγνωσης σε μια μορφή κατάλληλη για την αντίληψή μας (HRI - αναγνώσιμη από τον άνθρωπο διεπαφή)

ανυπόγραφοαπανθρακώνωRTC_ConvertFromDec( ανυπόγραφοαπανθρακώνωντο)

{

ανυπόγραφοαπανθρακώνωκεφ= (( ντο>>4)*10+(0b00001111&ντο));

ΕΠΙΣΤΡΟΦΗκεφ;

}

Και εδώ όλα είναι πολύ ξεκάθαρα, μετατοπίζουμε το υψηλό τετράδιο του byte προς τα δεξιά, το πολλαπλασιάζουμε επί δέκα και προσθέτουμε το χαμηλό τετράδιο (καλύπτουμε το υψηλό τετράδιο με μηδενικά)

Ας γράψουμε πρωτότυπα αυτών των συναρτήσεων στο αρχείο RTC.c

#περιλαμβάνω"main.h"

ανυπόγραφοαπανθρακώνωRTC_ConvertFromDec( ανυπόγραφοαπανθρακώνωντο); //μετατροπή αριθμού BCD σε δεκαδικό

ανυπόγραφοαπανθρακώνωRTC_ConvertFromBinDec( ανυπόγραφοαπανθρακώνωντο);

Μπορείτε να αγοράσετε τον προγραμματιστή, μονάδα RTC DS1307 με τσιπ μνήμης και προσαρμογέα USB-TTL εδώ:

Προγραμματιστής (αξιόπιστος πωλητής) USBASP USBISP 2.0

Δείτε VIDEO TUTORIAL (κάντε κλικ στην εικόνα)

Προβολές ανάρτησης: 7.354

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

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

  • Πολύ χαμηλή κατανάλωση ενέργειας. Ο κατασκευαστής υπόσχεται 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 δευτερόλεπτα πίσω. Κάτι μου λέει ότι το πρόβλημα είναι στην ικανότητα του χαλαζία, θα δοκιμάσω ένα άλλο και θα αναφέρω.

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

Ενημερώθηκε 23/07/2018.Γεια σε όλους. Για να δουλέψουμε με ρολόγια, στο τελευταίο άρθρο συζητήσαμε τη διεπαφή TWI, στην οποία θα αναφερθούμε σήμερα. Λοιπόν ας ξεκινήσουμε. Αυτό το ρολόι είναι συμβατό με TWI, δηλ. η αρχή της ανταλλαγής δεδομένων στο λεωφορείο θα είναι η ίδια που εξετάσαμε.

Το παρακάτω σχήμα δείχνει τη θέση των ακίδων, την περιγραφή και την ίδια την εμφάνιση του ρολογιού μας, ή όπως θα το ονομάσουμε αργότερα RTC (Ρολόι πραγματικού χρόνου) - ένα ρολόι πραγματικού χρόνου ή μια γεννήτρια παλμών χρόνου. Αυτή η συσκευή" DS1307 Μετρά δευτερόλεπτα, λεπτά, ώρες, ημέρα του μήνα, μήνα, ημέρα της εβδομάδας και έτος συμπεριλαμβανομένων των δίσεκτων ετών. Το ημερολόγιο ισχύει μέχρι το 2100. Νομίζω ότι θα είναι αρκετό για τη ζωή μας :).

Όπως φαίνεται από την περιγραφή, υπάρχει μια είσοδος για τροφοδοσία μπαταρίας έκτακτης ανάγκης όταν η εξωτερική τροφοδοσία είναι απενεργοποιημένη. Σε αυτήν τη λειτουργία, το RTC υποστηρίζει μόνο τον κύριο σκοπό του - τον χρονισμό, χωρίς εξωτερικά αιτήματα. Η τάση τροφοδοσίας της μπαταρίας πρέπει να είναι 2 – 3,5 V. Η τεχνική περιγραφή αναφέρει ότι με φόρτιση άνω των 48 mAh, σε θερμοκρασία 25 βαθμών Κελσίου, το κύκλωμά μας θα διαρκέσει περίπου 10 χρόνια. Περισσότερο από το απαραίτητο. Το παρακάτω σχήμα δείχνει το «tablet» CR2032 και τη βάση που θα χρησιμοποιήσουμε.

Τώρα ας πάμε στο εξωτερικό τροφοδοτικό. Η τάση λειτουργίας του ρολογιού είναι 5V με μικρό εύρος 4,5 -5,5V. Τάση μπαταρίας 3V (ελάχιστο 2, μέγιστο 3,5 V) Η λειτουργία RTC χωρίζεται σε τρεις λειτουργίες τάσης:

1. Vcc=5V – ανάγνωση, εγγραφή, μέτρηση;
2. Vcc= κάτω από 1,25*Vbat, αλλά πάνω από Vbat +0,2V - μόνο η μπαταρία μετράει από εξωτερική τροφοδοσία.
3. Vcc κάτω από το Vbat: Το RTC και η RAM αλλάζουν σε τροφοδοσία μπαταρίας. Η κατανάλωση στην ενεργή κατάσταση είναι 1,5 mA, από την μπαταρία 500-800 nA.
Τάση για μετάδοση/λήψη πληροφοριών:
Λογική 0: -0,5V - +0,8V
Λογική 1: 2,2 V – Vcc+0,3V

Όπως σε προηγούμενες αναρτήσεις, θα προσπαθήσουμε να το εκτελέσουμε στο Proteus. Ας διορθώσουμε τον κώδικα. Και θα μεταφέρουμε τα πάντα στο υλικό. Παρακάτω είναι το διάγραμμα σύνδεσης.

Όπου SQW/OUT είναι μια έξοδος ρολογιού που μπορεί να προγραμματιστεί ώστε να εξάγει συχνότητες 1Hz, 4,096Hz, 8,192Hz και 32,768Hz. Εκείνοι. μπορεί να χρησιμοποιηθεί για εξωτερική διακοπή του ελεγκτή με συχνότητα 1 δευτερολέπτου. Ένα πολύ χρήσιμο χαρακτηριστικό. Αλλά δεν θα το χρειαστούμε. Παρεμπιπτόντως, είναι επίσης ένας ανοιχτός συλλέκτης, επομένως χρειάζεται μια αντίσταση έλξης. Ονομαστική 4,7 kOhm.

Καρφίτσες X1 και X2 – συνδέουμε σε αυτούς συντονιστή χαλαζία με συχνότητα 32,768 kHz. Ή μπορείτε να χρησιμοποιήσετε μια εξωτερική γεννήτρια ρολογιού με την ίδια συχνότητα. Αλλά σε αυτήν την περίπτωση, η ακίδα X1 συνδέεται με το σήμα και η X2 παραμένει ασύνδετη (κρέμεται στον αέρα.).

Λοιπόν, τα συμπεράσματα του SDA και του SCL, τα οποία γνωρίσαμε στο τελευταίο άρθρο.

Ας σταθούμε λίγο στο αντηχείο (εικόνα παρακάτω). Το οποίο μπορεί να ονομαστεί η καρδιά του ρολογιού και από το οποίο εξαρτάται η ακρίβεια της κίνησης. Η ποιότητα του ίδιου του αντηχείου εξαρτάται από τη συνείδηση ​​του κατασκευαστή, αλλά από την πλευρά μας, μπορούμε να μειώσουμε το σφάλμα που εισάγεται από εξωτερικούς παράγοντες εάν τηρήσουμε τις ακόλουθες συστάσεις για την τοποθέτηση του αντηχείου:

2. Το πλάτος της διαδρομής θα πρέπει επίσης να γίνει μικρότερο, εάν είναι δυνατόν, για να μειωθεί η πιθανότητα λήψης παρεμβολών από άλλες πηγές.

3. Θα πρέπει να τοποθετηθεί ένα κύκλωμα σε σχήμα δακτυλίου γύρω από τον κρύσταλλο, το οποίο βοηθά στην απομόνωση του κρυστάλλου από το θόρυβο.

4. Τοποθετήστε τους αγωγούς σε ένα δακτύλιο και συνδέστε τους στη γείωση.

5. Συγκολλήστε το αντηχείο στο έδαφος. Αν το οικόπεδο είναι σωστά διαρρυθμισμένο και υπάρχει εμπιστοσύνη.

Το παρακάτω σχήμα δείχνει το περίγραμμα και τη θέση του γρήγορου πάγου στο έδαφος.

Καταλάβαμε πώς να συνδεθούμε. Ας πάμε παρακάτω και ας καταλάβουμε πώς να δουλέψουμε με αυτό. Το RTC είναι προγραμματιζόμενο και διαθέτει 8 byte ειδικών καταχωρητών για τη διαμόρφωσή του και 56 byte μη πτητική στατική μνήμη. Για την ανταλλαγή πληροφοριών απαιτείται ένας δίαυλος δεδομένων 2 καλωδίων, π.χ. σειριακό δίαυλο δεδομένων - το οποίο συζητήσαμε στο τελευταίο άρθρο. Για να ξεκινήσετε, ας περάσουμε από το φύλλο δεδομένων. Αυτό που χρειαζόμαστε:

Πίνακας εγγραφής. Εικόνα παρακάτω. Οι πρώτοι οκτώ καταχωρητές είναι για την έξοδο και τον προγραμματισμό του ρολογιού μας. Όταν έχουμε πρόσβαση στο 7ο bit (CH) στη διεύθυνση 00H και το θέσουμε στο 0, ξεκινάμε το ρολόι. Θα ήθελα να σημειώσω ότι η διαμόρφωση των μητρώων μπορεί να είναι οποιαδήποτε, επομένως όταν την ξεκινήσετε για πρώτη φορά πρέπει να τη διαμορφώσετε σύμφωνα με τις απαιτήσεις σας. Τα υπόλοιπα επτά bit είναι ένα και δεκάδες δευτερόλεπτα.

01H – Λεπτά.
02H – Ρολόι που μπορεί να ρυθμιστεί:
— Bit 6 – με 1 έξοδο 12ωρη μορφή, 0 – 24.
— Bit 5 – στη 1 (με μορφή 12 ωρών) PM, 0-AM
— Bit 5 – (σε μορφή 24 ωρών) αυτή είναι η έξοδος του δεύτερου δεκαώρου (20-23 ώρες)
— Το bit4 είναι οι πρώτες δέκα ώρες, τα υπόλοιπα bit είναι μονάδες ωρών.
03H – ημέρα της εβδομάδας.
04H – ημερομηνία;
05H – μήνας του έτους
06H – έτος.

Λοιπόν, η τελευταία εγγραφή είναι 07H. Αυτός ο καταχωρητής είναι ο καταχωρητής ελέγχου.Όπου το OUT είναι υπεύθυνο για τον έλεγχο του ακροδέκτη SQW/OUT. Παρακάτω είναι ο πίνακας ενεργοποίησης εξόδου.

ΕΞΩ
SQWE
SQW/OUT
1
0
1
0
0
0

SQWE - όταν αυτό το bit έχει ρυθμιστεί στο 1, παλμοί με μια δεδομένη συχνότητα εξάγονται στις εξόδους, η οποία ορίζεται από τα bit RS1 και RS0.

Αυτό το συμπέρασμα δεν θα μας φανεί χρήσιμο στο έργο. Αν και έβαλα ένα κομμάτι για αυτό στο σανίδι. Ως πείραμα, μπορεί να εφαρμοστεί κάπου στο μέλλον, γιατί εδώ μπορείτε να κάνετε μια διακοπή 1 δευτερολέπτου.

Τώρα που έχουμε όλες τις απαραίτητες πληροφορίες, ας γράψουμε συναρτήσεις για να δουλέψουμε με το ρολόι. Θα ξεκινήσουμε επίσης το έργο σε Πρωτεύς . Το οποίο θα μοιάζει με αυτό:

Σημειώστε ότι το αντηχείο στο Proteus δεν χρειάζεται να συνδεθεί με το ρολόι (με κόκκινο κύκλο).

Το σχήμα δείχνει ένα τερματικό ρολογιού που εμφανίζει την ώρα, η οποία με τη σειρά της συνδέεται με την ώρα του συστήματος. Τερματικό εντοπισμού σφαλμάτων πρωτοκόλλου I2C ή TWI, το οποίο εμφανίζει την ώρα αποστολής και λήψης σήματος, όπου D0 είναι η μεταδιδόμενη εντολή, D1 είναι η λαμβανόμενη. Παρακάτω θα εμφανίσω στιγμιότυπα οθόνης του τερματικού με το αποτέλεσμα του προγράμματος.

Πρόγραμμα. Έχοντας εξετάσει τις βασικές ρυθμίσεις ρολογιού, θα γράψουμε μια συνάρτηση αρχικοποίησης.

/*Η συνάρτηση αρχικοποίησης περιλαμβάνει τη ρύθμιση της τιμής ανταλλαγής δεδομένων χρησιμοποιώντας τον τύπο (στο προηγούμενο άρθρο), τη ρύθμιση του prescaler και την ενεργοποίηση της μονάδας TWI*/
void init_DS1307 (άκυρο)
{
TWBR = 2; /*Σε συχνότητα 1 MHz */
TWSR = (0<< TWPS1)|(0 << TWPS0); /*Predivisor by 64*/
TWCR |= (1<< TWEN); /*Ενεργοποίηση μονάδας TWI*/
}

void write_DS1307 (uint8_t reg, uint8_t time)/*περνάμε δύο παραμέτρους: τη διεύθυνση του μητρώου στο οποίο θα έχουμε πρόσβαση και τις μεταδιδόμενες πληροφορίες*/
{
/* Σχηματίστε την κατάσταση START ορίζοντας τα bit του καταχωρητή ελέγχου */
TWCR = (1<
/*Επιτρέψτε στη λειτουργική μονάδα TWEN. Δημιουργία κατάστασης έναρξης TWSTA. Επαναφέρετε τη σημαία TWINT */
/*Περιμένουμε να ολοκληρωθεί η διαμόρφωση της συνθήκης έναρξης, π.χ. μέχρι να οριστεί η σημαία, κωδικός κατάστασης = 08*/
ενώ (!(TWCR & (1<
/*Στη συνέχεια στέλνουμε το πακέτο διευθύνσεων (διεύθυνση συσκευής). Τα περιεχόμενα του πακέτου φορτώνονται στον καταχωρητή TWDR*/
TWDR = 0xd0; /*0b1101000 + 0 – διεύθυνση + bit εγγραφής*/
/*Επαναφορά της σημαίας για μετάδοση πληροφοριών*/
TWCR = (1<
/*Αναμονή για να οριστεί η σημαία*/
ενώ (!(TWCR & (1<
/* περάστε το μητρώο στο οποίο θα έχουμε πρόσβαση*/
TWDR = reg;
TWCR = (1<
ενώ (!(TWCR & (1<
/*Περάστε πληροφορίες για εγγραφή σε byte καταχωρητή*/
TWDR = χρόνος;
TWCR = (1<
ενώ (!(TWCR & (1<
/*διαμορφώστε την κατάσταση STOP*/
TWCR = (1<
}

Σε αυτή τη συνάρτηση, περάσαμε τρία byte, τη διεύθυνση συσκευής, τη διεύθυνση μητρώου και ένα byte πληροφοριών για εγγραφή σε αυτόν τον καταχωρητή και δημιουργήσαμε την κατάσταση STOP.

Η τελευταία λειτουργία ανάγνωσης παραμένει. Παρακάτω είναι η μορφή ανάγνωσης.

Αυτή η λειτουργία εκτελεί τη μεταφορά της διεύθυνσης byte + bit εγγραφής, το byte της διεύθυνσης καταχωρητή για να ορίσετε έναν δείκτη σε αυτήν, την εκπλήρωση της συνθήκης POVSTAR, τη μεταφορά της διεύθυνσης byte + bit ανάγνωσης, την ανάγνωση του καταχωρητή του οποίου η διεύθυνση μεταφέραμε νωρίτερα.

Εάν έχουμε πρόσβαση στο ρολόι σε μορφή ανάγνωσης, τότε όταν έχουμε ξανά πρόσβαση στο ρολόι, ο δείκτης μετακινείται προς τα κάτω κατά ένα byte, συμπεριλαμβανομένων 56 byte μνήμης RAM, από 00H σε 3FH. Όταν επιτευχθεί η τελευταία διεύθυνση, ο δείκτης μετακινείται στη διεύθυνση 00.

/*Λειτουργία για ανάγνωση δεδομένων από DS1307*/
uint8_t read_DS1307 (uint8_t reg)/*Περάστε τη διεύθυνση μητρώου*/
{
uint8_t χρόνος;
/*διαμορφώστε την κατάσταση START*/
TWCR = (1<
ενώ (!(TWCR & (1<
TWDR = 0xd0; /*Διεύθυνση μεταφοράς + bit εγγραφής*/
TWCR = (1<
ενώ (!(TWCR & (1<
TWDR = reg; /*Διεύθυνση εγγραφής*/
TWCR = (1<
ενώ (!(TWCR & (1<
/* σχηματίζουν την κατάσταση POVSTAR*/
TWCR = (1<
ενώ (!(TWCR & (1<
TWDR = 0xd1; /*Διεύθυνση μεταφοράς + bit ανάγνωσης*/
TWCR = (1<
ενώ (!(TWCR & (1<
/*ανάγνωση δεδομένων*/
TWCR = (1<
ενώ (!(TWCR & (1<
χρόνος = TWDR;
χρόνος = (((χρόνος & 0xF0) >> 4)*10)+(χρόνος & 0x0F);
/*διαμορφώστε την κατάσταση STOP*/
TWCR = (1<
χρόνος επιστροφής?
}

Έτσι παραπάνω γράψαμε τρεις συναρτήσεις που πρέπει να δουλέψουμε με το ρολόι. Χρησιμοποιώντας αυτές τις λειτουργίες θα τρέξουμε το πρόγραμμα στο Proteus. Ας εμφανίσουμε, για παράδειγμα, την ημερομηνία.

#περιλαμβάνω
#περιλαμβάνω
uint8_t χρόνος;
void init_DS1307 (void);
uint8_t read_DS1307 (uint8_t reg);
void write_DS1307 (uint8_t reg, uint8_t time);
int main (κενό)
{
DDRC = 0×00; /*Ορίστε τη θύρα ως είσοδο*/
PORTC = 0xFF; /*Σφίξτε την αντίσταση*/
init_DS1307;
ενώ (1)
{
_delay_ms(50);
read_DS1307 (0×04); /*Εγγραφή ημερομηνίας ανάγνωσης*/
}
}

Παρακάτω είναι το αποτέλεσμα της εκτέλεσης του προγράμματος για την ανάγνωση της ημερομηνίας.

Στο παράθυρο του προγράμματος εντοπισμού σφαλμάτων I2C ( TWI ) φαίνεται ότι πρώτα η διεύθυνση μητρώου αποστέλλεται στο RTC (πράσινος κύκλος), σε αυτήν την περίπτωση το 04, το οποίο είναι υπεύθυνο για την ημερομηνία του μήνα, και μετά το ρολόι μεταδίδει την απάντηση 21 (κόκκινος κύκλος).

Όταν ξεκινάμε το ρολόι στο σίδερο, θα χρειαστεί να εισαγάγουμε τον παρόντα χρόνο. Παρακάτω είναι ένα παράδειγμα προγράμματος για αλλαγή λεπτών.

ενώ (1)
{
_delay_ms(500);
read_DS1307(0×01); /*Διαβάστε το λεπτό*/
_delay_ms(500);
write_DS1307(0×01, 15); /*Γράψε το απαιτούμενο λεπτό*/
_delay_ms(500);
read_DS1307(0×01); /*Διαβάστε το λεπτό*/
}

Το σχήμα δείχνει ότι γίνεται πρόσβαση στον πρώτο καταχωρητή 01, διαβάζεται το λεπτό 23. Στη συνέχεια, χρησιμοποιούμε τη συνάρτηση εγγραφής και εισάγουμε την τιμή 15. Με την επόμενη συνάρτηση ανάγνωσης, έχουμε την τιμή 15 στην οθόνη του ρολογιού.

Λοιπόν, το τελευταίο παράδειγμα του προγράμματος είναι η έξοδος των τιμών όλων των καταχωρητών

ενώ (1)
{
καθυστέρηση_ms(500);
read_DS1307(0×00);
_delay_ms(500);
read_DS1307(0×01);
_delay_ms(500);
read_DS1307 (0×02);
_delay_ms(500);
read_DS1307 (0×03);
_delay_ms(500);
read_DS1307 (0×04);
_delay_ms(500);
read_DS1307 (0×05);
_delay_ms(500);
read_DS1307 (0×06);
_delay_ms(500);
}

Το παρακάτω σχήμα δείχνει ότι εμφανίστηκαν τα δεδομένα 7 καταχωρητών.

Ο πηγαίος κώδικας για το έργο επισυνάπτεται:

(Λήψεις: 601 άτομα)

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

Υπολογισμός πραγματικού χρόνου σε δευτερόλεπτα, λεπτά, ώρες, ημερομηνίες του μήνα, μήνες, ημέρες της εβδομάδας και έτη, λαμβάνοντας υπόψη το υψηλότερο επίπεδο του τρέχοντος έτους έως το 2100.

56 byte μη πτητική μνήμη RAM για αποθήκευση δεδομένων

Σειριακή διεπαφή 2 καλωδίων

Προγραμματιζόμενη τετράγωνη γεννήτρια παλμών. Μπορεί να εξάγει 1 Hz, 4,096 kHz, 8,192 kHz και 32,768 kHz.

Αυτόματη ανίχνευση διακοπής λειτουργίας της κύριας πηγής ρεύματος και σύνδεση της εφεδρικής

24ωρη και 12ωρη λειτουργία

Κατανάλωση όχι μεγαλύτερη από 500 nA όταν τροφοδοτείται από εφεδρική μπαταρία σε θερμοκρασία 25C°

Το μικροκύκλωμα διατίθεται σε πακέτα DIP και SOIC με οκτώ ακίδες. Το pinout είναι το ίδιο για όλους. Παρακάτω θα παράσχω γραμμές από το φύλλο δεδομένων για να συμπληρώσω την εικόνα.

Τεκμηρίωση για το τσιπ (φύλλο δεδομένων)

Ανάθεση καρφίτσας:

. Χ1, Χ2- Χρησιμεύει για τη σύνδεση αντηχείου χαλαζία 32,768 kHz

. Vbat- Είσοδος για οποιαδήποτε τυπική μπαταρία λιθίου τριών βολτ ή άλλη πηγή ενέργειας. Για την κανονική λειτουργία του DS1307, η τάση της μπαταρίας πρέπει να είναι στην περιοχή των 2,0 ... 3,5 V. Μια μπαταρία λιθίου με χωρητικότητα 48 mAh ή μεγαλύτερη θα υποστηρίζει το DS1307 ελλείψει ρεύματος
για περισσότερα από 10 χρόνια σε θερμοκρασία 25°C.

. GND- γενικό μείον

. Vcc- Αυτή είναι μια είσοδος +5 V. Όταν η τάση τροφοδοσίας είναι πάνω από 1,25 * VBAT, η συσκευή είναι πλήρως ενεργοποιημένη και τα δεδομένα μπορούν να διαβαστούν και να εγγραφούν. Όταν μια μπαταρία 3V είναι συνδεδεμένη στη συσκευή και το Vcc είναι χαμηλότερο από 1,25 * VBAT, η ανάγνωση και η εγγραφή απαγορεύονται, αλλά η λειτουργία χρονισμού συνεχίζει να λειτουργεί. Μόλις το Vcc πέσει κάτω από το VBAT, η RAM και το RTC μεταβαίνουν σε VBAT με ισχύ μπαταρίας.

. SQW/OUT- Σήμα εξόδου με ορθογώνιους παλμούς.

. SCL- (Είσοδος σειριακού ρολογιού - είσοδος σειριακού ρολογιού) - χρησιμοποιείται για το συγχρονισμό δεδομένων μέσω της σειριακής διεπαφής.

. Σ.Δ.Α.- (Serial Data Input/Output) - pin εισόδου/εξόδου για σειριακή διεπαφή δύο συρμάτων.

Εργασία με SQW/OUT Pin.

Αρχικά, ας δούμε τη δομή του μητρώου του DS1307.

Καταχωρήστε τη δομή του τσιπ DS1307

Μας ενδιαφέρει το «Μητρώο ελέγχου» που βρίσκεται στη διεύθυνση 0x7, γιατί καθορίζει τη λειτουργία του ακροδέκτη SQW/OUT.

Εάν το SQWE bit = 1, τότε αρχίζει ο σχηματισμός ορθογώνιων παλμών, εάν SQWE = 0, τότε η έξοδος της εξόδου θα είναι η τιμή του bit OUT.

Τα bit RS0 και RS1 είναι υπεύθυνα για τη συχνότητα παλμού, και συγκεκριμένα:

RS0 RS1 Συχνότητα
0 0 1 Hz
0 1 4,096 kHz
1 0 8,192 kHz
1 1 32.768 kHz

Εδώ είναι ένα παράδειγμα:

Εάν πρέπει να αρχίσουμε να παράγουμε ορθογώνιους παλμούς με συχνότητα 1 Hz, τότε πρέπει να στείλουμε byte 00010000 ή 0x10 στο δεκαεξαδικό σύστημα αριθμών στον καταχωρητή 0x7 του μικροκυκλώματος, που έχει τη διεύθυνση 0x68.

Χρησιμοποιώντας τη βιβλιοθήκη Σύρμα.χ, αυτό μπορεί να γίνει ως εξής:

Wire.beginTransmission(0x68); Wire.write(0x7); Wire.write(0x10); Wire.endTransmission();

Σύνδεση με το Arduino:

Οι ακίδες που είναι υπεύθυνες για τη διεπαφή I2C σε πλακέτες Arduino που βασίζονται σε διαφορετικούς ελεγκτές ποικίλλουν.

Απαιτούμενες βιβλιοθήκες:

για εργασία με DS1307: http://www.pjrc.com/teensy/td_libs_DS1307RTC.html
για εργασία με το χρόνο: http://www.pjrc.com/teensy/td_libs_Time.html

Ρύθμιση της ώρας

. Χειροκίνητα σε κώδικα

Η ώρα ρυθμίζεται χειροκίνητα στον κώδικα προγράμματος και μεταφορτώνεται στην πλακέτα Arduino. Αυτή η μέθοδος δεν είναι η πιο ακριβής γιατί Οι χρόνοι μεταγλώττισης και φόρτωσης ενδέχεται να διαφέρουν.

Δείγμα κώδικα

#περιλαμβάνω #περιλαμβάνω κενός εγκατάσταση () { Κατα συρροη.begin(9600); ενώ (! Κατα συρροη ) ; // Μόνο για τη σανίδα Leonardo // λάβετε χρόνο από το RTC Κατα συρροη //ο συγχρονισμός απέτυχεαλλού Κατα συρροη.println("Το RTC έχει ορίσει την ώρα του συστήματος"); //μη αυτόματη εγκατάσταση 16/02/2016 12:53 TimeElementste; te.Second = 0; //δευτερόλεπτα te.Minute = 53; //λεπτά τε.Ώρα = 12; //ώρες te.Day = 16; //ημέρα τε.Μήνας = 2; // μήνας te.Έτος = 2016 - 1970; //Το έτος στη βιβλιοθήκη υπολογίζεται από το 1970 time_t timeVal = makeTime(te); RTC .set(timeVal); setTime(timeVal); ) κενό βρόχος() ( digitalClockDisplay(); //χρονική καθυστέρηση εξόδου (1000); ) void digitalClockDisplay() ( Κατα συρροη Κατα συρροη.Τυπώνω(" "); Κατα συρροη.print(day()); Κατα συρροη.Τυπώνω(" "); Κατα συρροη.print(month()); Κατα συρροη.Τυπώνω(" "); Κατα συρροη.print(year()); Κατα συρροη //χρόνος εξόδου μέσω ":" Κατα συρροη.Τυπώνω(":"); εάν (ψηφία< 10) Κατα συρροη.print("0"); Κατα συρροη.print(ψηφία); )

. Εγκατάσταση από"Οθόνη θύρας"

Πιο ακριβής επιλογή ρύθμισης ώρας. Η ώρα ρυθμίζεται μέσω της «παρακολούθησης θυρών» καθώς λειτουργεί ο ελεγκτής.

Ανοίγουμε την οθόνη, εισάγουμε τα δεδομένα στην απαιτούμενη μορφή, κοιτάμε το ρολόι αναφοράς, εκμεταλλευόμαστε τη στιγμή και κάνουμε κλικ στο "αποστολή".

Δείγμα κώδικα

//μορφή για την ένδειξη της τρέχουσας ώρας "ΗΗ.ΜΜ.ΕΕ ωω:λλ:δδ" //όπου ΗΗ είναι ημέρα, ΜΜ είναι μήνας, ΥΥ είναι έτος, ωω είναι ώρες, mm είναι λεπτά, δδ είναι δευτερόλεπτα //YY - από 00 έως 99 για το 2000-2099#περιλαμβάνω #περιλαμβάνω bool isTimeSet = false ; //σημαία που υποδεικνύει εάν η ημερομηνία έχει ήδη οριστείκενός εγκατάσταση () { Κατα συρροη.begin(9600); ενώ (! Κατα συρροη ) ; // Μόνο για τη σανίδα Leonardo setSyncProvider(RTC.get); // λάβετε χρόνο από το RTC if (timeStatus() != timeSet) Κατα συρροη.println("Δεν είναι δυνατός ο συγχρονισμός με το RTC"); //ο συγχρονισμός απέτυχεαλλού Κατα συρροη.println("Το RTC έχει ορίσει την ώρα του συστήματος"); ) κενό βρόχος() ( αν ( Κατα συρροη.διαθέσιμος()) ( //μια εντολή ελήφθη με την πάροδο του χρόνου setTimeFromFormatString( Κατα συρροη.readStringUntil("\n" )); isTimeSet = true; //η ημερομηνία έχει οριστεί) εάν (isTimeSet) //αν είχε καθοριστεί η ημερομηνία( digitalClockDisplay(); //χρόνος εξόδου ) καθυστέρηση (1000); ) void digitalClockDisplay() ( Κατα συρροη.print(hour()); printDigits(minute()); printDigits(second()); Κατα συρροη.Τυπώνω(" "); Κατα συρροη.print(day()); Κατα συρροη.Τυπώνω(" "); Κατα συρροη.print(month()); Κατα συρροη.Τυπώνω(" "); Κατα συρροη.print(year()); Κατα συρροη.println(); ) void printDigits(int ψηφία) ( //χρόνος εξόδου μέσω ":" Κατα συρροη.Τυπώνω(":"); εάν (ψηφία< 10) Κατα συρροη.print("0"); Κατα συρροη.print(ψηφία); ) void setTimeFromFormatString (ώρα συμβολοσειράς) ( //ΗΗ.ΜΜ.ΕΕ ωω:λλ:δδ int day = time.substring(0, 2).toInt(); int month = time.substring(3, 5).toInt(); int έτος = time.substring(6, 8).toInt(); int hours = time.substring(9, 11).toInt(); int minutes = time.substring(12, 14).toInt(); int seconds = time.substring(15, 17).toInt(); TimeElementste; te.Second = δευτερόλεπτα; te.Minute = λεπτά; τε.Ώρα = ώρες; τε.Ημέρα = ημέρα ; τε.Μήνας = μήνας ; te.Έτος = έτος + 30; //η χρονιά στη βιβλιοθήκη μετριέται από το 1970. Θέλουμε από το 2000 time_t timeVal = makeTime(te); RTC .set(timeVal); setTime(timeVal); )