Πώς να συνδέσετε 256 κουμπιά σε έναν μικροελεγκτή. Πώς να συνδέσετε με ασφάλεια εξωτερικές συσκευές στον μικροελεγκτή; Σύνδεση LED χαμηλής ισχύος

Μιμηθήκαμε το κύκλωμα στο πρόγραμμα Proteus, αναβοσβήσαμε το LED και μάθαμε πώς να αναβοσβήνουμε τον εικονικό μας μικροελεγκτή. Σίγουρα πολλοί από τους αναγνώστες σκέφτηκαν: «Είναι δυνατόν να αναβοσβήνει το LED χρησιμοποιώντας ένα κουμπί συνδεδεμένο στο MK;

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


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

Έτσι στην επιχείρηση. Έτσι φαίνεται το σχήμα μας στο πρόγραμμα Proteus (κάντε κλικ για μεγέθυνση):

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

Όπως έχουμε ήδη συζητήσει, παίρνουμε την ισχύ και προσγειωνόμαστε στην καρτέλα "Τερματικό". Υποδηλώνονται από εμάς, αντίστοιχα, Power και Ground.

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


Πριν από τη χρήση, πρέπει να επιλέξουμε ένα κουμπί στη βιβλιοθήκη με τον ίδιο τρόπο όπως και οι υπόλοιπες λεπτομέρειες. Για να το κάνετε αυτό, πληκτρολογήστε τη λέξη "αλλά" στο πεδίο "Mask". Στη συνέχεια, στο πεδίο "Αποτελέσματα" η λέξη "BUTTON":


Μετά από αυτό, το κουμπί θα εμφανιστεί στη λίστα μας, μαζί με τα επιλεγμένα μέρη που χρησιμοποιούνται στο έργο.

Ποιες θύρες χρησιμοποιούμε στο έργο. Παρακάτω στο σχήμα βλέπουμε εξερχόμενες γραμμές από τις θύρες RA0, PB0, PB1, PB2 και PB3. Έχουμε LED συνδεδεμένα στη θύρα Β και ένα κουμπί στη θύρα Α.

Έτσι, όταν πατηθεί, κλείνουμε το κύκλωμα που συνδέει +5 βολτ στη θύρα PA0 και στον επάνω ακροδέκτη της αντίστασης. Γιατί έχουμε καθόλου αντίσταση εδώ; Το γεγονός είναι ότι το κύκλωμα του κουμπιού πρέπει να είναι κλειστό. Αφού εγκαταστήσαμε την αντίσταση, το ρεύμα ρέει από το συν της τροφοδοσίας μέσω του κουμπιού, της αντίστασης και περαιτέρω στο έδαφος.

Η τιμή της αντίστασης είναι αρκετή για να πάρει ίση με 200 ohms. Όταν λοιπόν πατάμε ένα κουμπί, συνδέουμε τη θύρα PA0 στην τροφοδοσία +5 volt και αν μετρήσουμε την ακίδα PA0 για τάση ή όχι, μπορούμε να επηρεάσουμε την εκτέλεση του προγράμματός μας.

Στιγμιότυπα οθόνης με το κείμενο του προγράμματός μας που έχω δώσει παρακάτω:


Έτσι, οι διαφορές από το προηγούμενο έργο είναι ότι ρυθμίζουμε και τις 8 ακίδες της θύρας PA στην είσοδο, διαμορφώνουμε τις παραμέτρους της θύρας PB0 - PB3 στην έξοδο και PB4 - PB7 στην είσοδο.


Στη συνέχεια χρησιμοποιούμε στο πρόγραμμά μας έναν έλεγχο συνθήκης "αν"


Έτσι, βλέπουμε στη γραμμή μετά το «αν», σε αγκύλες, την συνθήκη εκτέλεσης. Ο παρακάτω κώδικας εκτελείται εάν έχουμε λογικό μηδέν, ή μηδέν βολτ, στη θύρα PA0. Αυτό το κείμενο σε αγκύλες είναι η μετατόπιση bit θύρας. Θα αναλύσουμε σε ένα από τα ακόλουθα άρθρα, αλλά προς το παρόν αρκεί να λάβουμε υπόψη ότι κάνοντας αυτό ανακρίνουμε το κουμπί στο στύψιμο. Στη συνέχεια, σε σγουρά άγκιστρα, υπάρχει το κείμενο του προγράμματος, το οποίο εκτελείται εάν η συνθήκη είναι αληθής. Εάν η συνθήκη δεν είναι αληθής, το πρόγραμμα συνεχίζει να εκτελείται, παρακάμπτοντας το κείμενο σε σγουρά άγκιστρα.

Ομοίως, χρησιμοποιώντας τη συνθήκη «αν», ενεργοποιούμε το κουμπί πάτημα. Λάβετε υπόψη ότι το κείμενο σε αγκύλες έχει αλλάξει. Αυτό σημαίνει ότι εάν έχουμε μια λογική μονάδα στο πόδι PA0, πληρούμε την προϋπόθεση, δηλαδή το κείμενο σε σγουρές αγκύλες. Δηλαδή με το πάτημα του κουμπιού ανάβουν και σβήνουν εναλλάξ τα LED από το πρώτο έως το τέταρτο και όταν πατηθεί και κρατηθεί ανάβουν και σβήνουν από το τέταρτο στο πρώτο. Έτσι, μπορούμε να επηρεάσουμε την εκτέλεση του προγράμματος πατώντας ένα κουμπί, ψηφίζοντας για την παρουσία ενός λογικού μηδενός σε αυτό ή ενός λογικού

Επίσης, στο οποίο βρίσκονται το αρχείο “sishnik”, το HEX και το αρχείο Proteus.

Και εδώ είναι το βίντεο

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

Μέθοδος 1 - παραδοσιακή

εικ1α εικ1β

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

Όταν απελευθερωθεί το κουμπί, η έξοδος του micron μέσω μιας αντίστασης συνδέεται στο "συν" του τροφοδοτικού (Εικ. 1a). Όταν πατηθεί το κουμπί, η έξοδος micro συνδέεται στη γείωση. Η αντίσταση έλξης R1 περιορίζει το ρεύμα στο κύκλωμα διακόπτη. Αν δεν υπήρχε, τότε όταν πατούσαμε το κουμπί, απλώς θα βραχυκυκλώναμε την πηγή τροφοδοσίας μας.

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

Τι συμβαίνει εάν η ακίδα του μικροελεγκτή βρίσκεται σε λειτουργία εξόδου; Αυτό θα εξαρτηθεί από την κατάσταση αυτής της ακίδας. Εάν η έξοδος είναι «λογικό μηδέν», δεν θα συμβεί τίποτα κακό, γιατί - στην πρώτη περίπτωση (Εικ. 1α) η ποσότητα του εισερχόμενου ρεύματος περιορίζεται από την αντίσταση R1 και στη δεύτερη περίπτωση (Εικ. 1β) δεν θα ρέει ρεύμα καθόλου. Όταν πατηθεί το κουμπί, δεν θα συμβεί τίποτα, καθώς η διαφορά δυναμικού μεταξύ της εξόδου και της "γείωσης" σε αυτή την περίπτωση θα είναι ίση με μηδέν.

Εάν υπάρχει μια "λογική μονάδα" στην έξοδο και πατηθεί το κουμπί, τότε ένα ρεύμα πολλών δεκάδων milliamps θα ρέει προς το έδαφος μέσω της εξόδου του μικροελεγκτή και η έξοδος της θύρας μπορεί να "καεί". Το μέγιστο επιτρεπόμενο ρεύμα για την έξοδο του μικροελεγκτή AVR σύμφωνα με την τεκμηρίωση είναι 40 mA. Επομένως, μερικές φορές δεν είναι ακατάλληλο να τοποθετήσετε μια αντίσταση με ονομαστική τιμή αρκετών εκατοντάδων ohms, για παράδειγμα 330 (Εικ. 1c), μεταξύ της εξόδου MK και του κουμπιού. Έτσι, για παράδειγμα, τα κουμπιά στην πλακέτα εντοπισμού σφαλμάτων STK500 είναι συνδεδεμένα. Αυτό γίνεται για να διασφαλιστεί ότι ο χρήστης δεν θα κάψει κατά λάθος τον μικροελεγκτή κατά τη διάρκεια των πειραμάτων του.

Για τις διατάξεις σας, ωστόσο, μπορείτε να κάνετε χωρίς αυτήν την αντίσταση.

Ο δεύτερος τρόπος - χρησιμοποιώντας διόδους

Χρησιμοποιείται όταν υπάρχουν περισσότερα από δύο κουμπιά και θέλετε να αποθηκεύσετε συμπεράσματα. Σε αυτήν την περίπτωση, κάθε κουμπί έχει τον δικό του ψηφιακό κωδικό και τον αριθμό των κουμπιών που μπορούν να κρεμαστούν με αυτόν τον τρόπο σε N καρφίτσες mk = 2 N - 1. Δηλαδή, 7 κουμπιά μπορούν να κρεμαστούν σε τρεις ακίδες, 15 σε τέσσερις καρφίτσες , και ούτω καθεξής ... αλλά δεν θα κρεμούσα πάνω από 7. Ο αριθμός των πρόσθετων εξωτερικών στοιχείων αυξάνεται, το σχήμα και το πρόγραμμα του μικροϋπολογιστή γίνονται πιο περίπλοκα. Επιπλέον, για μεγάλο αριθμό κουμπιών, υπάρχουν και άλλα σχήματα εναλλαγής. Οι αντιστάσεις έλξης δεν φαίνονται στο διάγραμμα, υποτίθεται ότι χρησιμοποιούνται εσωτερικές.

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

Αυτό το σχήμα δεν ισχύει για όλους τους μικροελεγκτές AVR, επειδή σε ορισμένα μοντέλα μικροελεγκτών μπορεί να προκύψει εξωτερική διακοπή σε οποιαδήποτε αλλαγή σε οποιαδήποτε ακίδα. (για παράδειγμα στο ATmega164P)

Ο τρίτος τρόπος είναι για το πληκτρολόγιο matrix

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

Οι έξοδοι PC0, PC1, PC2, PC3 είναι οι σειρές του πίνακα, οι έξοδοι PB0, PB1, PB2 είναι οι στήλες του πίνακα. Τα κουμπιά μπορούν να μετρηθούν είτε ανά γραμμή είτε ανά στήλη. Ας υποθέσουμε ότι τους ρωτάμε στήλη προς στήλη. Η διαδικασία της ψηφοφορίας θα έχει ως εξής: Η αρχική κατάσταση όλων των ακίδων είναι η είσοδος με ενεργοποιημένη την αντίσταση έλξης. Ρυθμίστε τον ακροδέκτη PB0 στη λειτουργία εξόδου και ρυθμίστε στο μηδέν. Πατώντας τώρα τα κουμπιά S1, S2, S3, S4 θα κλείσουν οι έξοδοι PC0, PC1, PC2, PC3 σε 0 ισχύ. Εξετάζουμε αυτά τα συμπεράσματα και προσδιορίζουμε εάν πατηθεί κάποιο κουμπί αυτή τη στιγμή. Ρυθμίστε την ακίδα PB0 στη λειτουργία εξόδου και ενεργοποιήστε την αντίσταση έλξης. Ρυθμίστε την έξοδο PB1 στη λειτουργία εξόδου και μηδενίστε. Και πάλι, ανακρίνουμε τα συμπεράσματα PC0, PC1, PC2, PC3. Τώρα πατώντας τα κουμπιά S5, S6, S7, S8 θα κλείσουν οι έξοδοι PC0, PC1, PC2, PC3. Με τον ίδιο τρόπο ανακρίνουμε την τελευταία στήλη κουμπιών.

Οι σειρές της μήτρας μπορούν να οδηγηθούν μέσω διόδων στην έξοδο μιας εξωτερικής διακοπής. Τότε η λογική του προγράμματος θα μπορούσε να κατασκευαστεί έτσι. Εάν το πληκτρολόγιο δεν χρησιμοποιηθεί για αρκετά λεπτά, ο μικροελεγκτής εισέρχεται σε λειτουργία χαμηλής κατανάλωσης. Σε αυτήν την περίπτωση, οι έξοδοι PB0, PB1, PB2 διαμορφώνονται ως έξοδοι με μηδενικό λογικό επίπεδο. Όταν πατηθεί ένα από τα κουμπιά, η έξοδος διακοπής της διόδου κλείνει στο μηδέν. Αυτό ενεργοποιεί μια εξωτερική διακοπή, ο μικροελεγκτής ξυπνά και ξεκινά ένα χρονόμετρο στο οποίο σαρώνεται το πληκτρολόγιο. Παράλληλα, ξεκινά ένας μετρητής χρόνου, ο οποίος επαναφέρεται όταν πατηθεί κάποιο από τα κουμπιά. Μόλις ξεχειλίσει, ο μικροελεγκτής μπαίνει ξανά σε λειτουργία χαμηλής κατανάλωσης.

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

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

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

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

Αφού δημιουργήσουμε το έργο, ας φέρουμε τον κώδικα σε αυτήν τη φόρμα:

#περιλαμβάνω #περιλαμβάνω void main(void ) ( PORTB= 0x02 ; DDRB= 0x01 ; while (1 ) ( if (PINB.1== 0 ) (PORTB.0= 1 ; delay_ms(100 ) ; PORTB.0= 0 ; delay_ms(100 ) ;)) ;)

#περιλαμβάνω #περιλαμβάνω void main(void) ( PORTB=0x02; DDRB=0x01; while (1) ( if(PINB.1==0) (PORTB.0=1; delay_ms(100); PORTB.0=0; delay_ms(100)) ;) );)

Όπως μπορούμε να δούμε, η ρύθμιση της θύρας έχει αλλάξει σε σύγκριση με το πρώτο μάθημα.

if(PINB.1==0) ()

αυτή η γραμμή πρέπει να διαβαστεί ως εξής - εάν η γείωση είναι συνδεδεμένη στον ακροδέκτη 1 της θύρας Β (0 δυναμικό), τότε εκτελέστε τον κώδικα σε σγουρές αγκύλες. Στο παράδειγμά μας, αυτός είναι ο κώδικας από το πρώτο μάθημα. Εάν το κουμπί δεν είναι κλειστό, τότε μην κάνετε τίποτα. Μπορείτε να κάνετε μοντελοποίηση στο Proteuse.

Αντί για κουμπί, μπορείτε να βάλετε έναν αισθητήρα, ένα ρελέ κ.λπ., αντί για ένα LED - βομβητή, σας βγάζει συναγερμός.

Διατίθεται αρχείο με υλικολογισμικό και αρχείο proteus

Ενημέρωση 1: Γιατί χρειάζεστε ένα τράβηγμα θύρας;
Η είσοδος MK έχει μεγάλη αντίσταση, αν ακόμη και μικρορεύματα προκαλούνται από ροή παρεμβολών, τότε σύμφωνα με το νόμο του Ohm U \u003d R * I, αυτό μπορεί να οδηγήσει στο γεγονός ότι εμφανίζεται ένα log 1 στην είσοδο. Για να αποφύγετε τέτοια προβλήματα στους μικροελεγκτές AVR , μπορείτε να συνδέσετε το πόδι στο power plus μέσω μιας αντίστασης έλξης. Σε αυτήν την περίπτωση, ακόμη και η λογική της εργασίας αλλάζει αντίστροφα - αλλά αν εμφανιστούν παρεμβολές, δεν μας ενδιαφέρει, γιατί έχουμε ήδη μια λογική μονάδα στην είσοδο.

Γιατί να συνδεθεί μέσω μιας αντίστασης; Ας πούμε ότι συνδέσαμε την είσοδο στο θετικό απευθείας χωρίς αντίσταση. Όταν ενεργοποιηθεί το κουμπί, θα τραβήξει την είσοδο στη γείωση, έτσι θα υπάρχει ένα σύντομο διάστημα μεταξύ + και γείωσης στην είσοδο. Εάν υπάρχει αντίσταση, τότε όταν το κουμπί είναι κλειστό στη μία πλευρά, θα παραμείνει συνδεδεμένο στο + και από την άλλη πλευρά, η γείωση από το κουμπί θα εμφανιστεί σε αυτό. Ένα ρεύμα θα ρέει μέσω της αντίστασης, αλλά η τιμή του δεν θα είναι τόσο μεγάλη.

Ενημέρωση2: Προστέθηκε ένα τεστ στο οποίο μπορείτε να ελέγξετε πόσο καλά έχετε μάθει το υλικό του μαθήματος

Αυτή η ταινία απαιτεί Flash Player 9

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

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

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

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


Η αναπήδηση επαφής εμφανίζεται όταν δημιουργείται ή ανοίγει μια επαφή. Κοίτα την εικόνα:

Η επαφή είναι αρχικά ανοιχτή.

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

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

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

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

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

Φανταστείτε ότι τα κουμπιά μας είναι ένα πληκτρολόγιο τηλεφώνου. Πατάμε τον αριθμό 8, που σημαίνει ότι αυτός ο αριθμός θα καλείται από το τηλέφωνο μία φορά. Αλλά το τηλέφωνο καλεί 5 ή 10 οκτώ, επειδή οι προγραμματιστές του τηλεφώνου δεν μπήκαν στον κόπο να παρέχουν προστασία από την αναπήδηση της επαφής. Θα χρησιμοποιήσετε αυτό το τηλέφωνο;

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

Εξάλειψη αναπήδησης επαφής

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

Υπάρχουν δύο τρόποι αντιμετώπισης της αναπήδησης επαφής:

  1. Σκεύη, εξαρτήματα
  2. Πρόγραμμα

Καταστολή αναπήδησης υλικού

Η καταστολή συνομιλίας υλικού είναι λύσεις κυκλώματος που σας επιτρέπουν να εξαλείψετε αυτό το δυσάρεστο αποτέλεσμα. Τις περισσότερες φορές αυτό είναι ένα απλό κύκλωμα RC, ή γενικά μόνο ένας πυκνωτής.

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

Ένα απλό κύκλωμα για την εξάλειψη της αναπήδησης επαφής φαίνεται στο σχήμα:

Οι τιμές των στοιχείων είναι κατά προσέγγιση. Θεωρητικά, θα πρέπει να υπολογίζονται για κάθε μεμονωμένη περίπτωση. Αλλά στις περισσότερες περιπτώσεις είναι μια χαρά.

Υπάρχουν επίσης πιο περίπλοκα σχήματα καταστολής αναπήδησης επαφών που δεν απαιτούν υπολογισμό, επειδή εκτελούνται σε ψηφιακά στοιχεία. Για παράδειγμα, ένα κύκλωμα σε ένα flip-flop RS. Αλλά σε συσκευές που βασίζονται σε μικροελεγκτές, δεν έχει νόημα να χρησιμοποιείτε τέτοια κόλπα.

Καταστολή αναπήδησης επαφών λογισμικού

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

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

Το πιο απλό και κοινό λύση λογισμικούγια την καταπολέμηση της φλυαρίας - αυτή είναι μια χρονική καθυστέρηση. Ο αλγόριθμος είναι απλός:

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

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

Σε αυτήν την περίπτωση, μπορεί να εφαρμοστεί ο ακόλουθος αλγόριθμος:

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

Για παράδειγμα, εάν σε ένα δευτερόλεπτο στην είσοδο είχαμε λογικό 1 50 φορές και λογικό 0 20 φορές, τότε μπορούμε να υποθέσουμε ότι η είσοδος είναι μία. Φυσικά, εδώ χρειαζόμαστε μια ατομική προσέγγιση ανάλογα με την εργασία.

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


Στα προηγούμενα μαθήματα, πραγματοποιήθηκαν μέθοδοι για την έξοδο πληροφοριών από τον μικροελεγκτή: σύνδεση LED και ένδειξης LCD. Πώς όμως εισάγουμε πληροφορίες στον μικροελεγκτή; Υπάρχουν πολλές επιλογές και συσκευές για αυτό. Αλλά προς το παρόν, ας εξετάσουμε την απλούστερη επιλογή, αυτό είναι ένα κανονικό κουμπί. Τα κουμπιά είναι δύο τύπων: ρολόι και κλείδωμα. Τα κουμπιά τακτ λειτουργούν σύμφωνα με αυτήν την αρχή: πατημένα - οι επαφές έκλεισαν, απελευθερώθηκαν - οι επαφές άνοιξαν. Πρέπει να σημειωθεί ότι υπάρχουν κουμπιά τακτ που είναι αρχικά κλειστά και ανοίγουν όταν πατηθούν. Τα κουμπιά κλειδώματος (ονομάζονται μερικές φορές: διακόπτες εναλλαγής, διακόπτες, διακόπτες), σε αντίθεση με τα κουμπιά ρολογιού, σταθεροποιούν τη θέση τους όταν πιέζονται, δηλαδή: πατημένο - οι επαφές έκλεισαν, πιέζονται ξανά - οι επαφές άνοιξαν. Σε γενικές γραμμές, καταλάβαμε τα κουμπιά, τώρα θα καταλάβουμε πώς να συνδέσουμε αυτά τα κουμπιά στον μικροελεγκτή. Και είναι πραγματικά εύκολο να συνδεθείτε! Ας δούμε το διάγραμμα:

Ίσως ρωτάτε: Γιατί αντίσταση R1; Και στη συνέχεια, χωρίς την αντίσταση R1, όταν το κουμπί S1 είναι ανοιχτό, ο μικροελεγκτής στη θύρα στην οποία είναι συνδεδεμένα όλα αυτά θα δει είτε ένα λογικό 1 είτε ένα λογικό 0, με αποτέλεσμα να ενεργοποιείται ψευδώς το κουμπί. Για να μην συμβεί αυτό, είναι απαραίτητο να "σηκώσετε" αυτή τη θύρα με αντίσταση στο power plus. Η αντίσταση της αντίστασης R1 μπορεί να κυμαίνεται από 4,7 kOhm έως 10 kOhm. Με μια αντίσταση, προκύπτει η ακόλουθη εικόνα: πατιέται το κουμπί S1 - εμφανίζεται ένα λογικό 0 στη θύρα MK, το κουμπί S1 δεν πιέζεται - εμφανίζεται ένα λογικό 1 στη θύρα MK λόγω της αντίστασης R1. Φυσικά, πρέπει να γνωρίζετε ότι ορισμένοι μικροελεγκτές AVR έχουν ενσωματωμένες αντιστάσεις pull-up της τάξης των 50 kΩ, από προεπιλογή είναι απενεργοποιημένες. Στο BASCOM-AVR, αυτές οι αντιστάσεις μπορούν να ενεργοποιηθούν γράφοντας μια λογική 1 στην απαιτούμενη θύρα. Αλλά δεν συνιστώ ανεπιφύλακτα τη χρήση αυτών των ενσωματωμένων, είναι πολύ πιο αξιόπιστη η χρήση εξωτερικών, όπως φαίνεται στο παραπάνω διάγραμμα . Λοιπόν, καταλάβαμε τη σχηματική λύση, τώρα θα την καταλάβουμε προγραμματικά. Για να εργαστείτε με το κουμπί, πρέπει πρώτα να διαμορφώσετε τη θύρα του μικροελεγκτή ως είσοδο, στο BASCOM-AVR αυτό γίνεται ως εξής:
config(θύρα μικροελεγκτή) = είσοδος
Παράδειγμα:
Ρύθμιση PINB.3 = είσοδος

Λάβετε υπόψη ότι για να λειτουργήσει μια θύρα εισόδου, το όνομα της θύρας πρέπει να ξεκινά με PIN και όχι με PORT όπως για μια διαμόρφωση θύρας εξόδου!

Αφού διαμορφώσουμε τη θύρα εισόδου, μπορούμε να διαβάσουμε την τιμή 1 ή 0 από αυτήν, στην περίπτωσή μας 0 - πατιέται το κουμπί, 1 - δεν πατιέται το κουμπί. Και για να ελέγξουμε ότι το κουμπί είναι πατημένο, μπορούμε να κάνουμε το εξής:
Αν(θύρα μικροελεγκτή) = 0 τότε
(αν πατηθεί το κουμπί, τότε εκτελούμε τις ενέργειες που περιγράφονται εδώ)
τέλος εαν
Μπορείτε, και αντίστροφα, να ελέγξετε εάν το κουμπί είναι πατημένο:
Αν(θύρα μικροελεγκτή) = 1 τότε
(αν δεν πατηθεί το κουμπί, τότε εκτελούμε τις ενέργειες που περιγράφονται εδώ)
τέλος εαν
Παράδειγμα:
Αν PINB.3 = 0 τότε
PORTB.2 = 1 "αν πατηθεί το κουμπί, τότε ανάψτε το LED που είναι συνδεδεμένο στο PB.2
τέλος εαν

Απλό, έτσι δεν είναι; Λοιπόν, τώρα ας προσπαθήσουμε να εφαρμόσουμε τη σύνδεση του κουμπιού με τον μικροελεγκτή σε υλικό. Παίρνουμε ως βάση τον μικροελεγκτή Attiny13 και τον φτιάξαμε λίγο νωρίτερα. Για όσους δεν έφτιαξαν πίνακα εντοπισμού σφαλμάτων, εδώ είναι το διάγραμμα:

Ο αλγόριθμος του προγράμματος είναι ο εξής: πατιέται το κουμπί S1 - το LED είναι σβηστό, το κουμπί S1 δεν πατιέται - το LED είναι αναμμένο. Και εδώ είναι το ίδιο το πρόγραμμα στο BASCOM-AVR:

$regfile = "attiny13.dat" $crystal = 8000000 Config Pinb.3 = Input Config Portb.2 = Output Do If Pinb.3 = 0 Τότε Portb.2 = 0 If Pinb.3 = 1 Τότε Portb.2 = 1 Loop Τέλος

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

Λήψη αρχείων για το μάθημα (έργο στο , πηγή, υλικολογισμικό) μπορείτε παρακάτω

Λίστα ραδιοφωνικών στοιχείων

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

ATtiny13

1 Στο σημειωματάριο
R1, R2 Αντίσταση

4,7 kOhm

2 Στο σημειωματάριο
R3 Αντίσταση

150 ωμ

1 Στο σημειωματάριο
HL1 Δίοδος εκπομπής φωτός 1