AVR. Εκπαιδευτικό μάθημα

13.10.2023

Θα φαινόταν σαν ασήμαντο θέμα να λανσάρουμε ένα ρολόι χαλαζία. Τι προβλήματα μπορεί να υπάρχουν; Υπάρχει ένας μικροελεγκτής και τα δύο πόδια του, τα οποία είναι ειδικά σχεδιασμένα για τη σύνδεση χαλαζία. Υπάρχει ένα ρολόι χαλαζία. Η συγκόλληση του χαλαζία είναι θέμα δύο δευτερολέπτων. Χρειάζεται άλλο ένα λεπτό για να προσθέσετε μερικές γραμμές προετοιμασίας χρονοδιακόπτη στο πρόγραμμα. Αυτό φαίνεται να είναι όλο. ΑΛΛΑ, αφού έτρεξα αυτό το καταραμένο ρολόι χαλαζία για τρεις μέρες, κατάλαβα ότι το θέμα δεν είναι τόσο απλό όσο νόμιζα.

Και το παρασκήνιο ήταν έτσι.Ένας φίλος μου ζήτησε να του φτιάξω ένα απλό ρολόι, χωρίς διακοσμητικά στοιχεία, με δείκτες 7 τμημάτων. Δεν υπάρχει μεγάλη υπόθεση. Ο μικροελεγκτής λήφθηκε ATmega48 (μπορεί να λειτουργήσει με χαλαζία ρολογιού), γράφτηκε γρήγορα ένα πρόγραμμα και η σφραγίδα χαράχθηκε. Μετά τη συναρμολόγηση του ρολογιού και τον εντοπισμό σφαλμάτων του προγράμματος ( δυναμική οθόνη, κουμπιά κ.λπ.) ήρθε η ώρα για το ρολόι χαλαζία. Πριν από αυτό το ρολόι, είχα ήδη χρησιμοποιήσει το ρολόι χαλαζία μερικές φορές στα έργα μου και δεν υπήρχαν σημάδια προβλημάτων :), αλλά συνέβη το απροσδόκητο - το ρολόι quartz αρνήθηκε κατηγορηματικά να ξεκινήσει. Καθόλου!
Σε μια προσπάθεια να καταλάβω τι εμποδίζει το quartz του ρολογιού μου να λειτουργεί, πρώτα στράφηκα στο φύλλο δεδομένων του μικροελεγκτή (ATmega48). Υπήρχαν πολύ λίγες πληροφορίες σχετικά με την ασύγχρονη λειτουργία και τη σύνδεση του χρονοδιακόπτη. Μετά άρχισα να ψάχνω για λύση στο πρόβλημα στα φόρουμ. Εδώ υπήρχαν διάφορες λύσεις και συμβουλές, συμπεριλαμβανομένων τελετουργικών χορών με ντέφια, που επίσης δεν με βοήθησαν πραγματικά. Έπρεπε να καταλάβω τι ήταν τι μέσω δοκιμής και λάθους (για να μην συγχέεται με τη «μέθοδο του poke»!). Ως αποτέλεσμα ηρωικών προσπαθειών, πατώντας σε κάθε δυνατή τσουγκράνα και σκοτώνοντας τρεις μέρες, γεννήθηκε πρακτική εμπειρία στη σύνδεση ενός χαλαζία ρολογιού, την οποία θα μοιραστώ εδώ.

Λοιπόν, τι γκανιότα μας περιμένει όταν λανσάρουμε το ρολόι quartz;

1 Σχεδιασμός κυκλώματος.
1.1 Πυκνωτές.
Το φύλλο δεδομένων για τον μικροελεγκτή αναφέρει σε κάποιο μήκος ότι οι πυκνωτές πρέπει να συνδέονται με τον χαλαζία ρολογιού, αλλά γενικά είναι δύσκολο να μάθουμε για την χωρητικότητά τους. Ο χαλαζίας ρολογιού πιθανότατα θα λειτουργήσει χωρίς πυκνωτές, αλλά είναι καλύτερο να τους εγκαταστήσετε αυτό θα βελτιώσει τη σταθερότητα της συχνότητας και θα βοηθήσει τον χαλαζία να ξεκινήσει πιο γρήγορα.
Η χωρητικότητα των πυκνωτών πρέπει να είναι στην περιοχή 12-22 pF.

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

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

1.4 Ακαθαρσίες στο ταμπλό.
Ο χαλαζίας του ρολογιού είναι ένα αρκετά ευαίσθητο πράγμα και μια αντίσταση μερικών megaohms μεταξύ των ποδιών είναι αρκετά αρκετή για να το σταματήσει. Όπως έχει δείξει η πρακτική, η ροή υγρού, εάν δεν ξεπλυθεί καλά, παρέχει επαρκή αντίσταση έτσι ώστε ο χαλαζίας να μην λειτουργεί. Μετά τη συγκόλληση, πλύνετε καλά την σανίδα. Πολύ συχνά, οι ροές περιέχουν οξύ, το οποίο δίνει αγωγιμότητα μεταξύ των ποδιών. Για να εξουδετερώσετε το οξύ, πλύνετε τη σανίδα με ένα ασθενές διάλυμα μαγειρικής σόδας και πλύνετε καλά με καθαρό νερό.

2 Προγραμματισμός.
2.1 Εκκίνηση της λειτουργίας ασύγχρονου χρονοδιακόπτη.

Για να λειτουργήσει ο χρονοδιακόπτης από χαλαζία ρολογιού, πρέπει (ο χρονοδιακόπτης) να αλλάξει σε ασύγχρονη λειτουργία. Για να αλλάξετε το χρονόμετρο (σχεδόν για όλους τους μικροελεγκτές αυτό είναι το χρονόμετρο 2) σε αυτήν τη λειτουργία, πρέπει να γράψετε 1 στο bit AS2. Αλλά δεν είναι όλα τόσο απλά, πρέπει να ακολουθήσετε έναν συγκεκριμένο αλγόριθμο εκκίνησης. Σύμφωνα με το φύλλο δεδομένων, η διαδικασία για την ενεργοποίηση της ασύγχρονης λειτουργίας για το χρονόμετρο 2 είναι η εξής:
1. Απενεργοποιήστε τις διακοπές από το χρονόμετρο/μετρητή 2 - OCIE2x, TOIE2;
2. Αλλάξτε το σε ασύγχρονη λειτουργία 1 -> AS2;
3. Γράψτε νέες τιμές στους καταχωρητές TCNT2, OCR2x και TCCR2x.
4. Περιμένετε μέχρι να μηδενιστούν οι σημαίες TCN2UB, OCR2xUB και TCR2xUB.
5. Επαναφορά χρονοδιακόπτη/μετρητή 2 σημαίες διακοπής.
6. Ενεργοποιήστε τις διακοπές (εάν απαιτείται).

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

/* απενεργοποίηση διακοπών */ cli() ; /* 1. Απενεργοποιήστε τις διακοπές Timer/Counter2 επαναφέροντας τα OCIE2x και TOIE2. */ TIMSK2 &= ~((1<< OCIE2A) | (1 << OCIE2B) | (1 << TOIE2) ) ; /* 2. Ρυθμίστε το Timer/Counter2 σε ασύγχρονη λειτουργία ρυθμίζοντας το AS2. */ ASSR = (1<< AS2) ; /* Δώστε λίγο χρόνο για να σταθεροποιηθεί η γεννήτρια (μπορεί να παραλειφθεί). */ _delay_ms(1000) ; /* 3. Γράψτε νέες τιμές TCNT2, OCR2x και TCCR2B. */ TCNT2 = 0 ; /* ορίστε τον περιοριστή = 128 32,768 kHz / 128 / 256 = υπερχείλιση μία φορά ανά δευτερόλεπτο. */ TCCR2B |= (1<< CS22) | (1 << CS20) ; /* 4. Για να βεβαιωθείτε ότι το ρολόι έχει αρχίσει να λειτουργεί, περιμένετε μέχρι να διαγραφούν τα bit: TCN2UB, OCR2AUB, OCR2BUB, TCR2AUB και TCR2BUB. */ενώ (ASSR & 0x1F ) ; /* 5. Επαναφέρετε τις σημαίες διακοπής Timer/Counter2. */ TIFR2 |= ((1<< OCF2A) | (1 << OCF2B) | (1 << TOV2) ) ; /* 6. Ενεργοποίηση διακοπής υπερχείλισης χρονοδιακόπτη 2 */ TIMSK2 |= (1<< TOIE2) ; /* ενεργοποίηση διακοπών */ sei() ;

/* απενεργοποιήστε τις διακοπές */ cli();<

/* 1. Απενεργοποιήστε τις διακοπές Timer/Counter2 επαναφέροντας τα OCIE2x και TOIE2. */ TIMSK2 &= ~((1
2.2 Όριο χρονοδιακόπτη 2.

Για να συμβαίνουν οι διακοπές υπερχείλισης του χρονοδιακόπτη 2 μία φορά ανά δευτερόλεπτο, η τιμή του περιοριστή πρέπει να είναι 128. (128 περιοριστής * 256 υπερχείλιση = 32768 συχνότητα χαλαζία).
2.3 Λειτουργία ρολογιού σε κατάσταση αναμονής εξοικονόμησης ενέργειας.

Είναι πολύ δελεαστικό να θέσετε τον μικροελεγκτή σε κατάσταση αναστολής λειτουργίας στις παύσεις μεταξύ των δεύτερων διακοπών, οπότε το ρεύμα του μικροελεγκτή θα πέσει στα 6-7 μΑ. Για μια τέτοια περίπτωση, υπάρχει μια λειτουργία χαμηλής κατανάλωσης PowerSave, στην οποία ο χρονοδιακόπτης 2 συνεχίζει να λειτουργεί από τον χαλαζία ρολογιού και ξυπνά τον μικροελεγκτή με μια διακοπή. Ο αλγόριθμος για αυτόν τον τρόπο λειτουργίας είναι απλός: μετά την έξοδο από την κατάσταση αναστολής λειτουργίας με διακοπή του χρονοδιακόπτη, στη διαδικασία επεξεργασίας διακοπής «σημαδεύουμε» το ρολόι, βγαίνουμε από τη διακοπή και δίνουμε ξανά την εντολή ύπνου (SLEEP). Υπάρχει μια πολύ σημαντική απόχρωση εδώ. Και πάλι, δείτε το φύλλο δεδομένων για τον μικροελεγκτή στην ενότητα για τις λειτουργίες χαμηλής κατανάλωσης και τη λειτουργία ασύγχρονης λειτουργίας. Για να αρχίσει να λειτουργεί κανονικά ο χρονοδιακόπτης μετά την αφύπνιση και για να μπορέσει να αφυπνίσει τον μικροελεγκτή από αδράνεια στην επόμενη διακοπή, πρέπει να περιμένετε ένα συγκεκριμένο χρονικό διάστημα πριν την εντολή ύπνου. Για να βεβαιωθείτε ότι η γεννήτρια λειτουργεί κανονικά, πρέπει να γράψετε σε οποιονδήποτε καταχωρητή χρονοδιακόπτη, έναν που δεν θα διαταράσσει το ρολόι (για παράδειγμα, στο OCR2x) και να περιμένετε να μηδενιστούν οι σημαίες ετοιμότητας αυτού του καταχωρητή (OCR2xUB) . Μετά την επαναφορά της σημαίας, μπορείτε να θέσετε με ασφάλεια τον μικροελεγκτή σε κατάσταση αναστολής λειτουργίας.<

/* Σημείο εξόδου για διακοπή υπερχείλισης timer2 */ /* Γράψτε οποιαδήποτε τιμή στο OCR2A. */ OCR2A = 0;
/* Περιμένετε μέχρι να γίνει επαναφορά του OCR2AUB. */ ενώ (ASSR & (1 3 Διάφορα.

3.1 Μην χρησιμοποιείτε φτηνό κινέζικο χαλαζία(ειδικά αυτά που έχουν συγκολληθεί από παλιά σπασμένα ρολόγια πένας). Ακόμα κι αν δουλέψουν, δεν θα έχουν ακρίβεια.

3.2 Και τέλος


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

Μερικές φορές είναι χρήσιμο να υπάρχει ένα ρολόι στο σύστημα που μετράει τον χρόνο σε δευτερόλεπτα, και μάλιστα με υψηλή ακρίβεια. Συχνά, ειδικά μικροκυκλώματα RTC (Ρολόι πραγματικού χρόνου), όπως . Απλώς αυτή είναι μια πρόσθετη περίπτωση και μερικές φορές κοστίζει όσο το ίδιο το MK, αν και μπορείτε να το κάνετε χωρίς αυτό. Επιπλέον, πολλά MK έχουν ενσωματωμένη μονάδα RTC. Είναι αλήθεια ότι το AVR δεν το έχει, αλλά έχει ένα ασύγχρονο χρονόμετρο που χρησιμεύει ως ημικατεργασμένο προϊόν για την κατασκευή ενός ρολογιού.

Πρώτα απ 'όλα, χρειαζόμαστε έναν χαλαζία ρολογιού στα 32768 Hertz.

Γιατί ο χαλαζίας είναι ακριβώς 32768Hz και γιατί ονομάζεται φρουρός; Ναι, όλα είναι πολύ απλά - το 32768 είναι δύναμη δύο. Δύο έως τη δέκατη πέμπτη δύναμη. Επομένως, ένας μετρητής δεκαπέντε bit που χτυπά σε συχνότητα 32768 Hz θα ξεχειλίζει μία φορά ανά δευτερόλεπτο. Αυτό καθιστά δυνατή την κατασκευή ενός ρολογιού χρησιμοποιώντας συνηθισμένη λογική ροή χωρίς προβλήματα. Και στον μικροελεγκτή AVR, μπορείτε να οργανώσετε ένα ρολόι με δευτερόλεπτα σχεδόν χωρίς να χρησιμοποιήσετε τον εγκέφαλο, χρησιμοποιώντας περιφερειακά αντανακλαστικά.

Λειτουργία ασύγχρονου χρονοδιακόπτη
Θυμάστε πώς λειτουργούν τα χρονόμετρα; Η συχνότητα ρολογιού από την κύρια γεννήτρια ρολογιού (RC εξωτερικός ή εσωτερικός, εξωτερικός χαλαζίας ή εξωτερικός ταλαντωτής) πηγαίνει στους προβαθμωτές και από την έξοδο των προδιαμετρητών κάνει ήδη κλικ στις τιμές του καταχωρητή TCNT. Ή το σήμα εισόδου προέρχεται από την είσοδο καταμέτρησης Tn και επίσης κάνει κλικ στον καταχωρητή TCNT

Για να γίνει αυτό, ένα αντηχείο χαλαζία είναι κρεμασμένο στις ακίδες TOSC2 και TOSC1. Χαμηλή συχνότητα, συνήθως μια ώρα χαλαζία στα 32768Hz. Τοποθετείται στα δεξιά του ελεγκτή και συνδέεται με βραχυκυκλωτήρες. Επιπλέον, η συχνότητα ρολογιού του επεξεργαστή πρέπει να είναι τουλάχιστον τέσσερις φορές υψηλότερη. Έχουμε ένα ρολόι από τον εσωτερικό ταλαντωτή των 8 MHz, οπότε αυτή η κατάσταση δεν μας ενοχλεί καθόλου :)

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


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

Διαμόρφωση
Για να το ενεργοποιήσετε, απλά πρέπει να ρυθμίσετε το bit AS2 του καταχωρητή ASSR - και αυτό είναι όλο, ο χρονοδιακόπτης λειτουργεί σε ασύγχρονη λειτουργία. Αλλά υπάρχει ένα χαρακτηριστικό εδώ που μου κόστισε πολλούς πονοκεφάλους ταυτόχρονα. Το γεγονός είναι ότι όταν λειτουργείτε από τον δικό σας χαλαζία, όλοι οι εσωτερικοί καταχωρητές χρονοδιακόπτη αρχίζουν να συγχρονίζονται χρησιμοποιώντας τον δικό τους χαλαζία. Αλλά είναι αργός και το κύριο πρόγραμμα μπορεί να αλλάξει μια ήδη καταχωρημένη τιμή πολύ πιο γρήγορα από ό,τι μπορεί να επεξεργαστεί από το χρονόμετρο.

Δηλαδή, για παράδειγμα, έχετε προκαθορίσει την τιμή TCNT2, ο χρονοδιακόπτης στον αλωνιστή των 32 kHz δεν έχει ακόμη προλάβει να το μασήσει, αλλά ο αλγόριθμός σας έχει ήδη τρέξει και έχει γράψει κάτι ξανά εκεί - ως αποτέλεσμα, πιθανότατα τα σκουπίδια θα καταλήγουν σε TCNT2. Για να μην συμβεί αυτό, η εγγραφή αποθηκεύεται στην προσωρινή μνήμη. Εκείνοι. νομίζετε ότι γράψατε τα δεδομένα στο TCNT2, αλλά στην πραγματικότητα καταλήγει στον προσωρινό καταχωρητή και θα φτάσει στον καταχωρητή μέτρησης μόνο μετά από τρεις κύκλους ρολογιού της αργής γεννήτριας.

Οι καταχωρητές σύγκρισης OCR2 και ο καταχωρητής διαμόρφωσης TCCR2 είναι επίσης προσωρινά αποθηκευμένοι

Πώς μπορώ να μάθω αν τα δεδομένα έχουν ήδη εισαχθεί στο χρονόμετρο ή αν βρίσκονται σε ενδιάμεσα κελιά; Ναι, είναι πολύ απλό - χρησιμοποιώντας τις σημαίες στο μητρώο ASSR. Αυτά είναι τα bit TCN2UB, OCR2UB και TCR2UB - το καθένα είναι υπεύθυνο για το δικό του μητρώο. Όταν, για παράδειγμα, γράφουμε μια τιμή στο TCNT2, το TCNUB γίνεται 1, και μόλις ο αριθμός μας από τον ενδιάμεσο καταχωρητή μετακινηθεί στον πραγματικό καταχωρητή καταμέτρησης TCNT2 και αρχίσει να τικ, αυτή η σημαία επαναφέρεται αυτόματα.

Έτσι, στην ασύγχρονη λειτουργία, όταν γράφετε στους καταχωρητές TCNT2, OCR2 και TCCR2, πρέπει πρώτα να ελέγξετε τις σημαίες TCN2UB, OCR2UB και TCR2UB και να γράψετε μόνο εάν είναι ίσες με μηδέν. Διαφορετικά το αποτέλεσμα μπορεί να είναι απρόβλεπτο.

Ναι, ένα άλλο σημαντικό σημείο - κατά την εναλλαγή μεταξύ σύγχρονης και ασύγχρονης λειτουργίας, η τιμή στον καταχωρητή μετρητή TCNT ενδέχεται να χαθεί. Για να είμαστε λοιπόν ασφαλείς, αλλάζουμε ως εξής:

  • Απενεργοποιήστε τις διακοπές από αυτό το χρονόμετρο
  • Μετάβαση στην επιθυμητή λειτουργία (σύγχρονη ή ασύγχρονη)
  • Ρυθμίζουμε ξανά το χρονόμετρο όπως χρειάζεται. Εκείνοι. ρυθμίστε την προεπιλογή TCNT2 εάν χρειάζεται, ρυθμίστε ξανά το TCCR2
  • Εάν μεταβούμε σε ασύγχρονη λειτουργία, τότε περιμένουμε μέχρι να μηδενιστούν όλες οι σημαίες TCN2UB, OCR2UB και TCR2UB. Εκείνοι. οι ρυθμίσεις έχουν εφαρμοστεί και είναι έτοιμες να ξεκινήσουν.
  • Επαναφορά των σημαιών διακοπής του χρονοδιακόπτη/μετρητή. Επειδή με όλες αυτές τις διαταραχές μπορούν κατά λάθος να εγκατασταθούν
  • Ενεργοποίηση διακοπών από αυτό το χρονόμετρο

Η μη τήρηση αυτής της σειράς οδηγεί σε απρόβλεπτες και δύσκολο να εντοπιστούν δυσλειτουργίες.

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

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

Παραδείγματα:
Ο ελεγκτής χρησιμοποιεί λειτουργία εξοικονόμησης ενέργειας και τερματισμού πυρήνα και αφυπνίζεται με διακοπές από ένα ασύγχρονο χρονόμετρο. Εδώ πρέπει να λάβουμε υπόψη το γεγονός ότι εάν αλλάξουμε τις τιμές των καταχωρητών TCNT2, OCR2 και TCCR2, τότε η αδρανοποίηση θα πρέπει να γίνει ΜΟΝΟ αφού πέσουν οι σημαίες TCN2UB, OCR2UB και TCR2UB. Διαφορετικά, θα αποδειχθεί τόσο χάος - ο ασύγχρονος χρονοδιακόπτης δεν έχει ακόμη χρόνο να πάρει δεδομένα από τους ενδιάμεσους καταχωρητές (είναι αργός, εκατοντάδες φορές πιο αργός από τον πυρήνα) και ο πυρήνας έχει ήδη αποκοπεί . Και θα ήταν ωραίο να μην εφαρμοστεί η νέα διαμόρφωση, αυτό είναι ανοησία.

Το χειρότερο είναι ότι ενώ τροποποιούνται οι καταχωρητές TCNT ή OCR, η λειτουργία της μονάδας σύγκρισης μπλοκάρεται, πράγμα που σημαίνει ότι εάν ο πυρήνας αποκοιμηθεί νωρίτερα, η μονάδα σύγκρισης δεν θα ξεκινήσει ποτέ - δεν θα υπάρχει κανείς να την ενεργοποιήσει. Και θα χάσουμε τη διακοπή σε σύγκριση. Ο κίνδυνος είναι να χάσουμε το συμβάν και να τα χάσουμε μέχρι το επόμενο ξύπνημα από τη χειμερία νάρκη.
Τι γίνεται αν ο ελεγκτής ξυπνήσει από μια διακοπή σύγκρισης; Τότε θα αποκοιμηθεί τελείως. Ωχ!
Λάβετε λοιπόν αυτό το σφάλμα αργότερα.

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

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

Έτσι, η έξοδος από την κατάσταση αδρανοποίησης και ο ύπνος όταν διακόπτεται από ένα ασύγχρονο χρονόμετρο θα πρέπει να μοιάζει με αυτό:

  • Ξύπνησα
  • Έκαναν κάτι απαραίτητο
  • Αποκοιμήθηκε

Και η διάρκεια της λειτουργίας μεταξύ Ξύπνημα και Πτώση για ύπνο ΔΕΝ ΠΡΕΠΕΙ ΝΑ ΕΙΝΑΙ ΛΙΓΟΤΕΡΟ από ένα τικ του ασύγχρονου χρονοδιακόπτη. Διαφορετικά, τα κινούμενα σχέδια σε αναστολή θα είναι αιώνια. Μπορείτε να ορίσετε την καθυστέρηση ή μπορείτε να το κάνετε όπως σας συμβουλεύει το φύλλο δεδομένων:

  • Ξύπνησα
  • Έκαναν κάτι απαραίτητο
  • Για πλάκα, γράψαμε κάτι σε οποιονδήποτε από τους καταχωρητές buffer. Για παράδειγμα, στο TCNT ήταν 1, και ηχογραφήσαμε ξανά 1. Τίποτα δεν έχει αλλάξει, αλλά έγινε μια εγγραφή, σηκώθηκε η σημαία TCN2UB, η οποία είναι εγγυημένη ότι θα διαρκέσει τρεις κύκλους της αργής γεννήτριας.
  • Περιμένετε μέχρι να πέσει η σημαία
  • Αποκοιμηθήκαμε.

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

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

Και, στο τέλος του άρθρου, ένα μικρό παράδειγμα. Εκτέλεση ασύγχρονου χρονοδιακόπτη στο Atmega16 (Πώς χρησιμοποιείται ο πίνακας από το πολύγωνο)

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

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 int main(void) (InitAll(); // Αρχικοποίηση του περιφερειακού InitRTOS() ; // Αρχικοποίηση του πυρήνα RunRTOS() ; // Εκκίνηση του πυρήνα. UDR = "R" ; // Δείκτης έναρξης, για εντοπισμό σφαλμάτων SetTimerTask(InitASS_Timer, 1000 );// Εφόσον το χρονόμετρο σε ασύγχρονη λειτουργία // ξεκινά αργά, το κάνουμε // Καθυστέρηση για την έναρξη της προετοιμασίας του χρονοδιακόπτη.ενώ (1) // Κύριος βρόχος διεκπεραιωτή( wdt_reset() ; // Επαναφορά χρονοδιακόπτη σκύλου TaskManager() ;

// Καλέστε τον αποστολέα

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

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

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 void InitASS_Timer(void ) ( αν (ASSR & (1<< AS2) ) //Αν αυτή είναι η δεύτερη είσοδος τότε(αν (ASSR & (1<< TCN2UB | 1 << OCR2UB | TCR2UB) ) // ελέγξτε αν υπάρχει τουλάχιστον ένα bit σημαίας( SetTask(InitASS_Timer) ; // Εάν υπάρχει, τότε το στέλνουμε σε έναν επαναλαμβανόμενο κύκλο αναμονής) άλλο // Εάν όλα είναι ξεκάθαρα, τότε μπορείτε να εκτελέσετε διακοπές( TIFR |= 1<< OCF2 | 1 << TOV2; // Επαναφορά σημαιών διακοπής, για κάθε περίπτωση. TIMSK |= 1<< TOIE2; // Ενεργοποίηση διακοπής υπερχείλισηςεπιστροφή ;<< OCIE2 | 1 << TOIE2) ; ) ) TIMSK &= ~(1// Απενεργοποίηση διακοπών χρονοδιακόπτη 2<< AS2; ASSR = 1// Ενεργοποίηση ασύγχρονης λειτουργίας<< CS20; TCNT2 = 0 ; TCCR2 = 5// Ένας prescaler 128 επί 32768 θα δώσει 256 τικ ανά δευτερόλεπτο // Το οποίο θα δώσει 1 διακοπή υπερχείλισης ανά δευτερόλεπτο. }

SetTask(InitASS_Timer) ;<

// Εκτελέστε το μέσω του διεκπεραιωτή για να συνδεθείτε ξανά.

void InitASS_Timer(void) ( if(ASSR & (1

ISR(TIMER2_OVF_vect) // Διακοπή υπερχείλισης χρονοδιακόπτη 2 ( UDR = i; i++; )
Ήταν δυνατό να φτιάξω μεταβλητές που να περιέχουν ώρες:λεπτά:δευτερόλεπτα και να κάνω κλικ σε αυτές τις μεταβλητές με όλη τη λογική υπερχείλισης ώρας/λεπτού, αλλά ήμουν πολύ τεμπέλης. Και έτσι όλα είναι ξεκάθαρα.

Σε αυτό το σύντομο δοκίμιο με φωτογραφίες, θα δείξω στο ευρύ κοινό πώς να αντιμετωπίσει μια αρκετά συνηθισμένη «πληγή» ψηφιακών ηλεκτρονικών ρολογιών - την ανακρίβεια. Το ρολόι μπορεί να καθυστερεί ή να βιάζεται και τις περισσότερες φορές δεν δίνουμε σημασία σε μικρά λάθη, αλλά όταν το ρολόι καθυστερεί κατά 5 (πέντε) λεπτά την ημέρα, αρχίζει να εκνευρίζεται.

Είστε έτοιμοι; Πάμε!



Εισαγωγή

Αγόρασα αυτό το ρολόι για να νιώσω νοσταλγία για την παλιά Σοβιετική εποχή, όταν ο ήλιος ήταν πιο πράσινος και το γρασίδι πιο φωτεινό… ή το αντίστροφο;.. δεν πειράζει! Το κύριο πράγμα είναι ότι δεν υπήρχε χαρά - το ρολόι ήταν αηδιαστικά αργό. Περισσότερα από 5 λεπτά την ημέρα. Πρέπει να γιατρευτώ, σκέφτηκα.:

Αναγκαίως
+ κολλητήρι. κατά προτίμηση όχι πολύ ισχυρό, αρκούν 25-40 watt. Τα 60 θα είναι ήδη πάρα πολλά.
+ αντηχείο χαλαζία αντικατάστασης. Πωλείται είτε στην Κίνα είτε σε οποιοδήποτε κατάστημα ραδιοφώνου. Είναι φθηνό και ονομάζεται "ρολόι χαλαζία".
+ λεπτό κατσαβίδι Phillips ή λεπτό κατσαβίδι επίπεδης κεφαλής. ο σταυρός είναι προτιμότερος.

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

Αποσυναρμολογούμε το ρολόι

Ξεβιδώστε τις τέσσερις βίδες που συγκρατούν το πίσω κάλυμμα. Αφαιρέστε προσεκτικά το κάλυμμα και αφαιρέστε το πιεζοηλεκτρικό αντηχείο (tweeter). Δεν πατάμε το τρίξιμο με τα δάχτυλά μας, το κρατάμε από τις πλαϊνές άκρες και τη μεταλλική βάση.


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

Βγάζουμε το ρολόι από τη θήκη.


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

Ξεβιδώνουμε τέσσερις βίδες - τρεις συγκρατούν την μπαταρία λιθίου 2016, μία κρατά τη γλωττίδα του ελατηρίου για την αποστολή σήματος στο τουίτερ.


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

Χρησιμοποιώντας τσιμπιδάκια, αφαιρέστε προσεκτικά τη σανίδα από την πλαστική θήκη.


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

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


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


Εφαρμόζουμε χαλαζία στον πίνακα. Ταιριάζει. Βάζουμε χαλαζία στο κλουβί, χωράει και αυτό! Μεγάλος! Ας αλλάξουμε!

Για να αντικαταστήσετε, απλώς ξεκολλήστε έναν χαλαζία και συγκολλήστε σε έναν άλλο.
Δεν υπάρχει πολικότητα, κανένα χαρακτηριστικό. Η διαδικασία είναι απλή και δεν απαιτεί ιδιαίτερα προσόντα.


Voila! χαλαζίας αντικαταστάθηκε. Ευθυγραμμίζουμε το σώμα χαλαζία έτσι ώστε να είναι ακριβώς κάτω από την πλακέτα και να μην ακουμπάει την μπαταρία.

Επανασυναρμολόγηση

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


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

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

Λοιπόν αυτό είναι!
Ξεπεράσαμε ένα μεγάλο πρόβλημα)))

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

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

Έξω από το πλαίσιο αυτής της "Murzilka" υπήρχε μια ταινία που οι Κινέζοι δεν την αφαίρεσαν από την οθόνη LCD όταν την έβαλαν στη θήκη. Αφαίρεσα αυτό το φιλμ και η αντίθεση της οθόνης αυξήθηκε ελαφρώς. Η ταινία είναι σχεδόν αόρατη, αλλά ήταν στο ρολόι μου.

UPD .
Τις τελευταίες τέσσερις ημέρες, από τότε που αντικαταστάθηκε ο χαλαζίας, το ρολόι έχει προχωρήσει κατά δύο δευτερόλεπτα. 15 δευτερόλεπτα το μήνα.
Για φτηνό ρολόι και δωρεάν χαλαζία, νομίζω ότι το αποτέλεσμα είναι ικανοποιητικό. Προσωπικά, με ικανοποιεί απόλυτα)))
Μπορείτε, φυσικά, να ψάξετε για ρολόγια χαλαζία για πένες σε υπαίθριες αγορές, να πάρετε ένα σωρό χαλαζία από εκεί και να πειραματιστείτε με ακρίβεια... αλλά θα το αφήσουμε αυτό στους τελειομανείς και τους σκληροπυρηνικούς φρικιά)))

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

Και γενικά, φίλοι, το κύριο πράγμα δεν είναι η κριτική, το κύριο πράγμα είναι τα σχόλια)))
Σας ευχαριστώ όλους για τις πολύτιμες ιδέες και τις διάφορες συζητήσεις)))

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