Πίνακας περιεχομένων:

Πώς να ερμηνεύσετε την κατεύθυνση περιστροφής από έναν ψηφιακό περιστροφικό διακόπτη με PIC: 5 βήματα
Πώς να ερμηνεύσετε την κατεύθυνση περιστροφής από έναν ψηφιακό περιστροφικό διακόπτη με PIC: 5 βήματα

Βίντεο: Πώς να ερμηνεύσετε την κατεύθυνση περιστροφής από έναν ψηφιακό περιστροφικό διακόπτη με PIC: 5 βήματα

Βίντεο: Πώς να ερμηνεύσετε την κατεύθυνση περιστροφής από έναν ψηφιακό περιστροφικό διακόπτη με PIC: 5 βήματα
Βίντεο: ΠΑΡΑΛΛΗΛΟΙ ΚΥΚΛΟΙ & ΜΕΣΗΜΒΡΙΝΟΙ - ΓΕΩΓΡΑΦΙΚΟ ΠΛΑΤΟΣ - ΓΕΩΓΡΑΦΙΚΟ ΜΗΚΟΣ - ΔΙΚΤΥΟ ΣΥΝΤΕΤΑΓΜΕΝΩΝ.(HD) 2024, Ιούλιος
Anonim
Πώς να ερμηνεύσετε την κατεύθυνση περιστροφής από έναν ψηφιακό περιστροφικό διακόπτη με ένα PIC
Πώς να ερμηνεύσετε την κατεύθυνση περιστροφής από έναν ψηφιακό περιστροφικό διακόπτη με ένα PIC

Ο στόχος αυτού του Instructable είναι να απεικονίσει τον τρόπο διασύνδεσης ενός ψηφιακού (κωδικοποιημένου τετραγωνικού) περιστροφικού διακόπτη με έναν μικροελεγκτή. Μην ανησυχείτε, θα εξηγήσω τι σημαίνει για εμάς η τετραγωνικότητα που έχει κωδικοποιηθεί. Αυτή η διεπαφή και το συνοδευτικό λογισμικό θα επιτρέψουν στον μικροελεγκτή να αναγνωρίσει την κατεύθυνση περιστροφής για κάθε κίνηση από το ένα σημείο στο άλλο. Πρόσφατα χρησιμοποίησα αυτόν τον τύπο διακόπτη σε ένα έργο μικροελεγκτή που απαιτούσε να εισαχθεί ένα σημείο ρύθμισης πίεσης χρησιμοποιώντας ένα κουμπί με 16 συγκρατεί αντί για κουμπιά πάνω/κάτω. Η ιδέα ήταν να επιτραπεί στον χρήστη να "καλέσει" την επιθυμητή πίεση. Ως αποτέλεσμα, έπρεπε να αναπτύξουμε μια ρουτίνα λογισμικού για να λάβουμε τις πληροφορίες θέσης από το διακόπτη και να συμπεράνουμε την κατεύθυνση περιστροφής για να αυξήσουμε ή να μειώσουμε το σημείο ρύθμισης πίεσης για το κύριο σύστημα. Σε αυτό το Οδηγίες, θα καλύψω τη φυσική διεπαφή στον μικροελεγκτή, τη θεωρία λειτουργίας του περιστροφικού διακόπτη, τη θεωρία λειτουργίας του λογισμικού καθώς και τη ρουτίνα έκπτωσης. Τέλος, θα σας δείξω την εφαρμογή μου για τη ρουτίνα έκπτωσης. Καθώς προχωράμε, θα προσπαθήσω να διατηρήσω τα πράγματα κάπως γενικά, έτσι ώστε η ιδέα να μπορεί να εφαρμοστεί σε όσο το δυνατόν περισσότερες πλατφόρμες, αλλά θα μοιραστώ επίσης τι έκανα για να δείτε μια συγκεκριμένη εφαρμογή.

Βήμα 1: Μέρη

Ανταλλακτικά
Ανταλλακτικά

