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

Φροντιστήριο AVR Assembler 7: 12 Βήματα
Φροντιστήριο AVR Assembler 7: 12 Βήματα

Βίντεο: Φροντιστήριο AVR Assembler 7: 12 Βήματα

Βίντεο: Φροντιστήριο AVR Assembler 7: 12 Βήματα
Βίντεο: LDmicro 22: Πίνακες Arduino με AVRDUDESS (Προγραμματισμός μικροελεγκτών με LDmicro) 2024, Ιούλιος
Anonim
Εκπαιδευτικό πρόγραμμα AVR Assembler 7
Εκπαιδευτικό πρόγραμμα AVR Assembler 7

Καλώς ήλθατε στο Tutorial 7!

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

  1. ένα πληκτρολόγιο Μπορείτε να αγοράσετε ένα ή μπορείτε να κάνετε αυτό που έκανα και να καθαρίσετε ένα.
  2. 2 γυναικείες κεφαλίδες για το πληκτρολόγιο (αν σκουπίζετε μία)
  3. καλώδια σύνδεσης
  4. μια σανίδα ψωμιού
  5. 4 αντιστάσεις Kohm
  6. 1 15 αντίσταση Kohm
  7. 1 αντίσταση 3,3 Kohm
  8. 1 αντίσταση 180 ohm
  9. Αντίσταση 1 680 ohm
  10. ένα ψηφιακό πολύμετρο
  11. ο αναλυτής σας από το Φροντιστήριο 5

Μπορεί να θέλετε να παραλείψετε τα πρώτα βήματα εάν έχετε ήδη ένα πληκτρολόγιο και δεν χρειάζεται να το καθαρίσετε.

Ακολουθεί ένας σύνδεσμος για την πλήρη συλλογή των σεμιναρίων AVR assembler μου:

Βήμα 1: Εξασφαλίστε ένα πληκτρολόγιο 1

Σκουπίστε ένα πληκτρολόγιο 1
Σκουπίστε ένα πληκτρολόγιο 1
Σκουπίστε ένα πληκτρολόγιο 1
Σκουπίστε ένα πληκτρολόγιο 1
Σκουπίστε ένα πληκτρολόγιο 1
Σκουπίστε ένα πληκτρολόγιο 1
Σκουπίστε ένα πληκτρολόγιο 1
Σκουπίστε ένα πληκτρολόγιο 1

Πολύ παλιά, όταν ακόμη και οι παππούδες σας ήταν απλά παιδιά, οι άνθρωποι συνήθιζαν να χρησιμοποιούν αυτές τις περίεργες συσκευές, που είχαν καλώδια μακριά στον τοίχο, για να επικοινωνούν μεταξύ τους. Ονομάστηκαν "τηλέφωνα" και ήταν συνήθως φθηνά πλαστικά πράγματα που έκαναν έναν ενοχλητικό ήχο όταν κάποιος σας τηλεφωνούσε (όχι ότι οι σημερινοί ήχοι κλήσης "Justin Bieber" δεν είναι εξίσου ενοχλητικοί). Σε κάθε περίπτωση, αυτές οι συσκευές είχαν πληκτρολόγια πάνω τους τα οποία ήταν πολύ απλά ενσύρματα και έτσι καθαρίζονται εύκολα και έχουν 2 επιπλέον πλήκτρα πάνω τους ("επανάκληση" και "φλας") από τα πληκτρολόγια που μπορείτε να αγοράσετε και τα οποία μπορεί να θέλετε να επανατοποθετήσετε ως "πλήκτρα βέλους", "πλήκτρα μενού" ή κάτι άλλο. Έτσι θα ξεκινήσουμε σκουπίζοντας ένα πληκτρολόγιο από ένα παλιό τηλέφωνο. Πάρτε πρώτα το τηλέφωνο (χρησιμοποιώ ένα GE όπως φαίνεται στις εικόνες) και το διαχωρίσετε για να αποκαλύψετε την καλωδίωση. Στη συνέχεια, πάρτε μια σμίλη και σπάστε τα μικρά πλαστικά κουμπιά που κρατούν το πληκτρολόγιο και αφαιρέστε το πληκτρολόγιο.

Βήμα 2: Εξασφάλιση πληκτρολογίου 2

Σκουπίστε ένα πληκτρολόγιο 2
Σκουπίστε ένα πληκτρολόγιο 2
Σκουπίστε ένα πληκτρολόγιο 2
Σκουπίστε ένα πληκτρολόγιο 2
Σκουπίστε ένα πληκτρολόγιο 2
Σκουπίστε ένα πληκτρολόγιο 2

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

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

Μου αρέσει να σκουπίζω τα τρία ηχεία και ίσως τα άλλα πράγματα όπως διακόπτες και ό, τι δεν υπάρχει στον πίνακα. Ωστόσο, αυτή τη φορά δεν πρόκειται να σκουπίσω τους διακόπτες και τα πράγματα γιατί έχουμε άλλους στόχους αυτή τη στιγμή. Επίσης, υπάρχει ένα γραμμικό IC TA31002 εκεί που είναι ένα κουδούνι τηλεφώνου. Το φύλλο δεδομένων βρίσκεται εύκολα και κατεβάζεται διαδικτυακά δίνοντας το pinout και τις δυνατότητες. Έτσι, θα το αφήσω κολλημένο στο ταμπλό προς το παρόν και μετά θα το παίξω αργότερα. Θα ήθελα να το συνδέσω με έναν παλμογράφο και να δω τι δροσερά σήματα μπορώ να βγάλω από αυτό. Maybeσως ακόμη και να κάνετε ένα κουδούνι από αυτό. Ποιός ξέρει.

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

Βήμα 3: Σκουπίστε ένα πληκτρολόγιο 3

Σκουπίστε ένα πληκτρολόγιο 3
Σκουπίστε ένα πληκτρολόγιο 3
Σκουπίστε ένα πληκτρολόγιο 3
Σκουπίστε ένα πληκτρολόγιο 3
Σκουπίστε ένα πληκτρολόγιο 3
Σκουπίστε ένα πληκτρολόγιο 3

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

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

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

Βήμα 4: Συνδέστε το πληκτρολόγιο

Συνδέστε το πληκτρολόγιο
Συνδέστε το πληκτρολόγιο
Συνδέστε το πληκτρολόγιο
Συνδέστε το πληκτρολόγιο

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

Πώς θα λειτουργήσει αυτό θα βάλουμε 5V στην αριστερή πλευρά και η δεξιά πηγαίνει στο GND. Ο πρώτος πείρος στα δεξιά στο διάγραμμα μπαίνει στην πρώτη από τις αναλογικές ακίδες μας στον μικροελεγκτή Atmega328p. Όταν δεν πατηθούν κουμπιά, το σήμα θα είναι 0V και όταν πατηθεί κάθε ένα από τα διαφορετικά κουμπιά, η είσοδος στην αναλογική θύρα θα κυμαίνεται μεταξύ 0V και 5V με διαφορετική ποσότητα ανάλογα με το ποιο πλήκτρο πατήθηκε. Επιλέξαμε τις τιμές αντίστασης έτσι ώστε κάθε διαδρομή να περιέχει μια αντίσταση διαφορετική από τις υπόλοιπες. Η αναλογική θύρα του μικροελεγκτή λαμβάνει ένα αναλογικό σήμα και το χωρίζει σε 1024 διαφορετικά κανάλια μεταξύ 0V και 5V. Αυτό σημαίνει ότι κάθε κανάλι έχει πλάτος 5V/1024 = 0,005 V/κανάλι = 5 mV/κανάλι. Έτσι η αναλογική θύρα μπορεί να διακρίνει τις τάσεις εισόδου αρκεί να διαφέρουν κατά περισσότερο από 5 mV. Στην περίπτωσή μας έχουμε επιλέξει τιμές αντίστασης έτσι ώστε οποιαδήποτε δύο πατήματα πλήκτρων να στέλνουν ένα σήμα τάσης που διαφέρει περισσότερο από αυτό, οπότε ο μικροελεγκτής θα πρέπει εύκολα να μπορεί να αποφασίσει ποιο πλήκτρο πατήθηκε. Το μεγάλο πρόβλημα είναι ότι ολόκληρο το σύστημα είναι πολύ θορυβώδες, οπότε θα πρέπει να επιλέξουμε μια σειρά τάσεων για να αντιστοιχίσουμε σε κάθε πάτημα κουμπιού - αλλά θα μπούμε σε αυτό λίγο αργότερα.

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

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

Βήμα 5: Συνδέστε το πληκτρολόγιο στον αναλυτή σας

Συνδέστε το πληκτρολόγιο στον αναλυτή σας
Συνδέστε το πληκτρολόγιο στον αναλυτή σας
Συνδέστε το πληκτρολόγιο στον αναλυτή σας
Συνδέστε το πληκτρολόγιο στον αναλυτή σας

Οι εικόνες δείχνουν πώς θέλουμε να συνδέσουμε το πληκτρολόγιο στον μικροελεγκτή, έτσι ώστε να μπορούμε να δούμε την έξοδο στην οθόνη του αναλυτή μας. Ουσιαστικά απλώς συνδέουμε την έξοδο από το πληκτρολόγιο στον ακροδέκτη PortC 0, ο οποίος καλείται επίσης ADC0 στο ATmega328P.

Ωστόσο, υπάρχουν μερικά επιπλέον πράγματα. Θα συνδέσουμε επίσης ένα κουμπί στο PD2. Δηλ. μεταφέρετε ένα καλώδιο από τη ράγα σας 5V σε ένα κουμπί και από την άλλη πλευρά του κουμπιού στο PD2, και τέλος, θέλουμε να αποσυνδέσουμε τον πείρο AREF από τη ράγα μας 5V και αντίθετα να τον αφήσουμε αποσυνδεδεμένο. Θα μπορούσαμε να τοποθετήσουμε έναν πυκνωτή αποσύνδεσης 0,1 microfarad αν θέλαμε. Πρόκειται για έναν κεραμικό πυκνωτή με έναν 104 γραμμένο πάνω του. Τα δύο πρώτα ψηφία είναι ο αριθμός και το τελευταίο ψηφίο είναι η δύναμη του 10, τον πολλαπλασιάζουμε για να πάρουμε μια απάντηση στα picofarads (pico σημαίνει 10^-12), άρα 104 σημαίνει 10 x 10^4 picofarads, που είναι το ίδιο με 100 nanofarads (nano σημαίνει 10^-9), που είναι το ίδιο με 0,1 microfarads (micro σημαίνει 10^-6). Τέλος πάντων, το μόνο που κάνει είναι να σταθεροποιήσει τον πείρο AREF όταν μπορούμε να τον χρησιμοποιήσουμε ως τον πείρο αναφοράς.

Θέλουμε επίσης μια αντίσταση 1 Mohm μεταξύ PD2 και γείωσης. Θα ορίσουμε το PD2 ως ακίδα εξόδου στα 0V και θα ενεργοποιήσουμε σε ένα θετικό άκρο σε αυτόν τον πείρο. Θέλουμε η άκρη να εξαφανιστεί αμέσως όταν αφήσουμε το κουμπί, οπότε θα εισάγουμε αυτήν την αντίσταση "έλξης προς τα κάτω".

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

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

Ας γράψουμε λοιπόν έναν κώδικα που θα το πετύχει.

Βήμα 6: Ποιους διακόπτες εναλλαγής πρέπει να ορίσουμε;

Ποιους διακόπτες εναλλαγής πρέπει να ορίσουμε
Ποιους διακόπτες εναλλαγής πρέπει να ορίσουμε

Ας σκεφτούμε πρώτα πώς θα το κωδικοποιήσουμε έτσι ώστε ο ελεγκτής να μπορεί να διαβάσει την είσοδο από το πληκτρολόγιο και να την μετατρέψει σε μια αριθμητική τιμή που αντιστοιχεί στο κουμπί που πατήθηκε. Θα χρησιμοποιήσουμε τον μετατροπέα αναλογικού σε ψηφιακό (ADC) που είναι ενσωματωμένο στο Atmega328p. Θα χρησιμοποιήσουμε το AREF ως τάση αναφοράς και η έξοδος του πληκτρολογίου μας θα συνδεθεί στο PortC0 ή στο PC0. Σημειώστε ότι αυτός ο ακροδέκτης ονομάζεται επίσης ADC0 για τον Αναλογικό σε Digitalηφιακό Μετατροπέα 0. mightσως είναι καλή ιδέα να διαβάσετε την Ενότητα 12.4 σχετικά με τις διακοπές για το ATmega328P και επίσης το κεφάλαιο 24 για τον Μετατροπέα Αναλογικού σε Digitalηφιακό προτού λάβουμε ξεκίνησε ή τουλάχιστον να έχει αυτές τις ενότητες έτοιμες για αναφορά. Για να ρυθμίσετε τον μικροελεγκτή ώστε να γνωρίζει τι να κάνει με ένα αναλογικό σήμα εισόδου και πώς να αλληλεπιδρά με το πρόγραμμά μας, πρέπει πρώτα να ορίσουμε μερικές από τις διάφορες ADC σχετικά ψηφία καταχώρισης. Αυτά είναι ουσιαστικά ισοδύναμα με τους παλιούς διακόπτες εναλλαγής στους πρώτους υπολογιστές. Είτε γυρίζετε ένα διακόπτη ΕΝΕΡΓΟΠΟΙΗΜΕΝΟ είτε ΑΠΕΝΕΡΓΟΠΟΙΗΜΕΝΟ, ή ακόμα πιο πίσω θα συνδέσετε καλώδια μεταξύ μιας πρίζας και μιας άλλης, έτσι ώστε τα ηλεκτρόνια που φτάνουν σε αυτό το πιρούνι στο δρόμο να βρίσκουν μια πύλη κλειστή και μια άλλη ανοιχτή, αναγκάζοντάς την να ακολουθήσει μια διαφορετική πορεία στο λαβύρινθο κύκλωμα και έτσι εκτελεί μια διαφορετική λογική εργασία. Κατά την κωδικοποίηση στη γλώσσα συναρμολόγησης έχουμε στενή πρόσβαση σε αυτές τις λειτουργίες του μικροελεγκτή, κάτι που είναι ένα από τα ελκυστικά πράγματα για να το κάνουμε στην αρχή. Είναι περισσότερο "στα χέρια" και πολύ λιγότερο συμβαίνει "παρασκήνια" όπως ήταν. Μην σκέφτεστε λοιπόν να ορίσετε αυτούς τους καταχωρητές ως ένα κουραστικό έργο. Αυτό είναι που κάνει τη γλώσσα συναρμολόγησης ενδιαφέρουσα! Κερδίζουμε μια πολύ προσωπική σχέση με την εσωτερική λειτουργία και τη λογική του τσιπ και το κάνουμε να κάνει ακριβώς αυτό που θέλουμε - ούτε περισσότερο ούτε λιγότερο. Δεν υπάρχουν χαμένοι κύκλοι ρολογιού. Λοιπόν, εδώ είναι μια λίστα με τους διακόπτες που πρέπει να ορίσουμε:

  1. Απενεργοποιήστε το bit μειωμένης ισχύος ADC, PRADC, το οποίο είναι το bit 0 του καταχωρητή PRR, αφού εάν αυτό το bit είναι ενεργοποιημένο, θα κλείσει το ADC. Ο καταχωρητής μείωσης ισχύος είναι ουσιαστικά ένας τρόπος για να κλείσετε διάφορα πράγματα που χρησιμοποιούν ενέργεια όταν δεν τα χρειάζεστε. Δεδομένου ότι χρησιμοποιούμε το ADC, θέλουμε να βεβαιωθούμε ότι δεν είναι απενεργοποιημένο με αυτόν τον τρόπο. (Δείτε PRADC στη σελίδα 46)
  2. Επιλέξτε το αναλογικό κανάλι εισόδου που θα είναι ADC0 απενεργοποιώντας το MUX3… 0 στον καταχωρητή ADC Multiplexer Selection (ADMUX) (Δείτε πίνακα 24-4 σελίδα 249) αυτά είναι ήδη απενεργοποιημένα από προεπιλογή, οπότε δεν χρειάζεται να το κάνουμε πραγματικά. Ωστόσο, το συμπεριλαμβάνω, επειδή αν χρησιμοποιήσετε ποτέ μια θύρα διαφορετική από το ADC0, θα χρειαστεί να αλλάξετε ανάλογα τους διακόπτες. Διάφοροι συνδυασμοί MUX3, MUX2, MUX1, MUX0 σάς επιτρέπουν να χρησιμοποιείτε οποιαδήποτε από τις αναλογικές θύρες ως είσοδό σας και μπορείτε επίσης να τις αλλάξετε εν κινήσει εάν θέλετε να κοιτάξετε ταυτόχρονα μια δέσμη διαφορετικών αναλογικών σημάτων.
  3. Απενεργοποιήστε τα bit REFS0 και REFS1 στον καταχωρητή ADMUX έτσι ώστε να χρησιμοποιήσουμε το AREF ως τάση αναφοράς και όχι ως εσωτερική αναφορά (Βλέπε σελίδα 248).
  4. Ενεργοποιήστε το bit ADLAR στο ADMUX έτσι ώστε το αποτέλεσμα να "ρυθμιστεί αριστερά" θα συζητήσουμε αυτήν την επιλογή στο επόμενο βήμα.
  5. Ρυθμίστε το bit ADC0D στο Digital Input Disable Register (DIDR0) για να απενεργοποιήσετε την ψηφιακή είσοδο στο PC0. Χρησιμοποιούμε αυτήν τη θύρα για αναλογική είσοδο, οπότε θα μπορούσαμε επίσης να απενεργοποιήσουμε την ψηφιακή είσοδο για αυτήν.
  6. Ορίστε ISC0 και ISC1 στον εξωτερικό καταχωρητή ελέγχου διακοπών A (EICRA) για να υποδείξετε ότι θέλουμε να ενεργοποιήσουμε την άνοδο του σήματος τάσης στον ακροδέκτη INT0 (PD2), δείτε σελίδα 71.
  7. Διαγράψτε τα δυαδικά ψηφία INT0 και INT1 στον εξωτερικό καταχωρητή μάσκας διακοπών (EIMSK) για να υποδείξετε ότι δεν χρησιμοποιούμε διακοπές σε αυτόν τον πείρο. Εάν θέλαμε να ενεργοποιήσουμε τις διακοπές σε αυτόν τον πείρο, θα χρειαζόμασταν έναν χειριστή διακοπών στη διεύθυνση 0x0002, αλλά αντίθετα το ρυθμίζουμε έτσι ώστε ένα σήμα σε αυτόν τον ακροδέκτη να ενεργοποιεί τη μετατροπή ADC, η ολοκλήρωση του οποίου αντιμετωπίζεται από την πλήρη διακοπή μετατροπής ADC στις διεύθυνση 0x002A. Δείτε σελίδα 72.
  8. Ρυθμίστε το bit ADC Enable (ADEN) (bit 7) στο στοιχείο ελέγχου ADC και τον καταχωρητή κατάστασης A (ADCSRA) για να ενεργοποιήσετε το ADC. Δείτε σελίδα 249.
  9. Θα μπορούσαμε να ξεκινήσουμε μια μεμονωμένη μετατροπή ρυθμίζοντας το bit μετατροπής έναρξης ADC (ADSC) κάθε φορά που θέλαμε να διαβάσουμε το αναλογικό σήμα, ωστόσο, προς το παρόν θα προτιμούσαμε να διαβάζεται αυτόματα κάθε φορά που κάποιος πατάει το κουμπί, οπότε αντίθετα θα ενεργοποιήσουμε το ADC Bit ενεργοποίησης Autotrigger (ADATE) στο μητρώο ADCSRA, έτσι ώστε η ενεργοποίηση να γίνεται αυτόματα.
  10. Ορίσαμε επίσης τα μπιτ ADPS2..0 (τα μπιτ AD Prescalar) σε 111 έτσι ώστε το ρολόι ADC να είναι το ρολόι της CPU διαιρούμενο με συντελεστή 128.
  11. Θα επιλέξουμε την πηγή του ADC που ενεργοποιεί το PD2 που ονομάζεται επίσης INT0 (External Interrupt Request 0). Το κάνουμε αυτό εναλλάσσοντας τα διάφορα bits στο μητρώο ADCSRB (Δείτε τον Πίνακα 24-6 στη σελίδα 251). Βλέπουμε από τον πίνακα ότι θέλουμε το ADTS0 απενεργοποιημένο, το ADTS1 ενεργοποιημένο και το ADTS2 απενεργοποιημένο έτσι ώστε το ADC να ενεργοποιήσει αυτόν τον πείρο. Σημειώστε ότι αν θέλαμε να δοκιμάζουμε συνεχώς την αναλογική θύρα, όπως αν διαβάζαμε κάποιο συνεχές αναλογικό σήμα (όπως δειγματοληψία ήχου ή κάτι τέτοιο) θα το θέσαμε σε Λειτουργία ελεύθερης λειτουργίας. Η μέθοδος που χρησιμοποιούμε για τη ρύθμιση της ενεργοποίησης στο PD2 ενεργοποιεί μια ανάγνωση ADC της αναλογικής θύρας PC0 χωρίς να προκαλεί διακοπή. Η διακοπή θα έρθει όταν ολοκληρωθεί η μετατροπή.
  12. Ενεργοποιήστε το bit ADC Interrupt Enable (ADIE) στον καταχωρητή ADCSRA, έτσι ώστε όταν ολοκληρωθεί η μετατροπή του αναλογικού σε ψηφιακό να δημιουργήσει μια διακοπή για την οποία μπορούμε να γράψουμε έναν χειριστή διακοπών και να τον θέσουμε στο.org 0x002A.
  13. Ορίστε το bit I στο SREG για να ενεργοποιήσετε τις διακοπές.

Άσκηση 1: Βεβαιωθείτε ότι έχετε διαβάσει τις σχετικές ενότητες στο φύλλο δεδομένων για καθεμία από τις παραπάνω ρυθμίσεις, ώστε να καταλάβετε τι συμβαίνει και τι θα συμβεί εάν τις αλλάξουμε σε εναλλακτικές ρυθμίσεις.

Βήμα 7: Γράψτε τον Διαχειριστή διακοπών

Στο τελευταίο βήμα είδαμε ότι το έχουμε ρυθμίσει έτσι ώστε μια ανερχόμενη άκρη που ανιχνεύεται στο PD2 θα ενεργοποιήσει μια αναλογική σε ψηφιακή μετατροπή στο PC0 και όταν ολοκληρωθεί αυτή η μετατροπή θα ρίξει μια διακοπή ADC Conversion Complete. Τώρα θέλουμε να κάνουμε κάτι με αυτήν τη διακοπή. Εάν εξετάσετε τον Πίνακα 12-6 στη σελίδα 65, θα δείτε μια λίστα με τις πιθανές διακοπές. Έχουμε ήδη δει τη διακοπή RESET στη διεύθυνση 0x0000 και τη διακοπή Timer/Counter0 Overflow στη διεύθυνση 0x0020 σε προηγούμενα μαθήματα. Τώρα θέλουμε να δούμε τη διακοπή ADC την οποία βλέπουμε από τον πίνακα να είναι στη διεύθυνση 0x002A. Έτσι, στην αρχή του κώδικα της γλώσσας συναρμολόγησης θα χρειαστούμε μια γραμμή που να γράφει:

.org 0x002Arjmp ADC_int

το οποίο θα μεταβεί στον χειριστή διακοπών με την ένδειξη ADC_int κάθε φορά που το ADC ολοκληρώνει μια μετατροπή. Λοιπόν, πώς πρέπει να γράψουμε τον χειριστή διακοπών; Ο τρόπος με τον οποίο λειτουργεί το ADC εκτελεί τον ακόλουθο υπολογισμό:

ADC = Vin x 1024 / Vref

Ας δούμε λοιπόν τι θα συμβεί αν πατήσω το κουμπί "επανάκλησης" στο πληκτρολόγιο. Σε αυτή την περίπτωση η τάση στο PC0 θα αλλάξει σε κάποια τιμή, ας πούμε 1.52V, και δεδομένου ότι το Vref είναι στα 5V θα έχουμε:

ADC = (1,52V) x 1024 / 5V = 311,296

και έτσι θα εμφανιζόταν ως 311. Αν θέλαμε να το μετατρέψουμε πίσω σε τάση, απλώς θα αντιστρέψαμε τον υπολογισμό. Δεν θα χρειαστεί να το κάνουμε αυτό, δεδομένου ότι δεν μας ενδιαφέρουν οι πραγματικές τάσεις, απλώς η διάκριση μεταξύ τους. Όταν ολοκληρωθεί η μετατροπή, το αποτέλεσμα αποθηκεύεται σε έναν αριθμό 10-bit που τοποθετείται σε καταχωρητές ADCH και ADCL και έχουμε προκαλέσει την "αριστερή προσαρμογή", πράγμα που σημαίνει ότι τα 10-bit ξεκινούν από το bit 7 του ADCH και κατεβαίνουν στο bit 6 του ADCL (υπάρχουν 16 bit συνολικά σε αυτούς τους δύο καταχωρητές και χρησιμοποιούμε μόνο 10 από αυτά, δηλαδή 1024 κανάλια). Θα μπορούσαμε να έχουμε το αποτέλεσμα "σωστά προσαρμοσμένο" εάν θέλουμε καθαρίζοντας το bit ADLAR στο μητρώο ADMUX. Ο λόγος που επιλέγουμε αριστερά προσαρμοσμένο είναι επειδή τα σήματά μας απέχουν αρκετά μεταξύ τους και τα δύο τελευταία ψηφία του αριθμού του καναλιού δεν είναι σχετικά και είναι μάλλον μόνο θόρυβος, οπότε θα διακρίνουμε τα πλήκτρα χρησιμοποιώντας μόνο τα επάνω 8 ψηφία, με άλλα λόγια, θα χρειαστεί μόνο να κοιτάξουμε το ADCH για να καταλάβουμε ποιο κουμπί πατήθηκε. Έτσι, ο χειριστής διακοπών μας θα πρέπει απλώς να διαβάσει τον αριθμό εκτός του ADCH εγγραφείτε, μετατρέψτε αυτόν τον αριθμό σε τιμή πληκτρολογίου και, στη συνέχεια, στείλτε την τιμή στα LED του αναλυτή καταχωρητή μας, ώστε να μπορούμε να επαληθεύσουμε ότι πιέζοντας ένα "9" ας πούμε, θα ανάψει το LED που αντιστοιχεί στο "00001001". Πριν το πάμε αυτό αν και πρέπει πρώτα να δούμε τι εμφανίζεται στο ADCH όταν πατάμε τα διάφορα κουμπιά. Ας γράψουμε λοιπόν έναν απλό χειριστή διακοπών που απλώς στέλνει τα περιεχόμενα του ADCH στην οθόνη του αναλυτή. Λοιπόν, εδώ είναι αυτό που χρειαζόμαστε:

ADC_int: αναλυτής lds, ADCH. Φορτώστε την τιμή του ADCH στον αναλυτή μαςbi EIFR, 0; διαγράψτε την εξωτερική σημαία διακοπής έτσι ώστε να είναι έτοιμη να ξαναπάει

Μέχρι τώρα, θα πρέπει να μπορείτε να αντιγράψετε τον κώδικα από τον αναλυτή μας στο σεμινάριο 5 και να προσθέσετε αυτήν τη διακοπή και τις ρυθμίσεις εναλλαγής και να τον εκτελέσετε. Άσκηση 2: Γράψτε τον κώδικα και εκτελέστε τον. Βεβαιωθείτε ότι εμφανίζεται το ADCH στην οθόνη του αναλυτή σας. Δοκιμάστε να πιέσετε το ίδιο πάτημα πλήκτρων πολλές φορές. Λαμβάνετε πάντα την ίδια τιμή στο ADCH;

Βήμα 8: Χαρτογραφήστε τις τιμές πατήματος πληκτρολογίου

Αντιστοιχίστε τις τιμές Πατήστε το πληκτρολόγιο
Αντιστοιχίστε τις τιμές Πατήστε το πληκτρολόγιο

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

Άσκηση 3: Κάντε αυτήν την αντιστοίχιση και, στη συνέχεια, γράψτε ξανά τη ρουτίνα διακοπής ADC.

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

ADC_int:; Εξωτερικός αναλυτής χειριστή διακοπής διακοπής. προετοιμασία για νέο κουμπί αριθμώνΗ, ADCH. Το ADC ενημερώνεται όταν διαβάζεται το ADCH κουμπί clccpiH, 240brlo PC+3. αν το ADCH είναι μεγαλύτερο τότε είναι αναλυτής 1ldi, 1? έτσι αναλυτής φόρτωσης με επιστροφή 1rjmp. και κουμπί επιστροφής clccpiH, 230; αν το ADCH είναι μεγαλύτερο τότε ένας αναλυτής 2brlo PC+3ldi, 2rjmp κουμπί επιστροφής clccpiH, 217brlo PC+3ldi αναλυτής, 3rjmp πλήκτρο επιστροφής clccpiH, αναλυτής 203brlo PC+3ldi, 4rjmp κουμπί επιστροφής clccpiH, 187brlo PC+3ldi αναλυτής, 5rjmp επιστροφή clccpi κουμπί, 155brlo PC+3ldi αναλυτής, 6rjmp κουμπί επιστροφής clccpiH, 127brlo PC+3ldi αναλυτής, 255; θα ορίσουμε το φλας ως όλα τα κουμπιά επιστροφής onrjmp clccpiH, 115brlo PC+3ldi analyzer, 7rjmp return clccpi buttonH, 94brlo PC+3ldi analyzer, 8rjmp return clccpi buttonH, 62brlo PC+3ldi analyzer, 9rjmp return clccpi buttonH, 37brlo PC+3ldi analyzer, 0b11110000; αστερίσκος είναι το πάνω μισό onrjmp κουμπί επιστροφής clccpiH, 28brlo PC+3ldi αναλυτής, 0rjmp κουμπί επιστροφής clccpiH, 17brlo PC+3ldi αναλυτής, 0b00001111; hash sign is bottom half onrjmp return clccpi buttonH, 5brlo PC+3ldi analyzer, 0b11000011? η επανάκληση είναι επάνω 2 κάτω 2rjmp επιστροφή αναλυτή ldi, 0b11011011; αλλιώς προέκυψε σφάλμα επιστροφή: reti

Βήμα 9: Κωδικός και βίντεο για την έκδοση 1

Έχω επισυνάψει τον κωδικό μου για αυτήν την πρώτη έκδοση του προγράμματος οδήγησης πληκτρολογίου. Σε αυτό πρέπει να πατήσετε το πλήκτρο και στη συνέχεια να πατήσετε το κουμπί για να κάνετε το ADC να διαβάσει την είσοδο από το πληκτρολόγιο. Αυτό που θα προτιμούσαμε είναι να μην υπάρχει κουμπί, αλλά το σήμα για να γίνει η μετατροπή προέρχεται από το ίδιο το πάτημα του πλήκτρου. Άσκηση 3: Συναρμολογήστε και ανεβάστε αυτόν τον κώδικα και δοκιμάστε τον. Mayσως χρειαστεί να αλλάξετε τα διάφορα όρια μετατροπής για να αντιστοιχούν στις τάσεις πίεσης του πληκτρολογίου σας, καθώς πιθανότατα διαφέρουν από τα δικά μου. Τι συμβαίνει εάν προσπαθήσετε να χρησιμοποιήσετε μια είσοδο από το πληκτρολόγιο τόσο για το ADC0 όσο και για τον εξωτερικό ακροδέκτη διακοπής αντί μέσω ενός κουμπιού; Θα επισυνάψω επίσης ένα βίντεο με τη λειτουργία αυτής της πρώτης έκδοσης του προγράμματος οδήγησης του πληκτρολογίου μας. Θα παρατηρήσετε ότι στον κωδικό μου υπάρχει μια ενότητα που προετοιμάζει τον δείκτη στοίβας. Υπάρχουν διάφοροι καταχωρητές που μπορεί να θέλουμε να σπρώξουμε και να εμφανιστούν από τη στοίβα όταν χειριζόμαστε μεταβλητές και τι όχι και υπάρχουν επίσης καταχωρητές που ίσως θέλουμε να αποθηκεύσουμε και να επαναφέρουμε αργότερα. Για παράδειγμα, το SREG είναι ένας καταχωρητής που δεν διατηρείται σε όλες τις διακοπές, επομένως οι διάφορες σημαίες που έχουν οριστεί και διαγραφεί ως αποτέλεσμα των λειτουργιών μπορεί να αλλάξουν εάν μια διακοπή συμβεί στη μέση κάποιου. Επομένως, είναι καλύτερο αν σπρώξετε το SREG στη στοίβα στην αρχή ενός χειριστή διακοπών και, στη συνέχεια, το σβήσετε ξανά στο τέλος του χειριστή διακοπών. Το έχω τοποθετήσει στον κώδικα για να δείξω πώς αρχικοποιείται και για να προβλέψουμε πώς θα το χρειαστούμε αργότερα, αλλά επειδή δεν μας ενδιαφέρει τι συμβαίνει με το SREG κατά τη διάρκεια διακοπών στον κώδικά μας, δεν χρησιμοποίησα τη στοίβα για αυτό. ότι έχω χρησιμοποιήσει τη λειτουργία shift για να ορίσω διάφορα bits σε καταχωρητές κατά την προετοιμασία. Για παράδειγμα στη γραμμή:

ldi temp, (1 <> sts EICRA, θερμ

Η εντολή "<<" στην πρώτη γραμμή του παραπάνω κώδικα είναι μια λειτουργία αλλαγής. Ουσιαστικά παίρνει τον δυαδικό αριθμό 1, ο οποίος είναι 0b00000001 και τον μετατοπίζει αριστερά με το ποσό του αριθμού ISC01. Αυτή είναι η θέση του bit που ονομάζεται ISC01 στον καταχωρητή EICRA. Δεδομένου ότι το ISC01 είναι bit 1, ο αριθμός 1 μετατοπίζεται στην αριστερή θέση 1 για να γίνει 0b00000010. Ομοίως, το δεύτερο, ISC00, είναι το bit 0 του EICRA και έτσι η μετατόπιση του αριθμού 1 είναι μηδενικές θέσεις προς τα αριστερά. Αν κοιτάξετε, ρίξτε μια άλλη ματιά στο αρχείο m328Pdef.inc που κατεβάσατε στο πρώτο σεμινάριο και χρησιμοποιείτε το evrr έκτοτε, θα δείτε ότι είναι απλώς μια μεγάλη λίστα δηλώσεων ".equ". Θα διαπιστώσετε ότι το ISC01 είναι ίσο με 1. Ο συναρμολογητής αντικαθιστά κάθε παρουσία του με 1 πριν καν αρχίσει να συναρμολογεί οτιδήποτε. Είναι απλώς ονόματα για bit καταχώρησης για να μας βοηθήσουν τους ανθρώπους να διαβάσουμε και να γράψουμε κώδικα. Τώρα, η κάθετη γραμμή μεταξύ των δύο παραπάνω λειτουργιών μετατόπισης είναι μια λογική λειτουργία "ή". Εδώ είναι η εξίσωση:

0b00000010 | 0b00000001 = 0b00000011

και αυτό είναι που φορτώνουμε (χρησιμοποιώντας "ldi") στο temp. Ο λόγος που οι άνθρωποι χρησιμοποιούν αυτήν τη μέθοδο για να φορτώσουν τιμές σε έναν καταχωρητή είναι ότι επιτρέπει σε κάποιον να χρησιμοποιήσει το όνομα του bit αντί για έναν αριθμό και αυτό καθιστά τον κώδικα πολύ πιο εύκολο να διαβαστεί. Υπάρχουν επίσης δύο άλλες τεχνικές που έχουμε χρησιμοποιήσει. Χρησιμοποιούμε τις οδηγίες "ori" και "andi". Αυτά μας επιτρέπουν να SET και CLEAR bits αντίστοιχα χωρίς να αλλάξουμε κανένα από τα άλλα bits σε έναν καταχωρητή. Για παράδειγμα, όταν χρησιμοποιούσα

ori temp, (1

αυτή η θερμοκρασία "ή" με 0b00000001 που βάζει ένα 1 στο μηδενικό bit και αφήνει όλα τα υπόλοιπα αμετάβλητα. Επίσης όταν γράφαμε

andi temp, 0b11111110

αυτό αλλάζει το μηδενικό bit της θερμοκρασίας σε 0 και αφήνει όλα τα υπόλοιπα αμετάβλητα.

Άσκηση 4: Θα πρέπει να περάσετε από τον κώδικα και να βεβαιωθείτε ότι καταλαβαίνετε κάθε γραμμή. Μπορεί να σας φανεί ενδιαφέρον να βρείτε καλύτερες μεθόδους για να κάνετε πράγματα και να γράψετε ένα καλύτερο πρόγραμμα. Υπάρχουν εκατό τρόποι κωδικοποίησης πραγμάτων και είμαι αρκετά σίγουρος ότι μπορείτε να βρείτε έναν πολύ καλύτερο τρόπο από τον δικό μου. Μπορεί επίσης να βρείτε (παραδείσου!) Λάθη και παραλείψεις. Σε αυτή την περίπτωση θα ήθελα σίγουρα να ακούσω γι 'αυτά, ώστε να διορθωθούν.

Εντάξει, τώρα ας δούμε αν μπορούμε να απαλλαγούμε από αυτό το περιττό κουμπί…

Βήμα 10: Κωδικός για την έκδοση 2

Ο απλούστερος τρόπος για να απαλλαγείτε από το κουμπί είναι απλώς να το αφαιρέσετε εντελώς, να ξεχάσετε την είσοδο στο PB2 και απλώς να αλλάξετε το ADC σε "Free Running Mode".

Με άλλα λόγια, απλώς αλλάξτε τον καταχωρητή ADCSRB έτσι ώστε τα ADTS2, ADTS1 και ADTS0 να είναι όλα μηδενικά.

Στη συνέχεια, ορίστε το bit ADSC στο ADCSRA σε 1, το οποίο θα ξεκινήσει την πρώτη μετατροπή.

Τώρα ανεβάστε το στον μικροελεγκτή σας και θα διαπιστώσετε ότι ο σωστός αριθμός εμφανίζεται στην οθόνη ενώ πατάτε το κουμπί και μόνο ενώ πατάτε το κουμπί. Αυτό συμβαίνει επειδή το ADC λαμβάνει συνεχώς δείγματα από τη θύρα ADC0 και εμφανίζει την τιμή. Όταν αφαιρέσετε το δάχτυλό σας από το κουμπί, η "αναπήδηση κουμπιού" θα προκαλέσει μερικές τυχαίες τιμές να εμφανιστούν πολύ γρήγορα και στη συνέχεια θα επανέλθει στην είσοδο 0V. Στον κωδικό μας έχουμε αυτό το 0V να εμφανίζεται ως 0b11011011 (επειδή το πάτημα του πλήκτρου "0" χρησιμοποιεί ήδη την τιμή εμφάνισης 0b00000000)

Αυτή δεν είναι η λύση που θέλουμε αν και για δύο λόγους. Πρώτα δεν θέλουμε να κρατάμε πατημένο το κουμπί. Θέλουμε να το πατήσουμε μία φορά και να εμφανιστεί ο αριθμός (ή να χρησιμοποιηθεί σε κάποιο νέο κώδικα σε μεταγενέστερο σεμινάριο). Δεύτερον, δεν θέλουμε να δοκιμάζουμε συνεχώς το ADC0. Θέλουμε να λάβει μία μόνο ανάγνωση, να το μετατρέψει και μετά να κοιμηθεί έως ότου ένα νέο πάτημα πληκτρολογίου ενεργοποιήσει μια νέα μετατροπή. Η δωρεάν λειτουργία είναι η καλύτερη αν το μόνο που θέλετε να κάνει ο μικροελεγκτής είναι να διαβάζετε συνεχώς κάποια αναλογική είσοδο - όπως εάν θέλετε να εμφανίσετε θερμοκρασίες σε πραγματικό χρόνο ή κάτι τέτοιο.

Ας βρούμε λοιπόν άλλη λύση…

Βήμα 11: Πώς απαλλαγούμε από το κουμπί; Έκδοση 3

Πώς απαλλαγούμε από το κουμπί; Έκδοση 3
Πώς απαλλαγούμε από το κουμπί; Έκδοση 3

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

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

Θα προτιμούσαμε λοιπόν να βρούμε μια λύση λογισμικού. Αυτό που θα θέλαμε να κάνουμε είναι να προσθέσουμε μια διακοπή στον ακροδέκτη PD2 και να γράψουμε έναν χειριστή διακοπών για αυτόν που καλεί μία μόνο ανάγνωση του ακροδέκτη του πληκτρολογίου. Με άλλα λόγια, απαλλαγούμε από τη διακοπή autotrigger από το ADC και προσθέτουμε μια εξωτερική διακοπή που καλεί το ADC μέσα σε αυτό. Με αυτόν τον τρόπο το σήμα για την ανάγνωση του ADC έρχεται αφού έχει ήδη εμφανιστεί το σήμα PD2 και αυτό μπορεί να δώσει στα πράγματα αρκετό χρόνο για να σταθεροποιηθεί σε ακριβή τάση πριν από την ανάγνωση και τη μετατροπή του ακροδέκτη PC0. Θα είχαμε ακόμα μια διακοπή ολοκλήρωσης ADC η οποία εξάγει το αποτέλεσμα στην οθόνη του αναλυτή στο τέλος.

Βγάζει νόημα? Λοιπόν ας το κάνουμε…

Ρίξτε μια ματιά στο νέο συνημμένο κώδικα.

Βλέπετε τις ακόλουθες αλλαγές:

  1. Προσθέσαμε ένα rjmp στη διεύθυνση.org 0x0002 για να χειριστούμε την εξωτερική διακοπή INT0
  2. Αλλάξαμε τον καταχωρητή EIMSK για να υποδείξουμε ότι θέλουμε να διακόψουμε τον ακροδέκτη INT0
  3. Αλλάξαμε τον πείρο ADATE στο μητρώο ADCSRA για να απενεργοποιήσουμε την αυτόματη ενεργοποίηση
  4. Απαλλαχτήκαμε από τις ρυθμίσεις του ADCSRB, επειδή δεν έχουν σημασία όταν το ADATE είναι απενεργοποιημένο
  5. Δεν χρειάζεται πλέον να επαναφέρουμε την εξωτερική σημαία σκανδάλης, καθώς η ρουτίνα διακοπής INT0 το κάνει αυτόματα όταν ολοκληρωθεί - προηγουμένως δεν είχαμε ρουτίνα διακοπής, απλώς ενεργοποιήσαμε το ADC εκτός σήματος σε αυτήν την ακίδα, οπότε έπρεπε να καθαρίστε τη σημαία με το χέρι.

Τώρα στο χειριστή διακοπών ονομάζουμε απλώς μια μετατροπή από το ADC.

Άσκηση 5: Εκτελέστε αυτήν την έκδοση και δείτε τι συμβαίνει.

Βήμα 12: Κωδικός και βίντεο για την έκδοση εργασίας

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

Αυτό που χρειαζόμαστε είναι να καθιερώσουμε μια καθυστέρηση μεταξύ της διακοπής στο PD2 και της ανάγνωσης ADC στο PC0. Αυτό θα το κάνουμε προσθέτοντας ένα χρονόμετρο/μετρητή, μια διακοπή υπερχείλισης μετρητή και μια ρουτίνα καθυστέρησης. Ευτυχώς γνωρίζουμε ήδη πώς να το κάνουμε αυτό από το Tutorial 3! Έτσι, απλώς θα αντιγράψουμε και θα επικολλήσουμε τον σχετικό κώδικα από εκεί.

Έδωσα τον κωδικό που προέκυψε και ένα βίντεο που τον δείχνει σε λειτουργία.

Θα παρατηρήσετε ότι οι ενδείξεις δεν είναι τόσο ακριβείς όσο θα περίμενε κανείς. Αυτό είναι πιθανό λόγω πολλών πηγών:

  1. χτυπάμε από την έξοδο τάσης του πληκτρολογίου για να ενεργοποιηθεί στο PD2 που επηρεάζει την ανάγνωση στο PC0.
  2. δεν ξέρουμε πραγματικά πόσο να καθυστερήσουμε μετά τη σκανδάλη για να έχουμε την καλύτερη ανάγνωση.
  3. χρειάζονται μερικοί κύκλοι για να ολοκληρωθεί η μετατροπή ADC, πράγμα που σημαίνει ότι δεν μπορούμε να ενεργοποιήσουμε γρήγορα το πληκτρολόγιο.
  4. μάλλον υπάρχει θόρυβος στο ίδιο το πληκτρολόγιο.
  5. και τα λοιπά…

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

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

  1. Χρησιμοποιεί μόνο 2 από τις ακίδες στον μικροελεγκτή μας αντί για 8.
  2. Είναι ένα εξαιρετικό έργο για να δείξετε διαφορετικές πτυχές του ADC στον μικροελεγκτή που είναι διαφορετικό από τα τυπικά πράγματα που μπορείτε να βρείτε εκεί όπως οι ενδείξεις θερμοκρασίας, τα περιστροφικά ποτενσιόμετρα κ.λπ. αντί απλώς για ελεύθερη λειτουργία CPU-gobbling mode.

Τέλος πάντων, εδώ είναι μια τελευταία ασκήσεις για εσάς:

Άσκηση 6: Ξαναγράψτε το πρόγραμμα διαχείρισης πλήρους διακοπής μετατροπής ADC για να χρησιμοποιήσετε έναν πίνακα αναζήτησης. Δηλ. Για να ελέγξει την αναλογική τιμή με το πρώτο στοιχείο στον πίνακα και αν είναι μεγαλύτερη επιστρέφει από τη διακοπή, αν δεν είναι τότε αυξάνει το Ζ στο επόμενο στοιχείο του πίνακα και διακλαδίζεται ξανά στη δοκιμή. Αυτό θα συντομεύσει τον κώδικα και θα καθαρίσει τη ρουτίνα διακοπής και θα το κάνει να φαίνεται πιο ωραίο. (Θα δώσω μια πιθανή λύση στο επόμενο βήμα) Άσκηση 7: Συνδέστε το πληκτρολόγιό σας σε 8 ακίδες στον μικροελεγκτή και γράψτε το απλό πρόγραμμα οδήγησης για αυτό και δοκιμάστε πόσο πιο ωραίο είναι. Μπορείτε να σκεφτείτε μερικούς τρόπους για να λειτουργήσει καλύτερα η μέθοδος μας;

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

Θα σε δω την επόμενη φορά!

Συνιστάται: