Συγχρονίζουμε την ώρα της μονάδας DS3231 με τον υπολογιστή. Ρολόι σε DS3231 και μικροελεγκτή AVR

Το τσιπ DS3231 είναι ένα ρολόι πραγματικού χρόνου RTC υψηλής ακρίβειας που διαθέτει ενσωματωμένο ταλαντωτή χαλαζία με αντιστάθμιση θερμοκρασίας, με αποτέλεσμα τη μετατόπιση χρόνου μόνο ±2 λεπτά το χρόνο. Επιπλέον, εφαρμόζεται μια λειτουργία συναγερμού και υπάρχει επίσης μια έξοδος διακοπής. Το ρολόι μπορεί να αγοραστεί ως έτοιμη μονάδα Arduino με στοιχεία ιμάντων και θήκη μπαταρίας.

Παρήγγειλα τη μονάδα εδώ. Το διάγραμμα φαίνεται στην παρακάτω εικόνα:


Το μικροκύκλωμα χρησιμοποιεί το ευρέως χρησιμοποιούμενο . Υποστηρίζει τυπικούς ρυθμούς δεδομένων (100 kHz) και υψηλούς (400 kHz). Η διεύθυνση μικροκυκλώματος (7 bit) στο δίαυλο I2C είναι 1101000. Επιπλέον, η μονάδα διαθέτει μνήμη I2C (24C32), που δεν φαίνεται στο διάγραμμα.

Λειτουργίες ισχύος

Η τάση τροφοδοσίας του μικροκυκλώματος μπορεί να είναι της τάξης των 2,3...5,5V, υπάρχουν δύο γραμμές ρεύματος, για εξωτερική πηγή (γραμμή Vcc), καθώς και για μπαταρία (Vbat). Η τάση της εξωτερικής πηγής παρακολουθείται συνεχώς και όταν πέσει κάτω από το όριο Vpf=2,5V, μεταβαίνει στη γραμμή μπαταρίας. Ο παρακάτω πίνακας δείχνει τις συνθήκες για την εναλλαγή μεταξύ γραμμών ηλεκτρικής ενέργειας:

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

Προκειμένου να εξοικονομηθεί φόρτιση, όταν η μπαταρία είναι συνδεδεμένη (εφαρμόζεται τάση στη γραμμή Vbat), η γεννήτρια ρολογιού δεν ξεκινά έως ότου η τάση στη γραμμή Vcc υπερβεί την τιμή κατωφλίου Vpf ή η σωστή διεύθυνση του μικροκυκλώματος μεταδίδεται μέσω τη διεπαφή I2C. Ο χρόνος εκκίνησης της γεννήτριας ρολογιού είναι μικρότερος από ένα δευτερόλεπτο. Περίπου 2 δευτερόλεπτα μετά την ενεργοποίηση (Vcc) ή τη λήψη της διεύθυνσης μέσω της διεπαφής I2C, ξεκινά η διαδικασία διόρθωσης συχνότητας. Μόλις ξεκινήσει η γεννήτρια ρολογιού, συνεχίζει να λειτουργεί όσο υπάρχει Vcc ή Vbat. Όταν ενεργοποιείται για πρώτη φορά, οι καταχωρητές ημερομηνίας και ώρας επαναφέρονται και έχουν τις ακόλουθες τιμές: 01/01/00 – 01 – 00/00/00 (ημέρα/μήνας/έτος/ – ημέρα της εβδομάδας – ώρα/λεπτά /δευτερόλεπτα).

Η κατανάλωση ρεύματος όταν τροφοδοτείται από μπαταρία 3,63 V είναι 3 μA, ελλείψει μετάδοσης δεδομένων μέσω της διεπαφής I2C. Η μέγιστη κατανάλωση ρεύματος μπορεί να φτάσει τα 300 µA όταν χρησιμοποιείτε εξωτερική τροφοδοσία 5,5 V και υψηλή ταχύτητα μεταφοράς δεδομένων I2C.

Λειτουργία εξωτερικής επαναφοράς

Η γραμμή RST μπορεί να χρησιμοποιηθεί για εξωτερική επαναφορά και διαθέτει επίσης λειτουργία συναγερμού χαμηλής τάσης. Η γραμμή έλκεται ψηλά μέσω μιας εσωτερικής αντίστασης, δεν απαιτείται εξωτερικό τράβηγμα. Για να χρησιμοποιήσετε τη λειτουργία εξωτερικής επαναφοράς, ένα κουμπί μπορεί να συνδεθεί μεταξύ της γραμμής RST και του κοινού καλωδίου· το μικροκύκλωμα διαθέτει προστασία αναπήδησης επαφής. Η λειτουργία συναγερμού ενεργοποιείται όταν η τάση τροφοδοσίας Vcc πέσει κάτω από την τιμή κατωφλίου Vpf, ενώ η γραμμή RST έχει ρυθμιστεί σε χαμηλό λογικό επίπεδο.

Περιγραφή των καταχωρητών DS3231

Ο παρακάτω πίνακας δείχνει μια λίστα με καταχωρητές ρολογιού σε πραγματικό χρόνο:

ΔιεύθυνσηD7D6D5Δ4D3Δ2Δ1D0ΛειτουργίαΌρια
0x000 10 δευτερόλεπταΔευτερόλεπταΔευτερόλεπτα00-59
0x010 10 λεπτάλεπτάλεπτά00-59
0x020 12/24 Π.Μ. Μ.Μ10 ώρεςΩραΠαρακολουθώ1-12 + π.μ./μμ ή 00-23
10 ώρες
0x030 0 0 0 0 ΗμέραΗμέρα της εβδομάδας1-7
0x040 0 10ηΑριθμόςημερομηνία01-31
0x05Αιώνας0 0 10 μηνώνΜήναςΜήνες/αιώνες01-12 + Αιώνας
0x0610 χρόνιαΕτοςΧρόνια00-99
0x07A1M110 δευτερόλεπταΔευτερόλεπταΔευτερόλεπτα, 1ος συναγερμός00-59
0x08A1M210 λεπτάλεπτάΛεπτά, 1ος συναγερμός00-59
0x09A1M312/24 Π.Μ. Μ.Μ10 ώρεςΩραΡολόι, 1ο ξυπνητήρι1-12 + π.μ./μμ ή 00-23
10 ώρες
0x0AA1M4DY/DT10ηΗμέραΗμέρα της εβδομάδας, 1ο ξυπνητήρι1-7
ΑριθμόςΗμερομηνία, 1ος συναγερμός01-31
0x0BA2M210 λεπτάλεπτάΛεπτά, 2ος συναγερμός00-59
0x0CA2M312/24 Π.Μ. Μ.Μ10 ώρεςΩραΡολόι, 2ο ξυπνητήρι1-12 + π.μ./μμ ή 00-23
10 ώρες
0x0DA2M4DY/DT10ηΗμέραΗμέρα της εβδομάδας, 2ο ξυπνητήρι1-7
ΑριθμόςΗμερομηνία, 2ος συναγερμός01-31
0x0EEOSCBBSQWΜΕΤΡRS2RS1INTCNA2IEA1IEΜητρώο ρυθμίσεων (Έλεγχος)
0x0FΟ Ο.Σ.Φ.0 0 0 EN32kHzBSYA2FA1FΕγγραφή κατάστασης
0x10ΣΗΜΑΔΙΔΕΔΟΜΕΝΑΔΕΔΟΜΕΝΑΔΕΔΟΜΕΝΑΔΕΔΟΜΕΝΑΔΕΔΟΜΕΝΑΔΕΔΟΜΕΝΑΔΕΔΟΜΕΝΑΜητρώο αντιστάθμισης γήρανσης
0x11ΣΗΜΑΔΙΔΕΔΟΜΕΝΑΔΕΔΟΜΕΝΑΔΕΔΟΜΕΝΑΔΕΔΟΜΕΝΑΔΕΔΟΜΕΝΑΔΕΔΟΜΕΝΑΔΕΔΟΜΕΝΑΚαταχωρητής θερμοκρασίας, υψηλό byte
0x12ΔΕΔΟΜΕΝΑΔΕΔΟΜΕΝΑ0 0 0 0 0 0 Καταχωρητής θερμοκρασίας, χαμηλό byte

Οι πληροφορίες χρόνου αποθηκεύονται σε δυαδική δεκαδική μορφή, δηλαδή, κάθε ψηφίο ενός δεκαδικού αριθμού (από το 0 έως το 9) αντιπροσωπεύεται ως ομάδα 4 bit. Στην περίπτωση ενός byte, το low nibble μετράει ένα, το high nibble μετράει δεκάδες, κ.λπ. Ο χρόνος μετράται σε καταχωρητές με διευθύνσεις 0x00-0x06· για μέτρηση ωρών, μπορείτε να επιλέξετε τη λειτουργία 12 ή 24 ωρών. Η ρύθμιση του 6ου bit του καταχωρητή ρολογιού (διεύθυνση 0x02) ορίζει τη λειτουργία 12 ωρών, στην οποία το 5ο bit υποδεικνύει την ώρα της ημέρας, η τιμή 1 αντιστοιχεί στο απόγευμα (PM), η τιμή 0 αντιστοιχεί στο απόγευμα (AM). Η μηδενική τιμή του 6ου bit αντιστοιχεί στη λειτουργία 24 ωρών, εδώ το 5ο bit εμπλέκεται στην καταμέτρηση των ωρών (τιμές 20-23).

Ο καταχωρητής ημέρας της εβδομάδας αυξάνεται τα μεσάνυχτα, μετρώντας από το 1 έως το 7, ο καταχωρητής μήνα (διεύθυνση 0x05) περιέχει το bit Century (7ο bit), το οποίο αλλάζει όταν ο καταχωρητής μέτρησης ετών (διεύθυνση 0x06) υπερχειλίσει, από 99 σε 00 .

Το τσιπ DS3231 υλοποιεί δύο ξυπνητήρια, το 1ο ξυπνητήρι διαμορφώνεται χρησιμοποιώντας καταχωρητές με διευθύνσεις 0x07-0x0A, το 2ο ξυπνητήρι διαμορφώνεται χρησιμοποιώντας καταχωρητές 0x0B-0x0D. Τα bit A1Mx και A2Mx μπορούν να χρησιμοποιηθούν για τη διαμόρφωση διαφόρων τρόπων λειτουργίας συναγερμών· η ρύθμιση του bit εξαιρεί τον αντίστοιχο καταχωρητή από τη λειτουργία σύγκρισης. Οι παρακάτω πίνακες δείχνουν τους συνδυασμούς bit για διαφορετικές λειτουργίες συναγερμού:

Οι συνδυασμοί bit που δεν καθορίζονται στους πίνακες οδηγούν σε εσφαλμένη λειτουργία των συναγερμών. Εάν το bit DY/DT διαγραφεί, τότε η αντιστοίχιση ημερομηνίας (ημέρα του μήνα) παρακολουθείται για το ξυπνητήρι· όταν ρυθμιστεί το bit DY/DT, ελέγχεται η αντιστοίχιση της ημέρας της εβδομάδας.

Οι περισσότερες συναρτήσεις διαμορφώνονται στον καταχωρητή Control. Το bit EOSC ελέγχει την έναρξη της γεννήτριας ρολογιού, η επαναφορά του bit εκκινεί τη γεννήτρια ρολογιού. Η ρύθμιση του bit σταματά τη γεννήτρια, μόνο για λειτουργία μπαταρίας (Vbat). Όταν τροφοδοτείται από εξωτερική πηγή (Vcc), ο ταλαντωτής λειτουργεί πάντα ανεξάρτητα από την κατάσταση του bit EOSC. Όταν είναι ενεργοποιημένο, η προεπιλεγμένη τιμή bit είναι 0.

Η ρύθμιση του bit BBSQW επιτρέπει στην έξοδο INT/SQW (3η ακίδα) να λειτουργεί σε λειτουργία μπαταρίας, απουσία εξωτερικής τροφοδοσίας. Όταν το bit οριστεί στο μηδέν, η έξοδος INT/SQW μεταβαίνει στην κατάσταση 3 (απενεργοποιημένη) εάν η τάση εξωτερικής πηγής Vcc πέσει κάτω από την τιμή κατωφλίου Vpf. Μετά την εφαρμογή ισχύος, η προεπιλεγμένη τιμή bit είναι 0.

Το bit CONV είναι υπεύθυνο για την αναγκαστική μέτρηση της θερμοκρασίας· η ρύθμιση του bit ξεκινά τη διαδικασία μετατροπής, κατά την οποία προσαρμόζεται επίσης η συχνότητα της γεννήτριας ρολογιού· το αποτέλεσμα της μέτρησης βρίσκεται σε καταχωρητές με διευθύνσεις 0x11, 0x12. Η εκκίνηση είναι δυνατή μόνο εάν έχει ολοκληρωθεί η προηγούμενη μετατροπή. Πριν ξεκινήσετε, πρέπει να ελέγξετε τη σημαία κατειλημμένου BSY. Η αναγκαστική μετατροπή θερμοκρασίας δεν επηρεάζει τον εσωτερικό κύκλο προσαρμογής συχνότητας 64 δευτερολέπτων. Η ρύθμιση του bit CONV δεν επηρεάζει τη σημαία BSY για 2 ms. Τα bit CONV και BSY διαγράφονται αυτόματα μετά την ολοκλήρωση της μετατροπής.

Τα bit RS2, RS1 ορίζουν τη συχνότητα των ορθογώνιων παλμών (τετράγωνο κύμα) στην έξοδο INT/SQW. Από προεπιλογή, όταν είναι ενεργοποιημένα, τα bit ορίζονται σε 1. Ο παρακάτω πίνακας δείχνει τους πιθανούς συνδυασμούς bit:

Το bit INTCN ελέγχει την έξοδο INT/SQW. Εάν γίνει επαναφορά του bit, στην έξοδο εμφανίζονται ορθογώνιοι παλμοί (τετράγωνα κύματα), η συχνότητα των οποίων ορίζεται από τα bit RS2, RS1. Όταν έχει ρυθμιστεί το bit INTCN, η έξοδος χρησιμοποιείται για τη δημιουργία διακοπών συναγερμού. Από προεπιλογή, η τιμή bit είναι 1. Ο τύπος εξόδου είναι INT/SQW - open drain, επομένως είναι απαραίτητο να το τραβήξετε προς τα πάνω μέσω μιας αντίστασης σε υψηλό λογικό επίπεδο, το ενεργό επίπεδο είναι χαμηλό.

Η ρύθμιση των bit A1IE, A2IE επιτρέπει διακοπές στο 1ο και 2ο σήμα συναγερμού, αντίστοιχα. Επαναφορά bits, απενεργοποιεί τις διακοπές. Η προεπιλεγμένη τιμή είναι 0.

Ο καταχωρητής κατάστασης περιέχει σημαίες συμβάντων και ελέγχει την έξοδο 32 kHz. Η σημαία OSF αντικατοπτρίζει την κατάσταση της γεννήτριας ρολογιού, η τιμή 1 σημαίνει ότι η γεννήτρια ρολογιού έχει σταματήσει, αυτό το συμβάν μπορεί να συμβεί στις ακόλουθες περιπτώσεις:

  • Για πρώτη φορά μετά την εφαρμογή ρεύματος
  • Η μπαταρία ή η εξωτερική τάση είναι ανεπαρκής για τη λειτουργία της γεννήτριας ρολογιού
  • Η γεννήτρια απενεργοποιείται ρυθμίζοντας το bit EOSC σε λειτουργία μπαταρίας
  • Εξωτερικοί παράγοντες που επηρεάζουν τον κρυσταλλικό ταλαντωτή (θόρυβος, διαρροή κ.λπ.)

Μόλις ρυθμιστεί, η τιμή του bit δεν αλλάζει· το bit πρέπει να μηδενιστεί χειροκίνητα.

Η ρύθμιση του bit EN32kHz επιτρέπει τη δημιουργία ορθογώνιων παλμών (τετράγωνα κύματα) στην έξοδο 32 kHz (1η ακίδα), η συχνότητα παλμού είναι σταθερή και ίση με 32,768 kHz. Η επαναφορά του bit απενεργοποιεί αυτή τη λειτουργία και μετακινεί την έξοδο στην 3η κατάσταση (υψηλή αντίσταση εισόδου). Από προεπιλογή, η τιμή bit είναι 1· μετά την εφαρμογή ισχύος, εμφανίζονται παλμοί στην έξοδο. Ο τύπος εξόδου είναι 32kHz open drain, επομένως απαιτεί έλξη σε υψηλό λογικό επίπεδο.

Η σημαία κατειλημμένου BSY ορίζεται κατά τη διαδικασία μετατροπής θερμοκρασίας και ρύθμισης ρολογιού. Η σημαία επαναφέρεται όταν ολοκληρωθεί η μετατροπή.

Οι σημαίες ξυπνητηριού A1F, A2F ρυθμίζονται όταν οι τιμές των καταχωρητών μέτρησης χρόνου και των καταχωρητών του ξυπνητηριού ταιριάζουν. Εάν ο συναγερμός διακόπτει το A1IE, το A2IE είναι ενεργοποιημένο και έχει εκχωρηθεί μια έξοδος διακοπής (ρυθμίζεται το bit INTCN), τότε εμφανίζεται ένα σήμα διακοπής στην έξοδο INT/SQW (μετάβαση από υψηλό σε χαμηλό λογικό επίπεδο). Οι σημαίες πρέπει να μηδενιστούν χειροκίνητα γράφοντας την τιμή 0.

Ο καταχωρητής αντιστάθμισης γήρανσης έχει σχεδιαστεί για να ρυθμίζει τη συχνότητα της γεννήτριας ρολογιού. Η τιμή καταχωρητή προστίθεται στη συχνότητα του ταλαντωτή κατά τη διάρκεια της διαδικασίας εσωτερικής ρύθμισης, εάν εντοπιστεί αλλαγή θερμοκρασίας, καθώς και όταν ενεργοποιείται η μετατροπή θερμοκρασίας από το bit CONV. Η τιμή μετατόπισης υπογράφεται, δηλαδή, οι θετικές τιμές (1-127) μειώνουν τη συχνότητα, οι αρνητικές τιμές (128-255) την αυξάνουν. Για την ίδια μετατόπιση, η αλλαγή συχνότητας θα είναι διαφορετική ανάλογα με τη θερμοκρασία. Στους +25°C, η αλλαγή συχνότητας θα είναι 0,1 ppm/LSB.

Η τρέχουσα τιμή θερμοκρασίας αποθηκεύεται σε καταχωρητές με διευθύνσεις 0x11 και 0x12, το υψηλό και το χαμηλό byte, αντίστοιχα, η τιμή θερμοκρασίας στους καταχωρητές ενημερώνεται περιοδικά. Η αριστερή στοίχιση έχει οριστεί, η ανάλυση είναι 10 bit ή 0,25°C/LSB, δηλαδή το υψηλό byte περιέχει το ακέραιο μέρος της θερμοκρασίας και το 6ο, 7ο bit στους χαμηλούς καταχωρητές αποτελούν το κλασματικό μέρος. Στο υψηλό byte, το 7ο bit υποδεικνύει το πρόσημο της θερμοκρασίας, για παράδειγμα, η τιμή 00011011 01 αντιστοιχεί σε θερμοκρασία +27,25 °C, η τιμή 11111110 10 αντιστοιχεί σε θερμοκρασία -2,5 °C.

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

Σύνδεση του DS3231 σε μικροελεγκτή

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


Μετά την εφαρμογή της τροφοδοσίας, εμφανίζονται παύλες (– – – – – –) στις ενδείξεις, μετά αρχικοποιείται το ρολόι, η τιμή χρόνου εμφανίζεται στις ενδείξεις με καθυστέρηση 1 δευτερολέπτου, η οποία απαιτείται για την εκκίνηση της γεννήτριας ρολογιού. Οι ενδείξεις εμφανίζουν τις ώρες, τα λεπτά και τα δευτερόλεπτα, διαχωρισμένα με μια υποδιαστολή και η μορφή ώρας είναι 24ωρη. Χρησιμοποιώντας το κουμπί «Ένδειξη» SB1, μπορείτε να αλλάξετε τη μορφή εμφάνισης, όπου οι ενδείξεις θα εμφανίζουν τη θερμοκρασία, καθώς και την τιμή των ωρών και των λεπτών, χωρισμένα με μια υποδιαστολή, η οποία αναβοσβήνει με συχνότητα 2 Hz. Η θερμοκρασία εμφανίζεται χωρίς κλασματικό τμήμα· το πρόγραμμα διαβάζει μόνο το υψηλό byte αποθήκευσης θερμοκρασίας στη διεύθυνση 0x11.

Η τιμή του χρόνου διαβάζεται από το ρολόι μέσω μιας διακοπής στη γραμμή SQW/INT, η οποία ελέγχεται από το 1ο σήμα συναγερμού· κατά την αρχικοποίηση του ρολογιού, το ξυπνητήρι ρυθμίζεται σε ένα κάθε δεύτερο σήμα. Το LED HL1 χρησιμεύει ως ένδειξη και αναβοσβήνει στο σήμα διακοπής κάθε δευτερόλεπτο. Το LED HL2 ανάβει εάν υπάρχει σφάλμα στη μετάδοση δεδομένων μέσω της διεπαφής I2C.

Επιπλέον, πρόσθεσα στο πρόγραμμα τη δυνατότητα ρύθμισης του ρολογιού χρησιμοποιώντας τα κουμπιά SB2 "Settings", SB3 "Installation". Η λειτουργία ρύθμισης εισέρχεται πατώντας το κουμπί SB2, οι ενδείξεις εμφανίζουν 00 ώρες και παύλες αντί για λεπτά και δευτερόλεπτα (00 – – – –). Χρησιμοποιώντας το κουμπί SB3, ορίζετε την τιμή της ώρας (αύξηση με κάθε πάτημα) και στη συνέχεια πατώντας το κουμπί SB2 αλλάζετε την επεξεργασία των λεπτών· αντί για παύλα, θα εμφανιστούν τα 00 λεπτά. Το κουμπί SB3 ορίζει επίσης την απαιτούμενη τιμή και ούτω καθεξής. Αφού επεξεργαστείτε τα δευτερόλεπτα και πατήσετε το κουμπί SB2, η ώρα στο ρολόι ξαναγράφεται και η ενημερωμένη ώρα εμφανίζεται στις ενδείξεις.

Μερικός κώδικας προγράμματος δίνεται παρακάτω (η πλήρης έκδοση μπορεί να γίνει λήψη στο τέλος του άρθρου):

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; #περιλαμβάνω LIST p=16F628A __CONFIG H"3F10" ;Επίπεδο σφάλματος διαμόρφωσης μικροελεγκτή -302 ;μην εμφανίζονται μηνύματα με σφάλμα 302 στη λίστα Sec equ 0020h ;βοηθητικές καταχωρίσεις λογαριασμού Sec1 equ 0021h ; Sec2 equ 0022h ; scetbit equ 0024h;βοηθητικός καταχωρητής για τη μέτρηση του αριθμού των bit perem equ 0025h;βοηθητικός καταχωρητής για λήψη/μετάδοση byte μέσω spi, i2c temp equ 0026h, καταχωρητής θερμοκρασίας perem_1 equ 0027h, βοηθητικός καταχωρητής για δυαδικό μετατροπέα-deci. αποτέλεσμα equ 0028h ;βοηθητικός καταχωρητής μετατροπέα δυαδικού δεκαδικού dat_ind equ 0029h ;καταχωρητής δεδομένων για μετάδοση μέσω του πρωτοκόλλου spi adr_ind equ 002Ah ;καταχωρητής διεύθυνσης για μετάδοση μέσω του πρωτοκόλλου spi second equ 002Bh ;καταχωρητής αποθήκευσης δευτερολέπτων για τη ρύθμιση του χρόνου minut equ 002Ch ;D λεπτών καταχωρητής αποθήκευσης equ 002 καταχωρητής αποθήκευσης ώρας για ρυθμίσεις ώρας adr_i2c equ 002Eh ;καταγραφές της υπορουτίνας μεταφοράς δεδομένων διασύνδεσης i2c tmp_i2c equ 002Fh slave_adr equ 0030h data_i2c equ 0031h σημαία equ 007Fh ;ΝΤ3ΔΓ 3ΔΣΣΤΡΩΜΕΝΟ καταχωρητή #DEBFI 1 #DEFINE sda PORTB ,1 ; Γραμμή SDA για συνδέσεις DS3231 #DEFINE scl PORTB,2 ;SCL γραμμή για σύνδεση DS3231 #DEFINE sda_io TRISB,1 ;κατεύθυνση της γραμμής SDA #DEFINE scl_io TRISB,2 ;κατεύθυνση της γραμμής SCL #DEFINE data ;γραμμή εισαγωγής δεδομένων του προγράμματος οδήγησης MAX7219 #DEFINE cs PORTB ,6 ;γραμμή επιλογής προγράμματος οδήγησης MAX7219 #DEFINE clk PORTB,7 ;γραμμή ρολογιού προγράμματος οδήγησης MAX7219 #DEFINE led PORTB,4 ;i2c LED σφάλματος #DEFINE led_sec PORTB, ένδειξη προόδου LED 1Hz #DEFINE regim PORTA,2 ;Κουμπί ένδειξης - αλλαγή της λειτουργίας εμφάνισης #DEFINE nast PORTA,3 ;κουμπί ρύθμισης - είσοδος στη λειτουργία ρύθμισης ώρας #DEFINE ust PORTA,4 ;Κουμπί ρύθμισης - ρύθμιση της τιμής του ρολογιού;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;; org 0000h ;έναρξη εκτέλεσης προγράμματος από τη διεύθυνση 0000h goto Start ;μετάβαση στην ετικέτα Start ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;Κύριο πρόγραμμα Έναρξη movlw b"00000000" ;ρύθμιση των τιμών των κλειδαριών εξόδου της θύρας A movwf PORTA ; movlw b"01000000" ;ορίστε τις τιμές των μανδάλων εξόδου της θύρας B movwf PORTB ; movlw b"00000111" ;απενεργοποίηση συγκριτών movwf CMCON ; bsf STATUS,RP0 ;επιλέξτε την 1η τράπεζα movlw b"00000111" ;ρυθμίστε τις γραμμές εισόδου/εξόδου της θύρας B movwf TRISB ;RB0-RB2 - για είσοδο, τα υπόλοιπα για την έξοδο movlw b"11111111" ρυθμίστε την είσοδο/ γραμμές εξόδου της θύρας A movwf TRISA ;όλες οι γραμμές για είσοδο bcf STATUS,RP0 ;επιλογή σημαίας τράπεζας 0 clrf ;επαναφορά καταχωρητή σημαίας κλήση init_lcd ;υπορουτίνα προετοιμασίας προγράμματος οδήγησης κλήσης (MAX7219) κλήση viv_not ;εξόδου συμβόλων παύλας " ------ " ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;; movlw b"11010000" ;διεύθυνση συσκευής (DS3231) movwf slave_adr ;Γράψτε 4 byte στους καταχωρητές λήψης/μετάδοσης μέσω i2c; εδώ διαμορφώνεται ο 1ος συναγερμός, ηχεί κάθε δεύτερο movlw data_i2c ;ρυθμίστε τον πρώτο καταχωρητή λήψης/μετάδοσης via ; movlw b"10000000" ;δεδομένα για τον καταχωρητή δευτερολέπτων του 1ου συναγερμού movwf INDF ; incf FSR,F ; movlw b"10000000" ;δεδομένα για τον καταχωρητή λεπτών του 1ου συναγερμού movwf INDF ; incf FSR,F ; movlw b"10000000" ;δεδομένα για τον καταχωρητή ρολογιού του 1ου ξυπνητηριού movwf INDF ; incf FSR,F ; movlw b"10000000" ;δεδομένα για την ημερομηνία/ημέρα της εβδομάδας καταχωρητή του 1ου συναγερμού movwf INDF ; movlw. 4 ;μεταφορά 4 byte μέσω i2c movwf tmp_i2c ; movlw 0x07 ;ρύθμιση της διεύθυνσης του καταχωρητή δευτερολέπτων του 1ου ξυπνητηριού movwf adr_i2c ; κλήση write_i2c ;κλήση της υπορουτίνας εγγραφής μέσω της διεπαφής i2c κλήση err_prov ;έλεγχος για σφάλματα εγγραφής/ανάγνωσης I2C movlw .1 ;μεταφορά του 1ου byte μέσω i2c movwf tmp_i2c ; movlw 0x0E ;ρύθμιση της διεύθυνσης του καταχωρητή ελέγχου movwf adr_i2c ; movlw data_i2c ;ρύθμιση του πρώτου καταχωρητή μετάδοσης/λήψης μέσω i2c movwf FSR ; movlw b"00000101" ;εκκινήστε τη γεννήτρια ρολογιού, απαγορεύστε τη λειτουργία της ακίδας INT/SQW για movwf INDF ;λειτουργία τροφοδοσίας μπαταρίας, η συχνότητα παλμού στην έξοδο INT/SQW είναι 1Hz, η έξοδος INT/SQW χρησιμοποιείται για τη δημιουργία συναγερμού clock interrupts, ;ενεργοποίηση διακοπών ξυπνητηριού 1η κλήση αφύπνισης write_i2c ;κλήση της υπορουτίνας εγγραφής μέσω της διεπαφής i2c κλήση err_prov ;έλεγχος για σφάλματα εγγραφής/ανάγνωσης I2C met_2 movlw .1 ;μεταφορά του 1ου byte μέσω i2c_ movwf t; movlw 0x0F ;ρύθμιση της διεύθυνσης του καταχωρητή κατάστασης movwf adr_i2c ; movlw data_i2c ;ρύθμιση του πρώτου καταχωρητή μετάδοσης/λήψης μέσω i2c movwf FSR ; movlw b"00000000" ;επαναφέρετε το bit OSF, απαγορεύστε τη δημιουργία παλμών στην έξοδο EN32kHz, movwf INDF ;επαναφέρετε τις σημαίες διακοπής συναγερμού A2F, A1F κλήση write_i2c ;καλέστε την υπορουτίνα εγγραφής μέσω της διεπαφής i_provc εγγραφής για κλήση err /read errors met_1 btfsc int ; ψηφοφορία στη γραμμή διακοπής συναγερμού goto met_3; bsf led_sec ;ενεργοποιήστε το LED ένδειξης προόδου του ρολογιού goto met_4 ; met_3 bcf led_sec ;απενεργοποιεί την ένδειξη προόδου του ρολογιού LED btfsc nast ;ψηφίζει το κουμπί ρύθμισης του ρολογιού goto met_5 ; κλήση nast_time ;καλέστε την υπορουτίνα για τη ρύθμιση της ώρας goto met_2 ; met_5 btfsc regim ;poll του κουμπιού λειτουργίας ένδειξης goto met_1 ; met_6 κλήση paus_knp ; btfss regim ; goto met_6 ; btfss flag,2 ;αλλάξτε την τιμή της σημαίας λειτουργίας ένδειξης goto met_7 ; bcf flag,2 ;επαναφορά σημαίας ένδειξης, λειτουργία εμφάνισης ρολογιού goto met_1 ; met_7 bsf flag,2 ;ρυθμίζοντας τη σημαία ένδειξης, τη θερμοκρασία και τη λειτουργία εμφάνισης του ρολογιού goto met_1 ; met_4 movlw .1 ;μετάδοση του 1ου byte μέσω i2c movwf tmp_i2c ; movlw 0x11 ;ρύθμιση της διεύθυνσης του καταχωρητή υψηλής θερμοκρασίας movwf adr_i2c ; κλήση read_i2c ;κλήση της υπορουτίνας ανάγνωσης μέσω I2C call err_prov ;έλεγχος για σφάλματα εγγραφής/ανάγνωσης I2C movf INDF,W ;αντιγραφή της τιμής θερμοκρασίας στον καταχωρητή θερμοκρασίας movwf temp rd_time movlw .3 ;μεταφορά 3 byte μέσω i2c movwf ; movlw 0x00 ;ρύθμιση της διεύθυνσης καταχωρητή δευτερολέπτων movwf adr_i2c ; κλήση read_i2c ;κλήση της υπορουτίνας ανάγνωσης μέσω I2C call err_prov ;έλεγχος για σφάλματα εγγραφής/ανάγνωσης I2C flag btfsc,2 ;poll of the indication mode flag goto met_8 ; κλήση vivod ;κλήση της υπορουτίνας για την εμφάνιση της τιμής του ρολογιού στην ψηφιακή οθόνη goto met_2 ; met_8 κλήση vivod_temp ;κλήση της υπορουτίνας για την εμφάνιση της θερμοκρασίας και του ρολογιού στην ψηφιακή οθόνη goto met_2 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

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

CONFIG H"3F10" ;Διαμόρφωση μικροελεγκτή

επίπεδο σφάλματος -302 ;μην εμφανίζονται μηνύματα σφάλματος 302 στην καταχώριση

Sec equ 0020h ;βοηθητικά μητρώα λογαριασμών

Sec1 equ 0021h ;

Sec2 equ 0022h ;

scetbit equ 0024h ;μετρώντας τον αριθμό των bit βοηθητικού καταχωρητή

perem equ 0025h ;βοηθητικός καταχωρητής λήψης/μετάδοσης byte μέσω spi, i2c

temp equ 0026h ;καταχωρητής θερμοκρασίας

perem_1 equ 0027h ;βοηθητικός καταχωρητής BCD

αποτέλεσμα equ 0028h ;βοηθητικός καταχωρητής μετατροπέα δυαδικού δεκαδικού

dat_ind equ 0029h ;καταχωρητής δεδομένων για μετάδοση μέσω πρωτοκόλλου spi

adr_ind equ 002Ah ;καταχωρητής διευθύνσεων για μετάδοση μέσω πρωτοκόλλου spi

δεύτερη εξίσωση 002Bh ;δευτερόλεπτα καταχωρητής αποθήκευσης για τη ρύθμιση της ώρας

minut equ 002Ch ;λεπτό καταχωρητή αποθήκευσης για τη ρύθμιση της ώρας

ώρα εξισορρόπηση 002Dh ;ώρα αποθήκευσης καταχωρητή για τη ρύθμιση της ώρας

adr_i2c equ 002Eh ;καταγράφει την υπορουτίνα μεταφοράς δεδομένων διεπαφής i2c

tmp_i2c equ 002Fh

slave_adr equ 0030h

data_i2c equ 0031h

flag equ 007Fh ;flag register

#DEFINE int PORTB,0 ;γραμμή διακοπής INT/SQW DS3231

#DEFINE sda PORTB,1 ;γραμμή SDA για σύνδεση DS3231

#DEFINE scl PORTB,2 ;SCL γραμμή για σύνδεση DS3231

#DEFINE datai PORTB,5 ;γραμμή εισαγωγής δεδομένων του προγράμματος οδήγησης MAX7219

#DEFINE cs PORTB,6 ;γραμμή επιλογής προγράμματος οδήγησης MAX7219

#DEFINE clk PORTB,7 ;γραμμή ρολογιού του προγράμματος οδήγησης MAX7219

#DEFINE led PORTB,4 ;i2c LED σφάλματος

#DEFINE led_sec PORTB,3 ;Ένδειξη προόδου ρολογιού LED 1Hz

#DEFINE regim PORTA,2 ;Κουμπί ένδειξης - αλλάζει τη λειτουργία εμφάνισης

#DEFINE nast PORTA,3 ; Κουμπί ρυθμίσεων - εισέρχεται στη λειτουργία ρύθμισης ώρας

#DEFINE ust PORTA,4 ;Κουμπί ρύθμισης - ορίστε την τιμή του ρολογιού

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

org 0000h ;ξεκινήστε την εκτέλεση του προγράμματος από τη διεύθυνση 0000h

goto Start ;μεταβείτε στην ετικέτα Start

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;Κύριο πρόγραμμα

Ξεκινήστε το movlw b"00000000" ;ρυθμίστε τις τιμές των κλειδαριών εξόδου της θύρας Α

movlw b"01000000" ;ρυθμίστε τις τιμές των κλειδαριών εξόδου της θύρας Β

movlw b"00000111" ;απενεργοποιήστε τους συγκριτές

bsf STATUS,RP0 ;επιλέξτε 1η τράπεζα

movlw b"00000111" ;διαμόρφωση των γραμμών εισόδου/εξόδου της θύρας Β

movwf TRISB ;RB0-RB2 - στην είσοδο, τα υπόλοιπα στην έξοδο

movlw b"11111111" ;ρύθμιση των γραμμών εισόδου/εξόδου της θύρας Α

movwf TRISA ;για εισαγωγή όλων των γραμμών

bcf STATUS,RP0 ;επιλέξτε τράπεζα 0

clrf flag ;επαναφορά μητρώου σημαίας

κλήση init_lcd ;καλέστε τη ρουτίνα προετοιμασίας του προγράμματος οδήγησης (MAX7219)

καλέστε viv_not ;εξαγωγή συμβόλων παύλας " ------ " στους δείκτες

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

movlw b"11010000" ;διεύθυνση συσκευής (DS3231)

;Γράψτε 4 byte στους καταχωρητές λήψης/μετάδοσης μέσω i2c

movlw data_i2c ;ρύθμιση του πρώτου καταχωρητή λήψης/μετάδοσης μέσω i2c

movlw b"10000000" ;δεδομένα για τον καταχωρητή δευτερολέπτων του 1ου συναγερμού

movlw b"10000000" ;δεδομένα για τον καταχωρητή λεπτών του 1ου συναγερμού

movlw b"10000000" ;δεδομένα για τον 1ο καταχωρητή ξυπνητηριού

movlw b"10000000" ;δεδομένα για την ημερομηνία/ημέρα της εβδομάδας μητρώο του 1ου συναγερμού

movlw .4 ;μεταφορά 4 byte μέσω i2c

movlw 0x07 ;ρύθμιση της διεύθυνσης του καταχωρητή δευτερολέπτων του 1ου ξυπνητηριού

Γιατί χρειάζονται όλα αυτά;

60 δευτερόλεπτα * 60 λεπτά * 24 ώρες * 365 ημέρες = 31.536.000 δευτερόλεπτα ανά έτος.

Για καθένα από αυτά τα εκατομμύρια, 2 δευτερόλεπτα μπορούν να πάνε προς τη μία ή την άλλη κατεύθυνση. Διαιρέστε 31,5 εκατομμύρια με ένα εκατομμύριο και πολλαπλασιάστε με 2: παίρνουμε 63 δευτερόλεπτα ανά έτος (μέγιστο). Αποδεκτή επιλογή; Πολύ. Αλλά μια φορά κάθε έξι μήνες θα συγχρονιζα την ώρα ώστε να χωράει σε 1 λεπτό.

Με ποιους τρόπους μπορείτε γενικά να ρυθμίσετε την ώρα στο ρολόι της μονάδας;

Παραδοσιακά, ξεκινώντας με τη μονάδα DS3107, η ώρα ορίστηκε χρησιμοποιώντας ένα σκίτσο Arduino από τα παραδείγματα χρήσης της βιβλιοθήκης. Ο αλγόριθμος είναι ο εξής: ανοίξτε το σκίτσο, κάντε κλικ στο «compile and upload» και όταν ο ελεγκτής εκκινηθεί για πρώτη φορά, ορίζεται η ώρα. Το ερώτημα παραμένει: τι ώρα; Πώς μπορεί το Arduino να γνωρίζει ακριβώς τι ώρα να ρυθμίσει; Και είναι πολύ απλό - χρόνος συλλογής σκίτσου. Ωστόσο, βλέπω αρκετά μειονεκτήματα με αυτήν την προσέγγιση:
  • Ο χρόνος μεταγλώττισης εξαρτάται από την "ισχύ" του υπολογιστή.
  • ο χρόνος λήψης εξαρτάται από την ταχύτητα με την οποία το μεταγλωττισμένο σκίτσο μεταφέρεται στην πλακέτα του Arduino.
  • το σκίτσο που ανεβάσατε είναι "μιας χρήσης" (γίνεται ξεπερασμένο αμέσως μετά τη μεταφόρτωση στο Arduino).
Πώς μπορείτε να «εργάζεστε» για να παρακάμψετε αυτούς τους περιορισμούς; Λοιπόν, για παράδειγμα, γνωρίζοντας (ρυθμίζοντας πειραματικά) τον χρόνο μεταγλώττισης, μπορείτε να "οδηγήσετε" το ρολόι στον υπολογιστή προς τα εμπρός σε αυτήν την ώρα. Στη συνέχεια, εκτελέστε τη συλλογή, αναβοσβήστε την πλακέτα και η ώρα θα ρυθμιστεί. Το πλεονέκτημα της μεθόδου είναι η σχετική απλότητά της. Μειονεκτήματα - σχετικά άβολη, σχετικά ανακριβής, εφάπαξ μέθοδος.

Τι άλλο μπορείτε να σκεφτείτε; Μπορείτε, για παράδειγμα, να ρυθμίσετε χειροκίνητα τον απαιτούμενο χρόνο στο σκίτσο, να δώσετε ένα κουμπί που μπορεί να πατηθεί κατάλληλη στιγμήθα ρυθμίσει τον καθορισμένο χρόνο "με το χέρι", για παράδειγμα, 2 λεπτά από την τρέχουσα στιγμή: ενώ το σκίτσο είναι "γεμισμένο", ενώ προετοιμαζόμαστε να παρακολουθήσουμε χειροκίνητα την πολύ απαραίτητη στιγμή του πατήματος του κουμπιού, θα περάσουν ακριβώς αυτά τα δύο λεπτά . Και μετά, κοιτάζοντας το ρολόι στον υπολογιστή, περιμένετε «αυτή τη στιγμή» για να πατήσετε το κουμπί. Πλεονεκτήματα - πιο περίπλοκη από την προηγούμενη μέθοδο, αλλά εξακολουθεί να είναι σχετικά απλή, αλλά πιο ακριβής από την πρώτη μέθοδο. Μειονεκτήματα - αυτή η μέθοδος είναι ακόμη πιο άβολη, διαρκεί περισσότερο και εξακολουθεί να είναι ένα σκίτσο "εφάπαξ".

Ποιος φταίει και τι να κάνουμε;

Έχοντας θέσει στον εαυτό μου αυτές τις δύο ρητορικές ερωτήσεις, πήγα στο Διαδίκτυο για να βρω ποιος είχε ήδη γράψει τον συγχρονισμό ώρας της μονάδας ρολογιού με τον υπολογιστή. Και, όπως γνωρίζετε, αυτός που ψάχνει πάντα βρίσκει. Βρήκα μια επιλογή με . Θεωρητικά, όλα είναι απλά: ένα κανονικό "αρχείο παρτίδας" αναλύει την τρέχουσα πλήρη ώρα που λαμβάνεται με την "πρώτη" μέθοδο (επειδή εκτός από την ίδια την ώρα, χρειάζεστε και μια ημερομηνία), αυξάνει τον χρόνο κατά 2 δευτερόλεπτα και " οδηγεί» έναν κενό βρόχο μέχρι τη στιγμή που φθάνει αυτός ο νέος, «plus_two_seconds», ώρα για «ρίψη» δεδομένων στη θύρα COM. Επιπλέον, η ώρα "new plus_two_seconds" παρακολουθείται με διαφορετικό τρόπο (μέσω %time%, αν κάποιος ενδιαφέρεται). Αλλά για τα «τζάμπες» μιας τέτοιας απόφασης αργότερα. Τα δεδομένα που "πετάχθηκαν" στη θύρα COM αναλύονται από το Arduino και στη συνέχεια ρυθμίζουν την ώρα στη μονάδα. Όλα φαίνονται απλά, λογικά και βολικά. Αλλά υπάρχει μια πολύ κακή λέξη «ΑΛΛΑ». Όλα αυτά φαίνεται να έχουν γραφτεί από έναν Γερμανό και τα τοπικά του πρότυπα στα Windows διαφέρουν από τα «δικά μας», και συγκεκριμένα, το κλασματικό μέρος χωρίζεται με τελεία και όχι με κόμμα. Όταν εκκινείται με εγχώρια τοπικά πρότυπα, το αρχείο δέσμης δεν λειτουργεί, επειδή σε αυτό ο χρόνος εξόδου από τον κενό βρόχο περιγράφεται από τη συνθήκη σύγκρισης με το XX:XX:XX.xxx. Λοιπόν, πρέπει να βάλετε κόμμα αντί για τελεία - και αυτό είναι, "Τα διόρθωσα τα πάντα". Αλλά δεν είναι μόνο αυτό (μπορείτε να ελέγξετε ποιος άλλος θυμάται τι είδους κακό είναι να προγραμματίζεις σε «βιβλία παρτίδας»). Το αρχείο σώματος πρέπει να διορθωθεί πιο σοβαρά. Και το διόρθωσα χρησιμοποιώντας "πατάκια επαναφοράς" και ένα "εγχειρίδιο" για το DOS. Το "Batnik" το έφτιαξε, αλλά το σκίτσο δεν λειτούργησε - η ώρα δεν είχε οριστεί. Δηλαδή, στάλθηκαν δεδομένα στη θύρα, το Arduino το είδε, αλλά "κάτι πήγε στραβά".

Ας ρίξουμε μια ματιά στο τι στέλνει το αρχείο δέσμης στο Arduino και σε ποια μορφή (για αναφορά).

Περίπτωση 83: //S = δεύτερη περίπτωση 68: //D = Λεπτό (Daghigheh στα περσικά) περίπτωση 72: //H = Περίπτωση ώρας 84: //T = Ημέρα του μήνα (Ετικέτα στα γερμανικά) περίπτωση 77: /// M = Περίπτωση μήνα 74: /// J = Έτος (Jahr στα Γερμανικά)
Τα δεδομένα αποστέλλονται με τη μορφή S**~D**~H**~T*~M**~J****~, όπου ~ είναι 2 byte επιστροφής μεταφοράς. Σύνολο, 31 byte. Δεν φαίνεται πολύ, τα δεδομένα θα σταλούν γρήγορα.

Ωστόσο, υπάρχει και μια ταλαιπωρία - όπως μπορείτε να δείτε, η ημέρα της εβδομάδας δεν αποστέλλεται. Μόνο την ημέρα του μήνα. Θα υπάρξει πρόβλημα με την εφαρμογή ρολογιών με ξυπνητήρια που εξαρτώνται από τις ημέρες της εβδομάδας. Η ημέρα της εβδομάδας θα πρέπει να οριστεί «με το χέρι» στο σκίτσο, κάτι που υποδηλώνει και πάλι κάποια «διάθεση» του σκίτσου, την κατωτερότητά του.

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

Λογισμικό και υλικό.

Για να λειτουργήσουν όλα, χρειάζεστε 2 στοιχεία: ένα πρόγραμμα για Windows και έναν συνδυασμό υλικού-λογισμικού Arduino.

Πρώτον, γενικά δεδομένα για το πρωτόκολλο ανταλλαγής. Μόλις ήμουν ελεύθερος να επιλέξω τη μορφή δεδομένων που θα σταλούν, αποφάσισα ότι η αποστολή 31 byte πληροφοριών δεν ήταν λογική και μείωσα τα μεταδιδόμενα δεδομένα σε 4 byte. Λοιπόν, ήταν αρκετό; Τι μπορείτε να βάλετε σε 4 byte; Ναι, φτάνει. Όλα όσα χρειάζεστε χωράνε. Είμαι σίγουρος ότι πολλοί έχουν μαντέψει τι είναι τα 4 byte. Για όσους δεν το έχουν μαντέψει, θα παραθέσω ένα απόσπασμα ενός άρθρου από τη Wikipedia:

Η ώρα UNIX (ώρα POSIX) είναι ένα σύστημα για την περιγραφή στιγμών στο χρόνο, που υιοθετήθηκε στο UNIX και σε άλλα συμβατά με POSIX λειτουργικά συστήματα. Ορίζεται ως ο αριθμός των δευτερολέπτων που έχουν περάσει από τα μεσάνυχτα (00:00:00 UTC) 1 Ιανουαρίου 1970 (Πέμπτη).
Ο χρόνος UNIX αναπαρίσταται ως ένας ακέραιος αριθμός που αυξάνεται με κάθε δευτερόλεπτο που περνά χωρίς να χρειάζονται υπολογισμοί για τον προσδιορισμό του έτους, του μήνα, της ημέρας, της ώρας ή του λεπτού για αναγνωσιμότητα από τον άνθρωπο. Ο σύγχρονος χρόνος UNIX είναι συνεπής με το UTC - η μέτρηση γίνεται σε δευτερόλεπτα SI.

Έτσι, ο ακέραιος που αποθηκεύει χρόνο UNIX καταλαμβάνει 4 byte, που είναι αρκετά για να διαρκέσει έως και 2.147.483.648 δευτερόλεπτα. Και μετά δυνατόνπιθανά προβλήματα. Γιατί δυνατότητες; Γιατί αυτό είναι το όριο στο οποίο ο αριθμός Μπορείνα ερμηνευθεί ως αρνητικό (όπως με τα iPhone πολλών περίεργων συντρόφων ταυτόχρονα). Ίσως, αλλά δεν θα συμβεί απαραίτητα - εξαρτάται από το αν τα χέρια των προγραμματιστών μεγαλώνουν από το μέρος που παρέχει η φύση. Ο αριθμός των δευτερολέπτων που υποδεικνύεται αντιστοιχεί στο 03:14:08 19-Ιαν-2038. Μέχρι αυτή τη στιγμή, μπορείτε σιγά σιγά να μεταβείτε σε μια έκδοση 64-bit του λειτουργικού συστήματος, όπου ο χρόνος θα αποθηκεύεται σε μια μεταβλητή 8 byte, η οποία θα διαρκέσει εύκολα για τα επόμενα 292 δισεκατομμύρια χρόνια. Υπάρχει πιθανότητα αυτό να είναι αρκετό για τη ζωή μας. Και στη συνέχεια θα πρέπει να κάνετε αναβάθμιση στην έκδοση 128-bit του UNIX.

Ποια προβλήματα έλυσα με το να μπω σε αυτήν την επιλογή; Πρώτον, μείωσε σημαντικά τον αριθμό των byte που μεταφέρθηκαν, γεγονός που αυξάνει την ακρίβεια της ρύθμισης του χρόνου κατά χιλιοστά του δευτερολέπτου. Τέλεια, σωστά; Και δύο: (μάλλον) έκανα πιο εύκολη τη συμβατότητα με το Linux. Προς ντροπή μου, δεν μπορώ να συνηθίσω στο Linux και κυρίως χρησιμοποιώ μόνο Windows. Μπορώ να γράψω ένα πρόγραμμα προώθησης για αυτά τα Windows, αλλά όχι για το Linux. Αλλά πιστεύω ότι στο Linux μπορείτε να λάβετε την τιμή χρόνου UNIX πολύ πιο εύκολα από ότι στα Windows και να στείλετε αυτόν τον αριθμό στη θύρα COM.

Κανένας πρόσθετοςΔεν χρειάζεται να μεταδώσετε δεδομένα όπως η ημέρα της εβδομάδας και ούτω καθεξής. Μόνο ώρα UNIX. Όλα τα άλλα γίνονται στο Arduino.

Τώρα λίγο λεπτομέρειες άμεσα πρώτασυστατικό - ένα πρόγραμμα για Windows. Το πρόγραμμα είναι γραμμένο στους παλιούς καλούς Δελφούς. Κατά την εκκίνηση, ένα αναδυόμενο παράθυρο σας ζητά να επιλέξετε μια θύρα COM για αποστολή δεδομένων. Ας διαλέξουμε. Οι υπόλοιπες ρυθμίσεις πρέπει να παραμείνουν ως προεπιλεγμένες.

Πώς λειτουργεί το πρόγραμμα; Μετατρέπει τη μορφή ώρας των Windows στη μορφή ώρας UNIX, δηλαδή τον αριθμό των δευτερολέπτων από τα μεσάνυχτα της 1ης Ιανουαρίου 1970. Στη συνέχεια προσθέτει 3 δευτερόλεπτα και «πέφτει» σε έναν κενό βρόχο (προφανώς διαρκεί λιγότερο από αυτά τα επιπλέον 3 δευτερόλεπτα), η έξοδος από τον οποίο γίνεται στον απαιτούμενο αριθμό δευτερολέπτων, όσο το δυνατόν πιο κοντά στα 000 χιλιοστά του δευτερολέπτου. Με άλλα λόγια, παρακολουθείται η εμφάνιση της αρχής αυτού του δευτερολέπτου χρόνου, η τιμή του οποίου θα πρέπει να σταλεί στο Arduino. Συμφωνώ, η αποστολή δεδομένων που, για παράδειγμα, τώρα είναι XXXXXXXXX5 δευτερόλεπτα ενώ στην πραγματικότητα είναι ήδη, για παράδειγμα, XXXXXXXXX5 και 756 χιλιοστά (για παράδειγμα) δευτερόλεπτα, δεν θα ήταν σωστή. Αυτός είναι ο λόγος για τον οποίο πρέπει να παρακολουθείτε την αρχή του δευτερολέπτου για να ξεκινήσετε τη μεταφορά δεδομένων. Μετά τη μεταφορά των δεδομένων, το πρόγραμμα αναφέρει φιλικά την κατάσταση "Τέλος:)". Αυτό ολοκληρώνει την αποστολή του προγράμματος.


Δεύτεροςσυστατικό - υλικό και λογισμικό - Arduino. Υπάρχουν 2 ποικιλίες«υλισμικό» για αυτό το έργο: μια «πλήρης» έκδοση με οθόνη και κουμπί και μια «απογυμνωμένη» έκδοση για γρήγορη ρύθμιση του χρόνου της μονάδας, συναρμολογημένη από «σκασμό και μπαστούνια». Σχετικά με τις διαφορές τους - παρακάτω. Η "πλήρης" έκδοση αποτελείται από ένα Arduino Nano, μια ασπίδα 1602 με "προσαρμογέα" από το I2C στην ασπίδα, ένα προαιρετικό κουμπί επαναφοράς Arduino και μια κεφαλίδα pin (θηλυκό) για τη σύνδεση της μονάδας ρολογιού. Επίσης, προαιρετικά, από το σώμα της συσκευής με αυτοκόλλητο «χαριτωμένο». Η "απογυμνωμένη" έκδοση αποτελείται από ένα Arduino (Uno, Nano, Pro Mini + τον "σωστό" προσαρμογέα USB με DTR) και 4 καλώδια για τη σύνδεση της μονάδας ρολογιού.



Όπως φαίνεται από τα διαγράμματα, η "πλήρης" έκδοση, εκτός από την έκδοση "απογυμνωμένη", περιέχει ένα κουμπί επαναφοράς και μια οθόνη 1602 με "προσαρμογέα". Και οι δύο εκδόσεις είναι απολύτως ίδιες στην κύρια λειτουργικότητα - ρύθμιση του ώρα. Η οθόνη χρειάζεται μόνο για να εμφανιστούν τα στάδια της διαδικασίας και, με την ολοκλήρωση της διαδικασίας ρύθμισης της ώρας, θα εμφανιστεί η πρόσφατα καθορισμένη ώρα, ημερομηνία και ημέρα της εβδομάδας. Επιπλέον, μέχρι εκείνη τη στιγμή τα δεδομένα θα έχουν ήδη να διαβαστεί από την ίδια τη μονάδα ρολογιού. Στην έκδοση "απογυμνωμένη", ο ρόλος της οθόνης παίζει το LED που είναι ενσωματωμένο στην πλακέτα του Arduino: μετά τη διαδικασία ρύθμισης της νέας ώρας, θα αρχίσει να ανάβει. όλη η ένδειξη.

Σε τι χρησιμεύει το κουμπί επαναφοράς; Έτσι ώστε στην πλήρη έκδοση, μετά τη ρύθμιση της ώρας, το Arduino θα μπει σε έναν ατελείωτο βρόχο για να εμφανίσει την πολύ πρόσφατα καθορισμένη ώρα, δηλαδή στην πραγματικότητα θα γίνει ρολόι. Επιπλέον, είναι ρολόγια που κατασκευάζονται βιαστικά και επομένως δεν μπορούν να αντικαταστήσουν ένα κανονικό ρολόι για διάφορους λόγους (η επιλογή των δευτερολέπτων πραγματοποιείται με καθυστέρηση, η ένδειξη ώρας θα εξαφανιστεί όταν απενεργοποιηθεί η τροφοδοσία). Άλλωστε, ο στόχος είναι να βεβαιωθείτε ότι ο χρόνος συγχρονίζεται σωστά, τίποτα περισσότερο. Επομένως, για να συγχρονίσετε την επόμενη μονάδα ρολογιού, δεν μπορείτε να κάνετε χωρίς επαναφορά (πιο συγκεκριμένα, μπορείτε να το κάνετε «παραμορφώνοντας» το καλώδιο USB). Με άλλα λόγια, ο σκοπός του κουμπιού είναι καθαρά χρηστικός. Εάν θέλετε, μπορείτε να το κάνετε χωρίς αυτό.

Πώς να κάνει flash το Arduino, αφού υπάρχουν δύο εκδόσεις υλικού, αλλά μόνο ένα σκίτσο; Για να μεταγλωττίσετε τη "σωστή" έκδοση του υλικολογισμικού, πρέπει να ορίσετε την επιθυμητή τιμή παραμέτρου στην κεφαλίδα του σκίτσου πλήρη έκδοση: αληθής για την "πλήρη" έκδοση ή ψευδής - για "γδύθηκε". Ο μεταγλωττιστής θα καθορίσει επομένως για ποια έκδοση του υλικού θα μεταγλωττίσει το υλικολογισμικό.

Έτσι, έχουμε το διάγραμμα σύνδεσης, χρειαζόμαστε τον κώδικα σκίτσου. Λάβετε υπόψη ότι για να λειτουργήσει σωστά το σκίτσο με την "πλήρη" έκδοση, απαιτείται βιβλιοθήκη LiquidCrystal I2Cτου Frank de Brabander(εγκατεστημένο από το αποθετήριο χρησιμοποιώντας το Library Manager). Χρειαζόμαστε επίσης μια βιβλιοθήκη για την υποστήριξη της μονάδας ρολογιού, και όχι μια οποιαδήποτε :). Κατέβασε εδώ: . Τακτοποιήσαμε τις βιβλιοθήκες.

Εδώ είναι ο κώδικας για το σκίτσο:

//================================================ ====== ρύθμιση διαθέσιμη για αλλαγή === ===================================== #define fullVersion true //true = "πλήρης" έκδοση με οθόνη. false = "απογυμνωμένη" έκδοση με ενσωματωμένη λυχνία LED //==================================== ============ χρησιμοποιημένες βιβλιοθήκες και δήλωση μεταβλητών = =============================== ==== #include #περιλαμβάνω #if (fullVersion) #include #endif unsigned long t1 = 0; //μεταβλητή για τον λαμβανόμενο χρόνο χωρίς υπογραφή long t2 = 0; //μεταβλητή για το ληφθέν byte χρόνου b; //buffer για λήψη δεδομένων από τη θύρα COM #if (fullVersion) byte day = 0; #endif ρολόι DS3231; RTCDateTime dat1; #if (fullVersion) LiquidCrystal_I2C lcd(0x3F,16,2); //Οι Κινέζοι λατρεύουν τη νέα διεύθυνση για "προσαρμογείς" από το i2c στην οθόνη #endif //============================= == ================================================= ===== ==================================== ρύθμιση κενού())( #if ( !fullVersion) // σχετική μόνο για την "περικομμένη" έκδοση - η αρχή της ενότητας κώδικα pinMode(13, OUTPUT); digitalWrite(13,LOW); #endif //σχετικό μόνο για την "κομμένη" έκδοση - το τέλος του ενότητα κώδικα clock.begin(); Serial.begin(9600); #if (fullVersion) //σχετικό μόνο για την "πλήρη" έκδοση - η αρχή της ενότητας κώδικα lcd.init(); lcd.backlight(); lcd .setCursor(0,0); lcd.print("COMport 9600 8N1"); //υπαινιγμός ποιες παραμέτρους θύρας COM να επιλέξετε στο πρόγραμμα lcd.setCursor(0,1); lcd.print("Έτοιμο για συγχρονισμό") ; //μήνυμα κατάστασης - έτοιμο για καθυστέρηση συγχρονισμού(1000); #endif //σχετικό μόνο για την "πλήρη" έκδοση - το τέλος της ενότητας κώδικα) void loop())( if (Serial.available())( / /αν υπάρχει "gunpowder in the flask" της θύρας COM Serial.readBytes(b,4); //μετρήστε και τα 4 byte (δεν περιμένουμε τίποτα άλλο) t1=b; t2=(t1<<24); //поместить значение байта в 4-байтную переменную и передвинуть его на 3 байта влево t1=b; t2+=(t1<<16); //поместить значение байта в 4-байтную переменную и передвинуть его на 2 байта влево t1=b; t2+=(t1<<8); //поместить значение байта в 4-байтную переменную и передвинуть его на 1 байт влево t2+=b; //поместить значение байта в 4-байтную переменную clock.setDateTime(t2); //установить полученное время на DS3231 #if (fullVersion) //актуально только для "полной" версии - начало участка кода lcd.clear(); lcd.setCursor(0,0); lcd.print("Done:) : :"); while (true){ //начало бесконечного цикла по отображению свежеустановленных времени и даты dat1 = clock.getDateTime(); if (dat1.day != day){ day = dat1.day; lcd.setCursor(0,1); if (dat1.day < 10) lcd.print("0"); lcd.print(day); lcd.print("-"); switch (dat1.month){ //выбираем буквенное соответствие месяца по цифре case 1:{ lcd.print("Jan"); break; } case 2:{ lcd.print("Feb"); break; } case 3:{ lcd.print("Mar"); break; } case 4:{ lcd.print("Apr"); break; } case 5:{ lcd.print("May"); break; } case 6:{ lcd.print("Jun"); break; } case 7:{ lcd.print("Jul"); break; } case 8:{ lcd.print("Aug"); break; } case 9:{ lcd.print("Sep"); break; } case 10:{ lcd.print("Oct"); break; } case 11:{ lcd.print("Nov"); break; } case 12:{ lcd.print("Dec"); break; } default:{ lcd.print("???"); break; } }//switch month lcd.print("-"); lcd.print(dat1.year); lcd.print(" "); switch(dat1.dayOfWeek){ //выбираем буквенное соответствие дня недели по цифре case 1:{ lcd.print("Mon"); break; } case 2:{ lcd.print("Tue"); break; } case 3:{ lcd.print("Wed"); break; } case 4:{ lcd.print("Thu"); break; } case 5:{ lcd.print("Fri"); break; } case 6:{ lcd.print("Sat"); break; } case 7:{ lcd.print("Sun"); break; } default:{ lcd.print("???"); break; } }//switch dayOfWeek }//if date changed lcd.setCursor(8,0); if (dat1.hour < 10) lcd.print("0"); lcd.print(dat1.hour); lcd.setCursor(11,0); if (dat1.minute < 10) lcd.print("0"); lcd.print(dat1.minute); lcd.setCursor(14,0); if (dat1.second < 10) lcd.print("0"); lcd.print(dat1.second); delay(995); }//while #else //актуально только для "урезанной" версии - начало участка кода digitalWrite(13, HIGH); delay(3000); digitalWrite(13, LOW); #endif //актуально только для "полной" версии - конец участка кода }//if Serial }//loop


Μερικές φωτογραφίες της "πλήρης" έκδοσης της τελικής συσκευής.


Και τέλος, ένα βίντεο της συσκευής που λειτουργεί "στη μάχη":

Πού μπορώ να κατεβάσω το σκίτσο και το πρόγραμμα;

Κατεβάστε το σκίτσο (Dropbox).
Κατεβάστε το πρόγραμμα για Windows (Dropbox).

"Πλεονεκτήματα και μειονεκτήματα".

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

Σύνολο.

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

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

Τα καλύτερα.

Σκοπεύω να αγοράσω +48 Προσθήκη στα αγαπημένα Μου άρεσε η κριτική +60 +114

Χαρακτηριστικά γνωρίσματα:

  • Ακρίβεια ±2 ppm σε εύρος θερμοκρασίας 0°C έως +40°C
  • Ακρίβεια ±3,5 ppm στο εύρος θερμοκρασίας -40°C έως +85°C
  • Είσοδος για σύνδεση αυτόνομης πηγής ρεύματος για εξασφάλιση συνεχούς λειτουργίας
  • Εύρος θερμοκρασίας λειτουργίας εμπορική: από 0°C έως +70°C βιομηχανική: -40°C έως +85°C
  • Χαμηλή κατανάλωση
  • Ρολόι πραγματικού χρόνου που μετράει δευτερόλεπτα, λεπτά, ώρες, ημέρες της εβδομάδας, ημέρες του μήνα, μήνα και έτος με διόρθωση δίσεκτου έτους έως 2100
  • Δύο καθημερινοί συναγερμοί
  • Έξοδος τετραγωνικού κύματος με προγραμματιζόμενη συχνότητα
  • Γρήγορη (400 kHz) διεπαφή I 2 C
  • Ισχύς 3,3 V
  • Ψηφιακός αισθητήρας θερμοκρασίας με ακρίβεια μέτρησης ±3°C
  • Εγγραφή που περιέχει δεδομένα σχετικά με την απαιτούμενη προσαρμογή
  • nonRST επαναφορά εισόδου/εξόδου

Εφαρμογή:

  • Διακομιστές
  • Ηλεκτρονικοί μετρητές ηλεκτρικής ενέργειας
  • Εξοπλισμός τηλεματικής
  • Συστήματα GPS

Τυπικό διάγραμμα σύνδεσης για DS3231:

Γενική περιγραφή:

Το DS3231 είναι ένα ρολόι πραγματικού χρόνου υψηλής ακρίβειας (RTC) με ενσωματωμένη διεπαφή I 2 C, ταλαντωτή κρυστάλλου με αντιστάθμιση θερμοκρασίας (TCXO) και αντηχείο χαλαζία. Η συσκευή διαθέτει είσοδο για τη σύνδεση εφεδρικής αυτόνομης πηγής ρεύματος, η οποία επιτρέπει τη μέτρηση του χρόνου και τη μέτρηση της θερμοκρασίας ακόμα και όταν η κύρια τάση τροφοδοσίας είναι απενεργοποιημένη. Το ενσωματωμένο αντηχείο χαλαζία αυξάνει τη διάρκεια ζωής της συσκευής και μειώνει τον απαιτούμενο αριθμό εξωτερικών στοιχείων. Το DS3231 διατίθεται σε εμπορικές και βιομηχανικές εκδόσεις θερμοκρασίας και συσκευάζεται σε συσκευασία SO 300 mil 16 pin.

Το RTC παρέχει μέτρηση δευτερολέπτων, λεπτών, ωρών, ημερών της εβδομάδας, ημερών του μήνα και του έτους. Η ημερομηνία λήξης του μήνα καθορίζεται αυτόματα λαμβάνοντας υπόψη τα δίσεκτα έτη. Το ρολόι πραγματικού χρόνου λειτουργεί σε μορφή 24 ή 12 ωρών με ένδειξη του τρέχοντος μισού της ημέρας (ΠΜ/ΜΜ). Η συσκευή διαθέτει δύο καθημερινούς συναγερμούς και τετράγωνη έξοδο κυμάτων με προγραμματιζόμενη συχνότητα. Η ανταλλαγή δεδομένων με τη συσκευή πραγματοποιείται μέσω της ενσωματωμένης σειριακής συμβατής διεπαφής I 2 C.

". Ας εξοικειωθούμε με τη μονάδα ρολογιού πραγματικού χρόνου DS3231. Το άρθρο περιέχει οδηγίες βίντεο, λίστες προγραμμάτων, σκοπό και μεθόδους σύνδεσης μονάδων από την οικογένεια DS στο Arduino.

DS3231 Μονάδα ρολογιού πραγματικού χρόνου

Τι είναι η μονάδα ρολογιού πραγματικού χρόνου DS3231;

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

Μονάδα DS3231Στην ουσία είναι ένα συνηθισμένο ρολόι. Οι πλακέτες Arduino διαθέτουν ήδη ενσωματωμένο αισθητήρα χρόνου Millis, ωστόσο, λειτουργεί μόνο όταν εφαρμόζεται ρεύμα στην πλακέτα. Εάν απενεργοποιήσετε και στη συνέχεια ενεργοποιήσετε το Arduino, ο χρόνος Millis θα μηδενιστεί. Και το DS3231 διαθέτει μπαταρία, η οποία, ακόμη και όταν η πλακέτα Arduino είναι αποσυνδεδεμένη, συνεχίζει να «τροφοδοτεί» τη μονάδα, επιτρέποντάς της να μετράει το χρόνο.

Η μονάδα μπορεί να χρησιμοποιηθεί ως ρολόι ή ξυπνητήρι που βασίζεται σε πλακέτες Arduino. Ή ως ειδοποίηση για διάφορα συστήματα, για παράδειγμα σε ένα Smart Home.

DS3231 Προδιαγραφές:

  • η ενότητα υπολογίζει ώρες, λεπτά, δευτερόλεπτα, ημερομηνίες, μήνες, έτη (λαμβάνονται υπόψη τα δίσεκτα έτη έως το 2100).
  • Για να συνδεθείτε σε διάφορες συσκευές, το ρολόι συνδέεται μέσω διεπαφής I2C.

32 Χιλ— Έξοδος σχεδιασμένη για παροχή εξωτερικής ισχύος >12V.

S.Q.W.— Προγραμματιζόμενη έξοδος σήματος τετραγωνικού κύματος.

SCL– Μέσω αυτού του pin, ανταλλάσσονται δεδομένα με το ρολόι μέσω της διεπαφής I2C.

Σ.Δ.Α.– Τα δεδομένα από το ρολόι μεταδίδονται μέσω αυτής της ακίδας.

VCC– Τροφοδοτικό για ρολόι πραγματικού χρόνου, απαιτείται 5 volt. Εάν δεν παρέχεται τάση σε αυτόν τον ακροδέκτη, το ρολόι μεταβαίνει σε κατάσταση αναστολής λειτουργίας.

GND- Γη.

Διάγραμμα σύνδεσης για το ρολόι πραγματικού χρόνου DS3231 και ένα απλό πρόγραμμα

Καρφίτσες SDA και SCL σε διαφορετικές πλακέτες Arduino:

Σ.Δ.Α. SCL
ΟΗΕ Α4 Α5
Μίνι Α4 Α5
Νανο Α4 Α5
Mega2560 20 21
Λεονάρντο 2 3

Ας συνδέσουμε τη μονάδα ρολογιού πραγματικού χρόνου στο Arduino UNO. SDA - pin A4, SCL - pin A5.

Το παρακάτω πρόγραμμα είναι κατάλληλο για τη λειτουργία του μοντέλου (μπορείτε απλώς να αντιγράψετε το πρόγραμμα στο Arduino IDE):

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

void setup() (
καθυστέρηση (300);
Serial.begin(9600);
time.begin();
}
void loop()



}
}

Σε αυτό το σκίτσο, ο χρόνος απλά μετρά αντίστροφα.

Πρώτα απ 'όλα, στο sktech, συνδέστε τη βιβλιοθήκη iarduino_RTC.h.

Εκεί, υποδείξτε το ακριβές όνομα της μονάδας σας για να εργαστείτε σωστά μαζί της.

Ως αποτέλεσμα, έχουμε την έξοδο χρόνου από τη μονάδα DS3231 στην οθόνη της θύρας. Εμφανίζονται οι ώρες, τα λεπτά, τα δευτερόλεπτα.

Στο επόμενο σκίτσο θα προσθέσουμε μια συνάρτηση καθορισμένος χρόνος, το οποίο σας επιτρέπει να ορίσετε τον αρχικό χρόνο αντίστροφης μέτρησης.

#περιλαμβάνω
χρόνος iarduino_RTC(RTC_DS3231);
void setup() (
καθυστέρηση (300);
Serial.begin(9600);
time.begin();
time.settime(0,0,18,24,04,17,1); // 0 δευτ., 0 λεπτά, 18 ώρες, 24 Απριλίου 2017, Δευτέρα
}
void loop()
if(millis()%1000==0)( // αν έχει περάσει 1 δευτερόλεπτο
Serial.println(time.gettime("d-m-Y, H:i:s, D")); // ώρα εμφάνισης
καθυστέρηση(1); // παύση για 1 ms, ώστε να μην εμφανίζεται η ώρα πολλές φορές σε 1 ms
}
}

Στο παράδειγμα, ο χρόνος αρχίζει να μετράει από 0 δευτ., 0 λεπτά, 18 η ώρα, 24 Απριλίου 2017, Δευτέρα.

Αναρτήσεις μαθήματος:

  1. Πρώτο μάθημα: .
  2. Δεύτερο μάθημα: .
  3. Τρίτο μάθημα: .
  4. Τέταρτο μάθημα: .
  5. Πέμπτο μάθημα: .
  6. Μάθημα έκτο: .
  7. Έβδομο μάθημα: .
  8. Όγδοο μάθημα: .
  9. Ένατο μάθημα:

Σήμερα θα συνεχίσουμε την αναζήτησή μας για το τέλειο τσιπ ρολογιού πραγματικού χρόνου (RTC). Θα φτιάξουμε ρολόγια με βάση το . Η οθόνη θα είναι πιο βολική για ανάπτυξη - μια οθόνη LCD, η οποία θα εμφανίζει όλες τις πληροφορίες ταυτόχρονα εκτός από τις ρυθμίσεις. Σε αυτή τη μορφή, το ρολόι είναι βολικό για χρήση ως επιλογή επιφάνειας εργασίας.

Λοιπόν, ας δούμε το ίδιο το τσιπ DS3231. Το DS3231 είναι ένα ρολόι πραγματικού χρόνου με εξαιρετικά ακριβή κίνηση (οι κατασκευαστές επέλεξαν τη λέξη) χάρη σε ένα ενσωματωμένο αντηχείο χαλαζία με αντιστάθμιση θερμοκρασίας. Η διεπαφή μεταφοράς δεδομένων είναι I 2 C. Αυτό το μικροκύκλωμα διαθέτει επίσης είσοδο για την τάση εφεδρικής μπαταρίας· όταν η κύρια τροφοδοσία είναι απενεργοποιημένη, το μικροκύκλωμα μεταβαίνει αυτόματα σε λειτουργία από την εφεδρική μπαταρία, η ακρίβεια λειτουργίας από την εφεδρική μπαταρία δεν είναι επηρεάζονται. Είναι πολύ ευχάριστο, έτσι δεν είναι; Το DS3231 υποστηρίζει μέτρηση δευτερολέπτων, λεπτών, ωρών, ημερών του μήνα (ημερομηνία), ημερών της εβδομάδας, μηνών και ετών (συμπεριλαμβανομένου του δίσεκτου έτους για μήνες). Υποστηρίζει εργασία σε μορφή 12 και 24 ωρών. Υπάρχουν 2 ξυπνητήρια με δυνατότητα παραμετροποίησης και παρακολούθησης της κατάστασής τους. Ρύθμιση της ακρίβειας αντιστάθμισης θερμοκρασίας. Και επίσης δύο εξόδους - στα 32 kHz (η έξοδος είναι 32,768 kHz) και μια προγραμματιζόμενη έξοδος από 1 Hz έως 8,192 kHz. Υπάρχει επίσης μια ακίδα επαναφοράς - RST. Το τσιπ ρολογιού σε πραγματικό χρόνο είναι διαθέσιμο σε συσκευασία SO-16. Η θήκη είναι αρκετά μεγάλη, αλλά αν σκεφτείς ότι υπάρχει ήδη χαλαζίας μέσα, και επίσης αντισταθμίζεται η θερμοκρασία, τότε μου φαίνεται ότι όλα είναι καλά με τις διαστάσεις. Το DS3231 έχει ένα δίδυμο σε μορφή DS3232, το οποίο όμως έχει άλλα 2 πόδια. Όλα αυτά θυμίζουν πολύ τα προϊόντα NXP - τσιπ ρολογιού PCA2129 και PCF2129. Παρόμοιος ενσωματωμένος αντηχείο χαλαζία με αντιστάθμιση θερμοκρασίας, και τα δύο είναι τα ίδια δίδυμα μόνο με διαφορετικούς αριθμούς n.c. pins και παρόμοιες λειτουργίες σε σχέση με το DS3231 εκτός από τη μέτρηση χρόνου.

Το RTC DS3231 διατίθεται προς πώληση με τη μορφή μονάδων με την απαραίτητη καλωδίωση, καθώς και με ένα τσιπ EEPROM, το οποίο τις περισσότερες φορές δεν χρειάζεται, προσθέτει μόνο βάρος:

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

Αυτό που είναι σημαντικό να γνωρίζετε όταν εργάζεστε με ένα τέτοιο τσιπ ρολογιού σε πραγματικό χρόνο είναι πώς να εξάγετε δεδομένα από αυτό ή να τα γράφετε εκεί. Το ρολόι έχει διεπαφή I 2 C. Για να γράψετε δεδομένα (και αυτό είναι επίσης απαραίτητο για να διαβάσετε τα δεδομένα), πρέπει να περάσετε την συνθήκη έναρξης (αυτές οι εντολές εκτελούνται με χρήση υλικού ή λογισμικού I 2 C για το μικροελεγκτή), μετά περάστε τη διεύθυνση του τσιπ με την εγγραφή bit, μετά περάστε τη διεύθυνση του μητρώου στον οποίο θα έχουμε πρόσβαση και, στη συνέχεια, μεταφέρετε ένα byte δεδομένων σε αυτόν τον καταχωρητή, εάν στη συνέχεια μεταφέρετε ένα άλλο byte δεδομένων, θα είναι γραμμένο στο επόμενο μητρώο και ούτω καθεξής. Όταν τελειώσετε, πρέπει να περάσετε μια συνθήκη διακοπής. Γραφική αναπαράσταση των παραπάνω στο σχήμα:

Απαιτείται εγγραφή δεδομένων για την αρχική ρύθμιση καθώς και για τη ρύθμιση της τρέχουσας ώρας. Στη συνέχεια, πρέπει να λαμβάνουμε συνεχώς δεδομένα σχετικά με την τρέχουσα ώρα και ημερομηνία. Για να γίνει αυτό, είναι απαραίτητο να διαβάσετε από τα μητρώα που αποθηκεύουν αυτές τις πληροφορίες. Η ανάγνωση αποτελείται από δύο διαδικασίες - τον καθορισμό ενός δείκτη στον επιθυμητό καταχωρητή και την ανάγνωσή του. Για να ορίσετε έναν δείκτη στον επιθυμητό καταχωρητή, πρέπει να περάσετε τη συνθήκη έναρξης και, στη συνέχεια, να περάσετε τη διεύθυνση του τσιπ με το bit εγγραφής και ένα byte με τη διεύθυνση καταχωρητή. Στη συνέχεια είναι είτε μια συνθήκη διακοπής και μετά μια συνθήκη έναρξης, είτε απλώς μια επανεκκίνηση. Τώρα η δεύτερη διαδικασία είναι η απευθείας ανάγνωση από τα μητρώα. Η εκκίνηση μεταδίδεται, στη συνέχεια πρέπει να στείλετε τη διεύθυνση του μικροκυκλώματος με ένα bit ανάγνωσης και στη συνέχεια να διαβάσετε τους καταχωρητές στον απαιτούμενο αριθμό και μετά την ολοκλήρωση, να μεταδώσετε την κατάσταση διακοπής. Εάν οι πληροφορίες από τον καταχωρητή έχουν διαβαστεί, ο δείκτης μετακινείται αυτόματα στον επόμενο καταχωρητή χωρίς περιττές ενέργειες από την πλευρά του μικροελεγκτή (κύρια συσκευή). Το σχήμα απεικονίζει όλα όσα αναφέρθηκαν παραπάνω σχετικά με την ανάγνωση καταχωρητών χρησιμοποιώντας τη διεπαφή I 2 C:

Διεύθυνση τσιπ:

  • για εγγραφή - 0b11010000
  • για ανάγνωση - 0b11010001

Ο κώδικας C θα μοιάζει με αυτό:

// συναρτήσεις με ρολόι ============================================= =================================================== ================== ======== // αρχικοποίηση αρχικών ρυθμίσεων void RTC_init(void)( i2c_start_cond(); // έναρξη i2c i2c_send_byte(RTC_adr_write); // μεταφορά της διεύθυνσης της συσκευής, λειτουργία εγγραφής i2c_send_byte(0x0E); // μεταφορά της διεύθυνσης μνήμης i2c_send_byte(0b00100000); // έναρξη μετατροπής θερμοκρασίας και έξοδος στο 1 Hz i2c_send_byte(0b00001000); //enable i2c2; // stop i2c ) // λήψη ώρας και ημερομηνίας void RTC_read_time(void)( i2c_start_cond() ; // start i2c i2c_send_byte(RTC_adr_write); // μεταφορά της διεύθυνσης της συσκευής, λειτουργία εγγραφής i2c_send_byte(0x00); // μεταφορά της διεύθυνσης μνήμης i2c_stop_cond(); // stop i2c i2c_start_cond(); // εκκίνηση i2c i2c_send_byte(RTC_adr_read); / / μετάδοση διεύθυνσης συσκευής, λειτουργία ανάγνωσης sec = bcd(i2c_get_byte(0)); // ανάγνωση δευτερολέπτων, ACK minte byc_d (0)); // λεπτά ανάγνωσης, ώρα ACK = bcd(i2c_get_byte(0)); / / ανάγνωση ρολογιού, ACK wday = bcd(i2c_get_byte(0)); // ανάγνωση της ημέρας της εβδομάδας, ACK day = bcd(i2c_get_byte(0)); // ανάγνωση του αριθμού, ACK μήνα = bcd(i2c_get_byte(0)); // μήνας ανάγνωσης, έτος ACK = bcd(i2c_get_byte(1)); // έτος ανάγνωσης, NACK i2c_stop_cond(); // stop i2c ) // ορίστε το χρόνο void RTC_write_time(unsigned char hour1, unsigned char min1, unsigned char sec1)( i2c_start_cond(); // start i2c i2c_send_byte(RTC_adr_write); // μεταφορά της λειτουργίας iby2tec_recording, 0x00) ; // μεταφορά διεύθυνσης μνήμης i2c_send_byte(bin(sec1)); // 0x00 δευτερόλεπτα (συνιστάται να προσδιορίσετε και δευτερόλεπτα;) i2c_send_byte(bin(min1)); // 0x01 λεπτά i2c_send_byte(bin(hour1)) . ); // μεταφορά διευθύνσεων συσκευής, λειτουργία εγγραφής i2c_send_byte(0x03); // μεταφορά διεύθυνσης μνήμης i2c_send_byte(bin(wday)); // 0x03 ημέρα της εβδομάδας (Κυριακή - 1, Δευτ. 2, Τρ. 3, Τετ. 4, Πέμ 5, Παρ 6, Σαβ 7 ) i2c_send_byte(bin(ημέρα)); // 0x04 ημέρα μήνα i2c_send_byte(bin(μήνας)); // 0x05 μήνας i2c_send_byte(bin(έτος)); // 0x06 έτος i2c_stop_cond(); // stop i2c ) // ανάγνωση της θερμοκρασίας void RTC_read_temper(void)( i2c_start_cond(); // start i2c i2c_send_byte(RTC_adr_write); // μεταφορά της διεύθυνσης της συσκευής, λειτουργία εγγραφής i2c_send_byte(0x11); // μεταφορά της διεύθυνσης κορυφής μνήμης i2c (); // διακοπή i2c i2c_start_cond(); // έναρξη i2c i2c_send_byte(RTC_adr_read); // μετάδοση διεύθυνσης συσκευής, λειτουργία ανάγνωσης t1 = i2c_get_byte(0); // ανάγνωση θερμοκρασίας MSB t2 = i2c_get_byte (1); // ανάγνωση Θερμοκρασία LSB i2c_stop_cond (); // διακοπή i2c t2=(t2/128); // μετατόπιση κατά 6 - ακρίβεια 0,25 (2 bit) // μετατόπιση κατά 7 - ακρίβεια 0,5 (1 bit) t2=t2*5; )

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

Ναι - ένα εξαιρετικό χαρακτηριστικό Το DS3231 είναι ότι το ίδιο τσιπ εκτελεί τις λειτουργίες ενός θερμομέτρου (αλλιώς πώς να πραγματοποιήσει αντιστάθμιση θερμοκρασίας) και τη δυνατότητα ανάγνωσης της τρέχουσας θερμοκρασίας. Η μέγιστη ανάλυση θερμοκρασίας είναι 0,25 βαθμοί Κελσίου. Επίσης, η περίοδος ενημέρωσης θερμοκρασίας είναι αρκετά μεγάλη - περίπου 1 λεπτό. Ναι, δεν χρειάζεται να το ενημερώσουμε γρήγορα.

Το διάγραμμα ολόκληρης της δομής του ρολογιού μοιάζει με αυτό:

Ο μικροελεγκτής επιλέχθηκε από την Atmega8 για την ευρεία διαθεσιμότητά του και τη χαμηλή τιμή του. Αυτός ο μικροελεγκτής μπορεί να χρησιμοποιηθεί τόσο σε πακέτο DIP-28 όσο και σε έκδοση SMD σε πακέτο TQFP-32. Η αντίσταση R3 είναι απαραίτητη για την αποφυγή αυθόρμητης επανεκκίνησης του μικροελεγκτή σε περίπτωση τυχαίου θορύβου στον ακροδέκτη PC6. Η αντίσταση R3 τραβάει την ισχύ συν σε αυτόν τον πείρο, δημιουργώντας αξιόπιστα ένα δυναμικό σε αυτόν. Για την οθόνη χρησιμοποιείται οθόνη υγρών κρυστάλλων (LCD). Χρησιμοποίησα την οθόνη 2004A - 4 γραμμές των 20 χαρακτήρων είναι περισσότερο για ομορφιά, ώστε να μπορείτε να χρησιμοποιήσετε μια πιο οικεία οθόνη - 2 γραμμές των 16 χαρακτήρων. Η οθόνη LCD συνδέεται με τον μικροελεγκτή χρησιμοποιώντας ένα σύστημα τεσσάρων bit. Η μεταβλητή αντίσταση R2 είναι απαραίτητη για τη ρύθμιση της αντίθεσης των χαρακτήρων στην οθόνη. Περιστρέφοντας το ρυθμιστικό αυτής της αντίστασης επιτυγχάνουμε τις πιο καθαρές ενδείξεις στην οθόνη για εμάς. Ο οπίσθιος φωτισμός της οθόνης LCD οργανώνεται μέσω των ακίδων "A" και "K" στην πλακέτα της οθόνης. Ο οπίσθιος φωτισμός ενεργοποιείται μέσω μιας αντίστασης περιορισμού ρεύματος - R1. Όσο υψηλότερη είναι η τιμή, τόσο πιο σκοτεινό θα φωτίζεται η οθόνη. Ωστόσο, αυτή η αντίσταση δεν πρέπει να παραμεληθεί για να αποφευχθεί η ζημιά στον οπίσθιο φωτισμό. Τα κουμπιά S1 - S4 ελέγχουν τις ρυθμίσεις του ρολογιού. Το LED δείχνει ότι ο συναγερμός έχει σβήσει. Το LED μπορεί να αντικατασταθεί με κάποιο είδος κυκλώματος ήχου. Οι αντιστάσεις R5 - R8 είναι συρόμενες και είναι απαραίτητες για το σχηματισμό ορθογώνιων παλμών στους ακροδέκτες του τσιπ ρολογιού. Αυτό είναι επίσης απαραίτητο για τη σωστή λειτουργία του πρωτοκόλλου I2C. Για την τροφοδοσία του κυκλώματος, χρησιμοποιείται ένα τσιπ γραμμικού σταθεροποιητή L7805, το οποίο μπορεί να αντικατασταθεί με ένα οικιακό ανάλογο του γραμμικού σταθεροποιητή πέντε volt KR142EN5A ή μπορείτε να χρησιμοποιήσετε ένα άλλο τσιπ σταθεροποιητή τάσης σύμφωνα με τη σύνδεσή του στο κύκλωμα (για παράδειγμα, LM317 ή σταθεροποιητές μεταγωγής LM2576, LM2596, MC34063 και ούτω καθεξής). Στη συνέχεια, τα 5 βολτ σταθεροποιούνται από ένα άλλο μικροκύκλωμα - AMS1117 σε μια έκδοση που δίνει έξοδο 3,3 βολτ. Το τσιπ ρολογιού, σύμφωνα με το φύλλο δεδομένων, τροφοδοτείται από τάση 3,3 βολτ. Ωστόσο, η μέγιστη τάση είναι 5,5 βολτ. Επομένως, αυτός ο σταθεροποιητής μπορεί να χρησιμοποιηθεί ή όχι, κατά την κρίση σας. Ο σταθεροποιητής τάσης AMS1117 μπορεί επίσης να αντικατασταθεί με την έκδοση ADJ (AMS1117ADJ) - δηλαδή, μια ρυθμιζόμενη έκδοση, θα χρειαστεί να ρυθμίσετε την απαιτούμενη τάση με αυτήν την επιλογήχρησιμοποιώντας δύο αντιστάσεις συνδεδεμένες στο μικροκύκλωμα σύμφωνα με το φύλλο δεδομένων του.

Το κύκλωμα συναρμολογήθηκε και διορθώθηκε χρησιμοποιώντας μια πλακέτα ανάπτυξης για τον μικροελεγκτή ATmega8:

Σκοπός των κουμπιών:

  • S1 - απενεργοποιεί το σήμα συναγερμού ή εξέρχεται στο κύριο μενού από οποιοδήποτε μενού ρυθμίσεων
  • S2- επαναφορά μικροελεγκτή
  • S3 - αλλάζει την ώρα ή την ημερομηνία στο μενού ρυθμίσεων
  • S4 - μπείτε στο μενού ρυθμίσεων και μετακινηθείτε στο μενού

Ο ακροδέκτης 32 kHz μπορεί να χρησιμοποιηθεί για τον έλεγχο της κρυσταλλικής συχνότητας. Συνδέουμε έναν μετρητή συχνότητας ή έναν παλμογράφο σε αυτόν τον πείρο και ελέγχουμε τη συχνότητα:

Όπως φαίνεται από το στιγμιότυπο οθόνης του παλμογράφου, η συχνότητα αντιστοιχεί περίπου σε 32,768 kHz (περίπου λόγω περιορισμών στην ανάλυση των μετρήσεων συχνότητας και είναι δύσκολο να προσδιοριστεί με τόση ακρίβεια "με το μάτι").

Το αποτέλεσμα ήταν ένα ρολόι με τα ακόλουθα χαρακτηριστικά:

  • ένδειξη χρόνου
  • εμφάνιση ημερομηνίας
  • ένδειξη ημέρας της εβδομάδας
  • ένδειξη δραστηριότητας ξυπνητηριού
  • 1 ξυπνητήρι με έξοδο σήματος από μικροελεγκτή
  • ένδειξη της θερμοκρασίας περιβάλλοντος (μόνο θετική θερμοκρασία εφαρμόζεται στο λογισμικό· η αρνητική θερμοκρασία, νομίζω, δεν μας χρησιμεύει)
  • ρυθμίσεις συναγερμού
  • ρυθμίσεις ώρας
  • ρυθμίσεις ημερομηνίας
  • Οθόνη LCD με οπίσθιο φωτισμό
  • αποθήκευση ρυθμίσεων και συνέχιση του ρολογιού όταν η κύρια τροφοδοσία είναι απενεργοποιημένη

Ας συνοψίσουμε. Το τσιπ ρολογιού πραγματικού χρόνου DS3231 είναι μια εξαιρετική λύση. Η ακρίβεια είναι συγκρίσιμη με κάποιο DS1307 ή υψηλότερο, αλλά το PCA/PCF2129 μπορεί ακόμα να το ανταγωνιστεί. Μεταξύ των τσιπ ρολογιού πραγματικού χρόνου που έχω εξετάσει, αυτή η περίπτωση κατέχει αυτήν τη στιγμή την πρώτη θέση όσον αφορά τη λειτουργικότητα και την ακρίβεια.

Για να προγραμματίσετε τον μικροελεγκτή Atmega8, πρέπει να γνωρίζετε τη διαμόρφωση των ασφαλειών (στιγμιότυπο οθόνης στο πρόγραμμα):

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

Κατάλογος ραδιοστοιχείων

Ονομασία Τύπος Ονομασία Ποσότητα ΣημείωσηΚατάστημαΤο σημειωματάριό μου
IC1 MK AVR 8-bit

ATmega8

1 Στο σημειωματάριο
IC2 Ρολόι πραγματικού χρόνου (RTC)

DS3231

1 Στο σημειωματάριο
VR1 Γραμμικός ρυθμιστής

L7805AB

1 Στο σημειωματάριο
VR2 Γραμμικός ρυθμιστής

AMS1117-3.3

1 Στο σημειωματάριο
VD1 Δίοδος ανορθωτή

1N4148

1 Στο σημειωματάριο
Γ1 470 μF1 Στο σημειωματάριο
C2, C3, C5, C7 Πυκνωτής100 nF4 Στο σημειωματάριο
Γ4 Ηλεκτρολυτικό πυκνωτή220 µF1 Στο σημειωματάριο
C6, C8 Ηλεκτρολυτικό πυκνωτή10 μF2 Στο σημειωματάριο
R1 Αντίσταση

22 Ωμ

1 Στο σημειωματάριο
R2 Αντίσταση trimmer10 kOhm1 3296W-1-103LF
Συνεχίζοντας το θέμα:
Δρομολογητές

Γεια σας, αγαπητοί αναγνώστες του ιστολογίου iklife.ru! Σε αυτό το άρθρο θα μιλήσουμε για το πώς να σχεδιάσετε το προφίλ σας στο Instagram έτσι ώστε περισσότεροι άνθρωποι να το προσέχουν. Σωστός...

Νέα άρθρα
/
Δημοφιλής