Για να το υλοποιήσετε, θα χρειαστείτε: Ένας περιστροφικός διακόπτης (κωδικοποιημένος σε τετραγωνικό επίπεδο) Τραβήξτε τις αντιστάσεις Κατάλληλη πλατφόρμα μικροελεγκτή Για το έργο μου, χρησιμοποίησα έναν οπτικό κωδικοποιητή Grayhill 61C22-01-04-02. Το φύλλο δεδομένων για τον περιστροφικό διακόπτη απαιτεί αντίσταση έλξης 8,2k ohm στις δύο γραμμές δεδομένων που προέρχονται από το διακόπτη. Θα θέλετε να ελέγξετε το φύλλο δεδομένων για τον κωδικοποιητή που επιλέγετε να χρησιμοποιήσετε. Ο περιστροφικός διακόπτης που χρησιμοποίησα μπορεί επίσης να παραγγελθεί με έναν διακόπτη αξονικού κουμπιού. Είναι μια χρήσιμη δυνατότητα για την εκτέλεση επιλογών που έχουν κληθεί, κλπ. Αλλά δεν θα συζητήσω τη διεπαφή του εδώ. Έχω μια "κατάλληλη πλατφόρμα μικροελεγκτή" που αναφέρεται επειδή (νομίζω) μπορεί να εφαρμοστεί σε περισσότερες από μία πλατφόρμες. Έχω δει πολλούς ανθρώπους να χρησιμοποιούν άλλους μικροελεγκτές για το Instructables, οπότε θέλω να δείξω και τη γενική προσέγγιση. Έγραψα όλο τον κώδικα στο PIC Basic Pro για χρήση με μικροτσίπ PIC16F877A. Πραγματικά, το βασικό πράγμα που χρειάζεστε στον μικροελεγκτή είναι η δυνατότητα διακοπής όταν υπάρχει λογική αλλαγή σε οποιαδήποτε από τις δύο ακίδες. Στο PIC16F877A, αυτό ονομάζεται διακοπή αλλαγής PORTB. Μπορεί να υπάρχουν άλλα ονόματα σε άλλους ελεγκτές. Αυτή η λειτουργία διακοπής μικροελεγκτή είναι μέρος αυτού που κάνει αυτήν την εφαρμογή τόσο κομψή.

Βήμα 2: Διασύνδεση υλικού

Διασύνδεση υλικού
Διασύνδεση υλικού

Μια "απλή" λύση θα ήταν να υπάρχει ένας διακόπτης "single pole-16 throw" με 16 συνδέσεις στον μικροελεγκτή. Κάθε έξοδος διακόπτη θα ήταν στη συνέχεια συνδεδεμένη με μια καρφίτσα στον μικροελεγκτή, έτσι ώστε κάθε θέση κλήσης να μπορεί να ελεγχθεί από τον μικροελεγκτή. Πρόκειται για υπερβολική χρήση ακίδων εισόδου/εξόδου. Τα πράγματα γίνονται ακόμη χειρότερα αν θέλουμε να έχουμε στη διάθεσή μας περισσότερες από 16 θέσεις. Κάθε επιπλέον θέση στο διακόπτη θα απαιτούσε μια επιπλέον είσοδο στον μικροελεγκτή. Αυτό γίνεται γρήγορα μια πολύ αναποτελεσματική χρήση εισόδων σε έναν μικροελεγκτή. Εισαγάγετε την ομορφιά του περιστροφικού διακόπτη. Ο περιστροφικός διακόπτης έχει μόνο δύο εξόδους στον μικροελεγκτή που αναφέρονται ως Α και Β στο φύλλο δεδομένων. Υπάρχουν μόνο τέσσερα πιθανά επίπεδα λογικής που μπορούν να λάβουν αυτές οι γραμμές: AB = 00, 01, 10 και 11. Αυτό μειώνει σημαντικά τον αριθμό των γραμμών εισόδου που πρέπει να χρησιμοποιήσετε για τη σύνδεση του διακόπτη στον μικροελεγκτή. Έτσι, μειώσαμε τον αριθμό των γραμμών εισόδου σε δύο μόνο. Και τώρα τι? Φαίνεται ότι χρειαζόμαστε πραγματικά 16 διαφορετικές καταστάσεις, αλλά αυτός ο νέος διακόπτης έχει μόνο τέσσερις. Έχουμε πυροβολήσει τον εαυτό μας στο πόδι; Οχι. Συνέχισε να διαβάζεις. Θα καλύψουμε λίγο τη θεωρία πίσω από τη λειτουργία του περιστροφικού διακόπτη για να εξηγήσουμε.

Βήμα 3: Θεωρία λειτουργίας υλικού

Θεωρία Λειτουργίας Υλικού
Θεωρία Λειτουργίας Υλικού
Θεωρία Λειτουργίας Υλικού
Θεωρία Λειτουργίας Υλικού
Θεωρία Λειτουργίας Υλικού
Θεωρία Λειτουργίας Υλικού

Η ανίχνευση κατεύθυνσης περιστροφής είναι δυνατή χρησιμοποιώντας τον προαναφερθέντα διακόπτη "μονόπολο-16 ρίψης", αλλά καταναλώνει πολλές εισόδους στον μικροελεγκτή. Η χρήση του περιστροφικού διακόπτη μειώνει τον αριθμό των εισόδων στον μικροελεγκτή, αλλά τώρα πρέπει να ερμηνεύσουμε τα σήματα που προέρχονται από τον διακόπτη και να τα μεταφράσουμε σε κατεύθυνση περιστροφής. Ανέφερα νωρίτερα ότι ο διακόπτης κωδικοποιήθηκε σε τετραγωνικό επίπεδο. Αυτή είναι επίσης μια από τις βασικές κομψότητες σε αυτήν τη λύση. Αυτό σημαίνει ότι υπάρχει ένας κωδικός 2-bit που δίνει ο διακόπτης που αντιστοιχεί στη θέση του διακόπτη. Mightσως σκέφτεστε: "Εάν υπάρχει είσοδος δύο bit στον μικροελεγκτή, πώς αντιπροσωπεύουμε και τις 16 θέσεις;" Αυτή είναι μια καλή ερώτηση. Δεν τους εκπροσωπούμε όλους. Απλώς πρέπει να γνωρίζουμε τις σχετικές θέσεις του κουμπιού, ώστε να μπορούμε να καθορίσουμε την κατεύθυνση περιστροφής. Η απόλυτη θέση του κουμπιού είναι άσχετη. Για περιστροφή δεξιόστροφα, ο κωδικός που δίνει ο διακόπτης επαναλαμβάνεται κάθε τέσσερα περιστατικά και είναι γκρι κωδικοποιημένος. Γκρι κωδικοποιημένο σημαίνει ότι υπάρχει μόνο μία αλλαγή bit για κάθε αλλαγή θέσης. Αντί να μετράει η είσοδος ΑΒ για περιστροφή δεξιόστροφα σε δυαδική μορφή ως εξής: 00, 01, 10, 11, αλλάζει κάπως έτσι: 00, 10, 11, 01. Παρατηρήστε ότι για το τελευταίο μοτίβο, υπάρχει μόνο μία είσοδος που αλλάζει μεταξύ σκηνικά. Οι αριστερόστροφες τιμές για την είσοδο ΑΒ στον μικροελεγκτή θα έχουν την εξής μορφή: 00, 01, 11, 10. Αυτό είναι απλά το αντίστροφο του μοτίβου των δεικτών του ρολογιού με το AB = 00 να αναγράφεται πρώτα. Ρίξτε μια ματιά στα διαγράμματα για μια πιο οπτική εξήγηση Το

Βήμα 4: Θεωρία Λειτουργίας Λογισμικού

Θεωρία Λειτουργίας Λογισμικού
Θεωρία Λειτουργίας Λογισμικού

Η ρουτίνα που συμπεραίνει την κατεύθυνση περιστροφής οδηγείται σε διακοπή. Ο μικροελεγκτής που επιλέγετε πρέπει να μπορεί να διακόψει κάθε φορά που υπάρχει αλλαγή σε μία από τις (τουλάχιστον) δύο ακίδες όταν είναι ενεργοποιημένη η διακοπή. Αυτό ονομάζεται διακοπή αλλαγής PORTB στο PIC16F877A. Κάθε φορά που περιστρέφεται ο διακόπτης, ο μικροελεγκτής θα διακόπτεται και η εκτέλεση του προγράμματος θα αποστέλλεται στη ρουτίνα υπηρεσιών διακοπής (ISR). Το ISR θα καταλάβει γρήγορα με ποιον τρόπο περιστρέφεται ο διακόπτης, θα ορίσει μια σημαία κατάλληλα και θα επιστρέψει γρήγορα στο κύριο πρόγραμμα. Χρειαζόμαστε αυτό να συμβεί γρήγορα σε περίπτωση που ο χρήστης περιστρέψει τον διακόπτη πολύ γρήγορα. Γνωρίζουμε ότι το μοτίβο AB με γκρι κωδικοποίηση επαναλαμβάνεται κάθε τέσσερις θέσεις, οπότε αν κάνουμε τη ρουτίνα να λειτουργήσει για μεταβάσεις μεταξύ αυτών των τεσσάρων θέσεων, θα λειτουργήσει για όλες τις άλλες. Παρατηρήστε ότι σε έναν κύκλο τεσσάρων θέσεων, υπάρχουν τέσσερα άκρα. Μια ανερχόμενη άκρη και μια ακμή που πέφτει για την είσοδο Α καθώς και την είσοδο Β. Ο μικροεπεξεργαστής θα διακόπτεται κάθε φορά που υπάρχει μια άκρη που σημαίνει ότι ο μικροελεγκτής θα διακοπεί κάθε φορά που γυρίζει το κουμπί. Ως αποτέλεσμα, το ISR πρέπει να καταλάβει με ποια κατεύθυνση έχει γυρίσει το κουμπί. Για να μας βοηθήσετε να καταλάβουμε πώς να το κάνουμε αυτό, στρεφόμαστε στην κυματομορφή για δεξιόστροφη περιστροφή. Παρατηρήστε ότι κάθε φορά που το A έχει ένα άκρο, η νέα τιμή του είναι πάντα διαφορετική από αυτή του B. Όταν το κουμπί πηγαίνει από τη θέση 1 στην 2, το Α μεταβαίνει από τη λογική-0 στη λογική-1. Το Β εξακολουθεί να είναι 0 για αυτήν τη μετάβαση και δεν ταιριάζει με τη νέα τιμή του Α. Όταν το κουμπί μεταβεί από τη θέση 3 στην 4, το Α έχει πτώση, ενώ το Β παραμένει στη λογική-1. Παρατηρήστε ξανά ότι το Β και η νέα τιμή του Α είναι διαφορετικά. Αυτή τη στιγμή, μπορούμε να δούμε ότι οποιαδήποτε στιγμή το Α προκαλεί τη διακοπή κατά τη φορά των δεικτών του ρολογιού, η νέα τιμή του είναι διαφορετική από αυτή του Β. Ας ελέγξουμε το Β για να δούμε τι συμβαίνει. Το Β έχει μια ανερχόμενη άκρη όταν ο διακόπτης μεταβαίνει από τη θέση 2 σε 3. Εδώ, η νέα τιμή του Β είναι η ίδια με την Α. Κοιτάζοντας την τελευταία εναπομείναντα άκρη για περιστροφή δεξιόστροφα, το Β έχει μια άκρη πτώσης που μετακινείται από τη θέση 4 στην 5. (Η θέση 5 είναι ίδια με τη θέση 1.) Η νέα τιμή του Β είναι ίδια με την Α και εδώ! Μπορούμε τώρα να κάνουμε κάποιες κρατήσεις! Εάν το Α προκαλεί τη διακοπή και η νέα τιμή του Α είναι διαφορετική από αυτή του Β, η περιστροφή ήταν δεξιόστροφη. Επιπλέον, εάν το Β προκαλεί τη διακοπή και η νέα τιμή του Β είναι ίδια με το Α, τότε η περιστροφή ήταν δεξιόστροφη. Ας εξετάσουμε γρήγορα την περίπτωση αριστερόστροφης περιστροφής. Όπως ακριβώς περιστρέφεται δεξιόστροφα, αριστερόστροφη περιστροφή θα προκαλέσει τέσσερις διακοπές σε έναν κύκλο: δύο για την είσοδο Α και δύο για την είσοδο Β. Η είσοδος Α έχει ανερχόμενη άκρη όταν το κουμπί μετακινείται από τη θέση 4 στην 3 και μια πτώση άκρη που μετακινείται από τη θέση 2 στην 1 Όταν το κουμπί μετακινείται από τη θέση 4 στην 3, η νέα τιμή του Α είναι η ίδια με την τιμή του Β. Παρατηρήστε ότι όταν το Α μετακινείται από τη θέση 2 στην 1, η νέα τιμή του είναι ίδια με αυτήν του Β επίσης. Τώρα, μπορούμε να δούμε ότι όταν το Α προκαλεί τη διακοπή και η νέα τιμή του ταιριάζει με αυτή του Β, η περιστροφή ήταν αριστερόστροφη. Γρήγορα, θα εξετάσουμε την είσοδο Β για να επαληθεύσουμε τα πάντα. Το B θα προκαλέσει διακοπή όταν το κουμπί μετακινηθεί από τη θέση 5 (που είναι το ίδιο με το 1) στο 4 και όταν το κουμπί μετακινηθεί από τη θέση 3 στη 2. Και στις δύο αυτές περιπτώσεις, η νέα τιμή του Β δεν ταιριάζει με την υπάρχουσα τιμή του Α που είναι το αντίθετο των περιπτώσεων όταν το Β προκαλεί τη διακοπή για περιστροφή δεξιόστροφα. Αυτά είναι καλά νέα. Όλα ελέγχονται όπως θα έπρεπε. Συνοψίζοντας, εάν το Α προκαλεί τη διακοπή και η νέα τιμή του δεν ταιριάζει με την τιμή του Β ή εάν το Β προκαλεί τη διακοπή και η νέα τιμή του Β ταιριάζει με την τιμή του Α που γνωρίζουμε ότι υπήρχε περιστροφή δεξιόστροφα. Μπορούμε να ελέγξουμε τις άλλες περιπτώσεις αριστερόστροφης περιστροφής στο λογισμικό ή μπορούμε να υποθέσουμε ότι επειδή δεν ήταν δεξιόστροφη περιστροφή ήταν αριστερόστροφη. Η ρουτίνα μου απλώς έκανε την υπόθεση.

Βήμα 5: Λογισμικό

Λογισμικό
Λογισμικό
Λογισμικό
Λογισμικό

Δεν χρησιμοποίησα τις ενσωματωμένες διακοπές στο PIC Basic Pro. Χρησιμοποίησα μερικά αρχεία που συμπεριέλαβα στον κώδικά μου από τον Darrel Taylor για να οδηγήσω τη ρουτίνα. Εδώ ανήκει μια τεράστια πίστωση στον Ντάρελ! Τα αρχεία είναι δωρεάν. Απλώς επισκεφθείτε τον ιστότοπό του για περισσότερες πληροφορίες, άλλες εφαρμογές και λήψη των αρχείων. Μπορείτε να παραλείψετε αυτό το μέρος εάν δεν χρησιμοποιείτε PIC με διακοπή του Darrel Taylor. Απλώς ρυθμίστε τις διακοπές όπως είναι απαραίτητο στην πλατφόρμα που χρησιμοποιείτε. Για να ρυθμίσετε τις διακοπές Darrel Taylor (DT), υπάρχουν δύο πράγματα που πρέπει να κάνετε: 1.) Συμπεριλάβετε τα αρχεία DT_INTS-14.bas και ReEnterPBP.bas στα αρχεία σας κωδικός.2.) Αντιγράψτε και επικολλήστε αυτό στον κωδικό σας. ASMINT_LIST μακροεντολή; IntSource, Label, Type, ResetFlag? INT_Handler RBC_INT, _ISR, PBP, ναι endm INT_CREATEENDASMIΕισάγετε καρτέλες και κενά όπως το γραφικό στο τέλος του Instructable, ώστε να μπορείτε να δείτε τα πράγματα λίγο πιο εύκολα στον κώδικά σας. Θα πρέπει να το τροποποιήσετε ελαφρώς για να ταιριάζει στις ανάγκες σας. Στην Ετικέτα, αντικαταστήστε το ISR με το όνομα της υπορουτίνας που είναι το ISR σας. Μην ξεχάσετε την υπογράμμιση! Το χρειάζεστε! Για να λειτουργήσουν οι διακοπές, υπάρχουν δύο ακόμη πράγματα που πρέπει να κάνετε: 1.) Γράψτε το ISR. Θα το γράψετε ακριβώς όπως επρόκειτο να γράψετε μια υπορουτίνα PBP, εκτός από το ότι θα χρειαστεί να εισαγάγετε @ INT_RETURN στο τέλος της υπορουτίνας αντί για RETURN. Αυτό θα αναγνωρίσει τη διακοπή και θα επιστρέψει την εκτέλεση προγράμματος στο σημείο που σταμάτησε στον κύριο βρόχο. Μέσα στο ISR, πρέπει να διαγράψετε τη σημαία διακοπής, ώστε το πρόγραμμά σας να μην παγιδευτεί σε επαναληπτική διακοπή. Η απλή ανάγνωση του PORTB είναι το μόνο που πρέπει να γίνει για να καθαρίσετε τη σημαία διακοπής στο PIC16F877A. Κάθε διαφορετικός μικροελεγκτής έχει διαφορετικό τρόπο καθαρισμού των σημαιών διακοπής. Ελέγξτε το φύλλο δεδομένων για τον μικροελεγκτή σας. 2.) Όταν φτάσετε στο σημείο του κώδικα που θέλετε να ενεργοποιήσετε τη διακοπή, χρησιμοποιήστε αυτήν τη γραμμή κώδικα:@ INT_ENABLE RBC_INTΌταν θέλετε να απενεργοποιήσετε τη διακοπή, χρησιμοποιήστε απλά:@ INT_DISABLE RBC_INTΥπάρχουν πολλά από πράγματα που περιλαμβάνονται σε αυτό που μόλις κάλυψα, οπότε θα συνοψίσω γρήγορα. Μέχρι στιγμής, το πρόγραμμά σας θα πρέπει να μοιάζει με αυτό: Οποιαδήποτε απαραίτητη ρύθμιση ή κωδικός INCLUDE "DT_INTS-14.bas" INCLUDE "ReEnterPBP.bas" ASMINT_LIST macro; IntSource, Label, Type, ResetFlag; INT_Handler RBC_INT, _myISR, PBP, ναι τέλος INT_CREATEENDASM; Οποιαδήποτε άλλη απαραίτητη ρύθμιση ή κωδικοποίηση@ INT_ENABLE RBC_INT. Κωδικός που πρέπει να γνωρίζει με ποιον τρόπο περιστρέφεται το κουμπί@ INT_DISABLE RBC_INT. Άλλος κωδικόςEND? Τέλος programmyISR:; Κωδικός ISR εδώ@ INT_RETURN (Πίνακας ρύθμισης χειριστή διακοπών) Νομίζω ότι εδώ μπορεί να συμμετάσχει ξανά όποιος δεν χρησιμοποιεί διακοπές PIC ή DT. Τώρα, πρέπει πραγματικά να γράψουμε το ISR, ώστε ο μικροελεγκτής να γνωρίζει με ποιον τρόπο περιστρέφεται το κουμπί. Θυμηθείτε από την ενότητα θεωρία λογισμικού ότι μπορούμε να συμπεράνουμε την κατεύθυνση περιστροφής εάν γνωρίζουμε την είσοδο που προκάλεσε τη διακοπή, τη νέα τιμή της και την τιμή της άλλης εισόδου. Ακολουθεί ο ψευδοκώδικας: Διαβάστε το PORTB σε μια μεταβλητή μηδενισμού για να διαγράψετε τη σημαία διακοπήςΕλέγξτε αν το A προκάλεσε τη διακοπή. Εάν ισχύει, Συγκρίνετε τα Α και Β. Ελέγξτε αν είναι διαφορετικά, αν είναι διαφορετικά, ήταν δεξιόστροφη περιστροφή Άλλο, countταν αριστερόστροφα EndifCheck αν το Β προκάλεσε τη διακοπή. Εάν ισχύει, Συγκρίνετε τα Α και Β Ελέγξτε αν είναι διαφορετικά, αν είναι ίδια, wiseταν δεξιόστροφη περιστροφή Άλλο, countταν αριστερόστροφα EndifΕπιστροφή από τη διακοπή Η ανακάλυψη της νέας τιμής της αλλαγμένης εισόδου και της άλλης (αμετάβλητης) εισόδου είναι εύκολη επειδή μπορούμε να τις διαβάσουμε μέσα στο ISR. Πρέπει να γνωρίζουμε ποια ήταν η κατάσταση του καθενός προτού αποσταλεί η εκτέλεση στο ISR. Αυτό συμβαίνει στην κύρια ρουτίνα. Η κύρια ρουτίνα κάθεται και περιμένει μια μεταβλητή byte που ονομάσαμε CWflag να οριστεί σε 1 ή να διαγραφεί στο 0 από το ISR. Μετά από κάθε αναγνωρισμένη αλλαγή του κουμπιού ή εάν δεν υπάρχει δραστηριότητα κουμπιού, η μεταβλητή ορίζεται στο 5 για να υποδείξει μια κατάσταση αδράνειας. Εάν η σημαία ρυθμιστεί ή διαγραφεί, η κύρια ρουτίνα αυξάνει ή μειώνει αμέσως την πίεση του σημείου ρύθμισης κατάλληλα με βάση την περιστροφή και, στη συνέχεια, επαναφέρει τη μεταβλητή CWflag στο 5, επειδή το κουμπί είναι ξανά αδρανές. Καθώς η κύρια ρουτίνα είναι ο έλεγχος του CWflag, τεκμηριώνει επίσης την κατάσταση των τιμών περιστροφικού διακόπτη Α και Β. Αυτό είναι πραγματικά απλό και μοιάζει με αυτό: oldA = AoldB = BΔεν υπάρχει πραγματικά τίποτα εξαιρετικά φανταχτερό εδώ. Απλώς συμπεριλάβετε αυτές τις δύο γραμμές στην αρχή του βρόχου που ελέγχουν την περιστροφή του CWflag. Απλώς ενημερώνουμε τις λογικές τιμές των εισόδων από το περιστροφικό κουμπί μέσα στο βρόχο αύξησης/μείωσης στην κύρια ρουτίνα, έτσι ώστε να μπορούμε να δούμε ποια είσοδος προκάλεσε τη διακοπή κατά την εκτέλεση του ISR. Εδώ είναι ο κωδικός ISR: ABchange: scratch = PORTB 'Διαβάστε το PORTB για να διαγράψετε τη σημαία διακοπής' Αν το A προκαλεί τη διακοπή, ελέγξτε το B για κατεύθυνση περιστροφής ΑΝ παλιάA! = A ΤΟΤΕ 'Αν τα A και B είναι διαφορετικά, ήταν δεξιόστροφη περιστροφή IF A! = B ΤΟΤΕ GOTO CW 'Διαφορετικά, ήταν αριστερόστροφη περιστροφή ELSE GOTO CCW ENDIF ENDIF' Αν το B προκαλεί τη διακοπή, ελέγξτε το A για κατεύθυνση περιστροφής ΑΝ παλιάΒ! = Β ΤΟΤΕ 'Αν τα Α και Β είναι ίδια, τότε ήταν δεξιόστροφη περιστροφή ΑΝ A == B ΤΟΤΕ GOTO CW 'Διαφορετικά, ήταν αριστερόστροφη περιστροφή ELSE GOTO CCW ENDIF ENDIFCW: CWflag = 1@ INT_RETURNCCW: CWflag = 0@ INT_RETURNΈχω συμπεριλάβει τον κωδικό ISR σε ένα αρχείο AB_ISR.bas επειδή οι καρτέλες στον κώδικα δεν εμφανίζονται όπως θα έπρεπε. Τώρα, επειδή το ISR έχει τις παλιές τιμές για τις εισόδους Α και Β, μπορεί να καθορίσει ποια είσοδο προκάλεσε τη διακοπή, να το συγκρίνει με την άλλη (αμετάβλητη) είσοδο και να καθορίσει την κατεύθυνση της περιστροφής. Το μόνο που πρέπει να κάνετε είναι να ελέγξετε το CWflag για να δείτε σε ποια κατεύθυνση έχει γυρίσει το κουμπί (αν έχει) και να αυξήσετε ή να μειώσετε έναν μετρητή, να ορίσετε το σημείο ή ό, τι σας αρέσει ή χρειάζεστε. Ελπίζω ότι αυτό βοηθά και δεν ήταν πολύ μπερδεμένο. Αυτός ο τύπος διεπαφής είναι ιδιαίτερα χρήσιμος εάν το σύστημά σας χρησιμοποιεί ήδη διακοπές, καθώς αυτό είναι μόνο μία ακόμη διακοπή για προσθήκη. Απολαμβάνω!

Συνιστάται: