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

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

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

Βίντεο: Φροντιστήριο AVR Assembler 9: 7 Βήματα
Βίντεο: LDmicro 22: Πίνακες Arduino με AVRDUDESS (Προγραμματισμός μικροελεγκτών με LDmicro) 2024, Νοέμβριος
Anonim
Φροντιστήριο AVR Assembler 9
Φροντιστήριο AVR Assembler 9

Καλώς ορίσατε στο Tutorial 9.

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

Θα χρησιμοποιήσουμε το πληκτρολόγιό μας από το Tutorial 7

Για να κάνετε αυτό το σεμινάριο, εκτός από τα τυπικά πράγματα, θα χρειαστείτε:

  1. Οθόνη 7 τμημάτων

    www.sparkfun.com/products/8546

  2. Τετραψήφια οθόνη

    www.sparkfun.com/products/11407

  3. Ένα κουμπί

    www.sparkfun.com/products/97

  4. Τα φύλλα δεδομένων για την οθόνη τα οποία μπορείτε να κατεβάσετε από τις αντίστοιχες σελίδες που συνδέονται με το παραπάνω.
  5. Ένας κεραμικός πυκνωτής 68 pf, δύο πυκνωτές 104, μια δέσμη αντιστάσεων, δύο τρανζίστορ 2N3904 NPN.

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

Βήμα 1: Καλωδίωση της οθόνης 7 seg

Καλωδίωση της οθόνης 7 seg
Καλωδίωση της οθόνης 7 seg
Καλωδίωση της οθόνης 7 seg
Καλωδίωση της οθόνης 7 seg
Καλωδίωση της οθόνης 7 seg
Καλωδίωση της οθόνης 7 seg

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

Θα χαρτογραφήσουμε τα τμήματα στις ακίδες του μικροελεγκτή μας ως εξής:

(dp, g, f, e, d, c, b, a) = (PD7, PD6, PB5, PB4, PB3, PB2, PB1, PB0)

όπου τα γράμματα των τμημάτων εμφανίζονται στην εικόνα μαζί με το pinout που αντιστοιχεί στα κοινά 5V και καθένα από τα τμήματα LED συμπεριλαμβανομένου του δεκαδικού (dp) στην κάτω δεξιά γωνία της οθόνης. Ο λόγος για αυτό είναι ότι μπορούμε να εισάγουμε ολόκληρο τον αριθμό σε έναν μόνο καταχωρητή και έξοδο που καταχωρείται στις θύρες B και D για να φωτίσουν τα τμήματα. Όπως μπορείτε να δείτε, τα δυαδικά ψηφία αριθμούνται διαδοχικά από 0 έως 7 και έτσι θα χαρτογραφηθούν στις σωστές ακίδες χωρίς να χρειάζεται να ορίσετε και να καθαρίσετε μεμονωμένα bit.

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

Πρέπει να προσθέσω ότι πρέπει να τοποθετήσετε μια αντίσταση μεταξύ της κοινής ανόδου της οθόνης και της ράγας 5V. Επέλεξα μια αντίσταση 330 ohm ως συνήθως, αλλά αν σας αρέσει μπορείτε να υπολογίσετε την ελάχιστη αντίσταση που απαιτείται για να πάρετε τη μέγιστη φωτεινότητα από την οθόνη χωρίς να τη τηγανίζετε. Εδώ είναι πώς να το κάνετε αυτό:

Πρώτα κοιτάξτε το φύλλο δεδομένων και παρατηρήστε ότι στην πρώτη σελίδα δίνει διάφορες ιδιότητες της οθόνης. Οι σημαντικές ποσότητες είναι το "Forward Current" (I_f = 20mA) και το "Forward Voltage" (V_f = 2.2V). Αυτά λένε ότι θέλετε η πτώση τάσης στην οθόνη να είναι εάν το ρεύμα είναι ίσο με το ρεύμα προς τα εμπρός. Αυτό είναι το μέγιστο ρεύμα που θα πάρει η οθόνη χωρίς τηγάνισμα. Κατά συνέπεια, είναι και η μέγιστη φωτεινότητα που μπορείτε να βγάλετε από τα τμήματα.

Ας χρησιμοποιήσουμε λοιπόν τον νόμο του Ohm και τον κανόνα του βρόχου του Kirchoff για να καταλάβουμε ποια ελάχιστη αντίσταση θα χρειαστούμε να βάλουμε σε σειρά με την οθόνη για να έχουμε τη μέγιστη φωτεινότητα. Ο κανόνας του Kirchoff λέει ότι το άθροισμα των μεταβολών της τάσης γύρω από έναν κλειστό βρόχο σε ένα κύκλωμα ισούται με μηδέν και ο νόμος του Ohm λέει ότι η πτώση τάσης σε μια αντίσταση αντίστασης R είναι: V = I R όπου I είναι το ρεύμα που ρέει μέσω της αντίστασης.

Έτσι, δεδομένης της τάσης πηγής του V και περιστρέφοντας το κύκλωμά μας έχουμε:

V - V_f - I R = 0

που σημαίνει (V - V_f)/I = R. Έτσι, η αντίσταση που απαιτείται για να επιτευχθεί η μέγιστη φωτεινότητα (και πιθανώς το τηγάνισμα των τμημάτων) θα είναι:

R = (V - V_f)/I_f = (5.0V - 2.2V) /0.02A = 140 ohms

Έτσι, αν το θέλατε, θα μπορούσατε ευτυχώς να χρησιμοποιήσετε 150 ohms χωρίς ανησυχίες. Ωστόσο, νομίζω ότι τα 140 ohms το καθιστούν πολύ φωτεινό για την προτίμησή μου και έτσι χρησιμοποιώ 330 ohms (που είναι η προσωπική μου αντίσταση Goldilocks για LED)

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

Έχω επισυνάψει τον κωδικό συναρμολόγησης και ένα βίντεο που δείχνει τη λειτουργία του πληκτρολογίου με την οθόνη. Όπως μπορείτε να δείτε, έχουμε απλώς αντιστοιχίσει το πλήκτρο επανάκλησης στο "r", το πλήκτρο flash στο "F", τον αστερίσκο στο "A" και το σύμβολο κατακερματισμού στο "H". Αυτές θα μπορούσαν να αντιστοιχιστούν σε διάφορες λειτουργίες, όπως το backspace, το enter και τι άλλο, αν θέλετε να συνεχίσετε να χρησιμοποιείτε το πληκτρολόγιο για πληκτρολόγηση αριθμών σε οθόνες LCD ή οθόνες 4 ψηφίων. Δεν θα περάσω τον κώδικα γραμμή-γραμμή αυτή τη φορά, επειδή είναι πολύ παρόμοιος με αυτό που έχουμε κάνει ήδη σε προηγούμενα μαθήματα. Οι διαφορές είναι κυρίως μόνο τα ίδια πράγματα που ήδη γνωρίζουμε να κάνουμε, όπως διακόπτες και πίνακες αναζήτησης. Απλώς πρέπει να περάσετε από τον κώδικα και να δείτε τα νέα πράγματα που έχουμε προσθέσει και αυτά που έχουμε αλλάξει και να το καταλάβετε από εκεί. Θα επιστρέψουμε στην ανάλυση γραμμής προς γραμμή στο επόμενο σεμινάριο όταν εισαγάγουμε νέες πτυχές της κωδικοποίησης της γλώσσας συναρμολόγησης σε μικροελεγκτές AVR.

Ας δούμε τώρα μια τετραψήφια οθόνη.

Βήμα 3: Καλωδίωση της τετραψήφιας οθόνης

Καλωδίωση της τετραψήφιας οθόνης
Καλωδίωση της τετραψήφιας οθόνης
Καλωδίωση της τετραψήφιας οθόνης
Καλωδίωση της τετραψήφιας οθόνης

Σύμφωνα με το φύλλο δεδομένων, η τετραψήφια οθόνη έχει ρεύμα προς τα εμπρός 60 mA και τάση προς τα εμπρός 2,2 βολτ. Έτσι, με τον ίδιο υπολογισμό όπως πριν, θα μπορούσα να χρησιμοποιήσω μια αντίσταση 47 ohm αν ήθελα. Αντ 'αυτού θα χρησιμοποιήσω ένα … hrm.. επιτρέψτε μου να δω … πόσο περίπου 330 ohms.

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

Προς το παρόν, ας ελέγξουμε ότι όλα τα τμήματα λειτουργούν.

Τοποθετήστε την αντίστασή σας 330 ohm ανάμεσα στη θετική ράγα της σανίδας σας και την πρώτη άνοδο στην οθόνη. Το φύλλο δεδομένων μας λέει ότι οι ακίδες αριθμούνται από 1 έως 16 αριστερόστροφα ξεκινώντας από κάτω αριστερά (όταν κοιτάτε την οθόνη κανονικά.. με τα δεκαδικά ψηφία στο κάτω μέρος) και δηλώνει ότι οι άνοδοι είναι αριθμοί ακίδων 6, 8, 9 και 12.

Συνδέουμε λοιπόν τον ακροδέκτη 6 με 5V και στη συνέχεια παίρνουμε ένα αρνητικό προβάδισμα από τη ράγα GND και το εισάγουμε σε όλες τις άλλες ακίδες και βλέπουμε ότι όλα τα τμήματα φωτίζονται στο ψηφίο στο οποίο αντιστοιχεί (που είναι στην πραγματικότητα το δεύτερο ψηφίο από το σωστό). Βεβαιωθείτε ότι έχετε πάρει και τα 7 τμήματα και ανάβουν τα δεκαδικά ψηφία.

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

Κάτι ασυνήθιστο;

Αποδεικνύεται ότι το pinout στο φύλλο δεδομένων είναι λάθος. Αυτό συμβαίνει επειδή είναι το φύλλο δεδομένων και το pinout για οθόνη 12 ακίδων, 4 ψηφίων. Δηλ. ένα χωρίς κόλον ή άνω δεκαδικό ψηφίο. Η οθόνη που πήρα όταν την παρήγγειλα είναι 16-pin, τετραψήφια οθόνη. Στην πραγματικότητα, στο δικό μου, οι ανόδους τμήματος βρίσκονται στις ακίδες 1, 2, 6 και 8. Η άνοδος του παχέος εντέρου είναι η ακίδα 4 (πείρος καθόδου 12) και η ανώτερη άνοδος dp είναι η ακίδα 10 (η κάθοδος είναι η ακίδα 9)

Άσκηση 1: Χρησιμοποιήστε την αντίσταση και το καλώδιο γείωσης για να χαρτογραφήσετε ποια καρφίτσα αντιστοιχεί σε ποιο τμήμα και δεκαδικό σημείο στην οθόνη, ώστε να φωτίζονται τα σωστά τμήματα όταν την κωδικοποιούμε.

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

Η μόνη διαφορά είναι ότι τώρα χρειαζόμαστε 4 επιπλέον καρφίτσες για τις ανόδους αφού δεν μπορούμε πλέον να πάμε πλέον στη ράγα 5V. Χρειαζόμαστε τον μικροελεγκτή για να αποφασίσει ποιο ψηφίο παίρνει το χυμό.

Έτσι θα χρησιμοποιήσουμε PC1, PC2, PC3 και PD4 για να ελέγξουμε τις άνοδος των 4 ψηφίων.

Μπορεί επίσης να προχωρήσετε και να συνδέσετε τα καλώδια. (μην ξεχνάτε τις αντιστάσεις 330 ohm στα καλώδια ανόδου!)

Βήμα 4: Κωδικοποίηση της τετραψήφιας οθόνης

Κωδικοποίηση της τετραψήφιας οθόνης
Κωδικοποίηση της τετραψήφιας οθόνης

Ας σκεφτούμε πώς θέλουμε να κωδικοποιήσουμε αυτήν την οθόνη.

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

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

Θέλουμε επίσης να μετακινήσει τον "δρομέα" προς τα δεξιά ένα κενό όταν πληκτρολογούμε το επόμενο ψηφίο. Έτσι, εάν θέλω να πληκτρολογήσω 1234 για παράδειγμα, αφού πληκτρολογήσω το 1, ο δρομέας θα μετακινηθεί προς τα επάνω έτσι ώστε το επόμενο ψηφίο που πληκτρολογώ να εμφανιστεί στην επόμενη οθόνη 7 τμημάτων κ.ο.κ. Όσο συμβαίνει αυτό, εξακολουθώ να θέλω να μπορώ να βλέπω αυτό που έχω πληκτρολογήσει, οπότε πρέπει να περπατήσω με τα ψηφία και να τα εμφανίσω.

Ακούγεται σαν μια ψηλή παραγγελία;

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

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

Βήμα 5: Push 'n Pop

Push 'n Pop
Push 'n Pop

Υπάρχουν μόνο μερικά "Μητρώα Γενικής Χρήσης" που έχουμε στη διάθεσή μας και μόλις χρησιμοποιηθούν δεν υπάρχουν πια. Επομένως, είναι καλή πρακτική προγραμματισμού να τα χρησιμοποιείτε μόνο για δύο μεταβλητές που χρησιμοποιούνται ως προσωρινή αποθήκευση που χρειάζεστε για ανάγνωση και εγγραφή σε θύρες και SRAM, ή αλλιώς αυτές που θα χρειαστείτε σε υπορουτίνες παντού και έτσι Ονόμασέ τους. Αυτό που έκανα, τώρα που έχουμε αρχικοποιήσει και μαθαίνουμε να χρησιμοποιούμε το Stack, είναι να περάσω από τον κώδικα και να βρω τους κατονομαζόμενους καταχωρητές γενικής χρήσης που χρησιμοποιούνται μόνο μέσα σε ένα μόνο υποπρόγραμμα ή διακοπή και πουθενά αλλού στον κώδικα και αντικατάσταση τους με έναν από τους καταχωρητές θερμοκρασίας μας και ένα σπρώξιμο και σκάσιμο στη στοίβα. Στην πραγματικότητα, αν κοιτάξετε τον κώδικα που γράφτηκε για μικρότερους μικροελεγκτές ή αν γυρίσετε πίσω στο χρόνο όταν όλα τα τσιπ ήταν μικρότερα, θα δείτε μόνο δύο μητρώους γενικής χρήσης που έπρεπε να χρησιμοποιηθούν για τα πάντα, οπότε δεν θα μπορούσατε απλώς αποθηκεύστε μια τιμή εκεί και αφήστε την ήσυχη αφού σίγουρα θα χρειαζόσασταν αυτό το μητρώο για άλλα πράγματα. Έτσι θα δείτε pushin 'και ένα poppin' παντού στον κώδικα. Maybeσως θα έπρεπε να είχα ονομάσει τα αρχεία καταγραφής γενικής χρήσης AX και BX ως σεβασμό για τα παλιά χρόνια.

Ένα παράδειγμα θα βοηθήσει να γίνει πιο σαφές.

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

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

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

Ακολουθεί η ρουτίνα διακοπής ADC_int μετά την πραγματοποίηση αυτής της αλλαγής:

ADC_int:

πίεση θερμοκρασίας? αποθηκεύστε τη θερμοκρασία αφού την τροποποιήσουμε εδώ πιέστε temp2. αποθήκευση temp2 lds temp2, ADCH; φόρτωση πλήκτρου ldi ZH, υψηλό (2*αριθμοί) ldi ZL, χαμηλό (αριθμοί 2*) cpi temp2, 0 breq επιστροφή? εάν οι ενεργοποιητές θορύβου δεν αλλάζουν 7 πλήκτρο εγγραφής φορτίο από τον πίνακα και την αύξηση προσθήκη clc cp temp2, temp? συγκρίνετε το πάτημα πλήκτρων με τον πίνακα brlo PC+4. αν το ADCH είναι χαμηλότερο, δοκιμάστε ξανά lpm 7segnumber, Z? αλλιώς φορτώστε το ψηφίο incval του πίνακα βασικών τιμών. αύξηση του ψηφιακού αριθμού επιστροφής rjmp. και επιστροφή adiw ZH: ZL, 1; αύξηση Z rjmp setkey; και επιστρέψτε στην αρχή επιστροφή: pop temp2; επαναφορά temp2 pop temp? επαναφορά θερμοκρασίας reti

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

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

Βήμα 6: Φίλτρα χαμηλής διέλευσης και ενισχυτής τάσης

Φίλτρα χαμηλής διέλευσης και ενισχυτής τάσης
Φίλτρα χαμηλής διέλευσης και ενισχυτής τάσης
Φίλτρα χαμηλής διέλευσης και ενισχυτής τάσης
Φίλτρα χαμηλής διέλευσης και ενισχυτής τάσης

Για να καθαρίσουμε λίγο τον θόρυβο και να κάνουμε το πληκτρολόγιο να λειτουργήσει καλύτερα, θέλουμε να προσθέσουμε μερικά φίλτρα χαμηλής διέλευσης. Αυτά φιλτράρουν τον θόρυβο υψηλής συχνότητας και επιτρέπουν στο σήμα χαμηλής συχνότητας να περάσει. Ουσιαστικά ο τρόπος για να γίνει αυτό είναι απλά να προσθέσουμε έναν πυκνωτή 68 pf μεταξύ της αναλογικής εισόδου και γείωσης και επίσης έναν πυκνωτή 0,1 microfarad (δηλαδή 104) μεταξύ της διακοπής PD4 (INT0) και της γείωσης. Αν παίζετε με αυτά ενώ πατάτε κουμπιά στο πληκτρολόγιο, θα μπορείτε να δείτε τι κάνουν.

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

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

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

Αν κοιτάξετε το διάγραμμα που έχω επισυνάψει σε αυτό το βήμα, θα δείτε πώς πρόκειται να λειτουργήσει ο ενισχυτής τάσης. Χρησιμοποιούμε μερικές αντιστάσεις και δύο τρανζίστορ. Ο τρόπος με τον οποίο λειτουργούν τα τρανζίστορ (δείτε τα φύλλα δεδομένων!) Είναι ότι υπάρχει μια ελάχιστη τάση που πρέπει να εισαγάγετε στον πείρο βάσης στο τρανζίστορ (τον μεσαίο πείρο) που θα τον κορεστεί και θα επιτρέψει τη ροή ρεύματος μεταξύ του πείρου συλλέκτη και του πομπού καρφίτσα. Στην περίπτωση του τρανζίστορ 2N3904 που χρησιμοποιούμε εδώ η τάση είναι 0,65V. Τώρα παίρνουμε αυτήν την τάση από την έξοδό μας από το πληκτρολόγιο και δεν θέλουμε να την αλλάξουμε, οπότε θα βάλουμε μια μεγάλη αντίσταση μεταξύ της εξόδου από το πληκτρολόγιο και της βάσης του πρώτου τρανζίστορ (χρησιμοποίησα 1Mohm). Το έχω χαρακτηρίσει ως R_1 στο διάγραμμα. Στη συνέχεια, θέλουμε να δημιουργήσουμε ένα διαχωριστή τάσης, έτσι ώστε η βάση του τρανζίστορ να είναι «σχεδόν» στα 0,65 βολτ ήδη και μόνο ένα έφηβο λίγο παραπάνω θα το σπρώξει στην κορυφή και θα το κορεστεί. Αυτό το εφηβικό κομμάτι θα προέλθει από την έξοδο του πληκτρολογίου όταν πατάμε ένα κουμπί. Δεδομένου ότι τα κάτω πλήκτρα στο πληκτρολόγιο βγάζουν μόνο μια μικρή τάση, πρέπει να είμαστε ήδη πολύ κοντά στον κορεσμό για να είναι αρκετά. Οι αντιστάσεις διαχωριστή τάσης φέρουν την ένδειξη R_a και R_b στο διάγραμμα. Χρησιμοποίησα R_a = 1Mohm και R_b = 560Kohm, αλλά είναι σχεδόν βέβαιο ότι θα πρέπει να παίξετε με αυτούς τους αριθμούς για να το κάνετε σωστά για τη ρύθμισή σας. Μπορεί να θέλετε να έχετε έναν τοίχο κοντά σας για να χτυπήσετε το κεφάλι σας και δύο ή τρία ποτήρια σκωτσέζας στο χέρι (θα συνιστούσα το Laphroaig - ακριβό, αλλά αξίζει τον κόπο αν σας αρέσει ο καπνός. Αν τα πράγματα γίνονται πραγματικά τρελά, τότε απλά πάρτε μια κανάτα του BV και εγκατασταθείτε για τη νύχτα)

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

Τώρα τι γίνεται όταν πατάω ένα κλειδί; Λοιπόν, τότε η βάση του Τ1 υπερβαίνει τα 0,65V (στην περίπτωση των κάτω κλειδιών μόλις μετά βγαίνει!) Και τότε θα επιτρέπεται να ρέει ρεύμα που θα τραβήξει τη βάση του Τ2 σε χαμηλή τάση και αυτό θα κλείσει το Τ2. Αλλά βλέπουμε ότι όταν το T2 είναι απενεργοποιημένο, τότε η έξοδος τραβιέται ψηλά και ως εκ τούτου θα λάβουμε ένα σήμα 5V που πηγαίνει στον ακροδέκτη INT0 και θα προκαλέσει διακοπή.

Παρατηρήστε ποιο είναι το καθαρό αποτέλεσμα εδώ. Αν πατήσουμε το πλήκτρο 1, παίρνουμε 5V σε PD4 χωρίς να αλλάξουμε σημαντικά την έξοδο σε ADC0, και το πιο σημαντικό, ακόμη και αν πιέσουμε τον Asterisk, 0, Hash ή Redial, λαμβάνουμε επίσης ένα σήμα 5V που πηγαίνει στο INT0 και επίσης προκαλώντας διακοπή! Αυτό είναι σημαντικό, επειδή αν περάσουμε απλώς από την έξοδο του πληκτρολογίου στον ακροδέκτη INT0, αυτά τα κλειδιά δεν παράγουν σχεδόν καμία τάση και δεν θα είναι αρκετά για να ενεργοποιήσουν αυτόν τον ακροδέκτη διακοπής. Ο ενισχυτής τάσης μας έλυσε αυτό το πρόβλημα.

Βήμα 7: Κωδικός εμφάνισης και βίντεο 4 ψηφίων

Αυτό είναι όλο για το φροντιστήριο 9! Έχω επισυνάψει τον κωδικό και ένα βίντεο που δείχνει τη λειτουργία.

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

Τώρα θα ξανακοιτάξουμε την επικοινωνία και θα πάρουμε τα 7-τμήματα και τις 4ψήφιες οθόνες μας να διαβάζουν τα ζάρια μας από τον κύλινδρο μας με τον ίδιο τρόπο που κάναμε με τον αναλυτή καταχωρητών. Αυτή τη φορά θα χρησιμοποιήσουμε τη διεπαφή δύο συρμάτων και όχι τη μέθοδο κώδικα του Μορς που έχει χακαριστεί μαζί.

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

Για εσάς που είστε φιλόδοξοι. Εδώ είναι ένα "έργο" που μπορείτε να δοκιμάσετε και σίγουρα έχετε τη γνώση να κάνετε σε αυτό το σημείο εάν έχετε περάσει από όλα αυτά τα σεμινάρια σε αυτό το σημείο:

Έργο: Φτιάξτε μια αριθμομηχανή! Χρησιμοποιήστε την τετραψήφια οθόνη και το πληκτρολόγιό μας και προσθέστε ένα εξωτερικό πάτημα κουμπιού που θα λειτουργεί σαν πλήκτρο "εισαγωγής". Αντιστοιχίστε τον αστερίσκο σε "φορές", το hash για να "διαιρέσετε" την επανάκληση σε "συν" και το φλας στο "μείον" και γράψτε μια ρουτίνα αριθμομηχανής που λειτουργεί σαν έναν από τους παλιούς αριθμομηχανές HP "reverse polish" που είχαν όλοι οι μηχανικοί πίσω στην ημέρα. Δηλ. ο τρόπος που λειτουργούν είναι ότι εισάγετε έναν αριθμό και πατάτε "enter". Αυτό ωθεί αυτόν τον αριθμό στη στοίβα, στη συνέχεια εισάγετε έναν δεύτερο αριθμό και πιέζετε το "enter", το οποίο ωθεί τον δεύτερο αριθμό στη στοίβα. Τέλος, πατάτε μία από τις λειτουργίες όπως X, /, + ή - και θα εφαρμόσει αυτήν τη λειτουργία στους δύο πρώτους αριθμούς της στοίβας, θα εμφανίσει το αποτέλεσμα και θα σπρώξει το αποτέλεσμα στη στοίβα, ώστε να μπορείτε να το χρησιμοποιήσετε ξανά εάν σαν. Για παράδειγμα, για να προσθέσετε 2+3 θα κάνατε: 2, "enter", 3, "enter", "+" και η οθόνη θα διαβάσει στη συνέχεια 5. Γνωρίζετε πώς να χρησιμοποιείτε τη στοίβα, την οθόνη, το πληκτρολόγιο και εσείς έχουν ήδη γράψει το μεγαλύτερο μέρος του κώδικα φόντου. Απλώς προσθέστε το κλειδί εισαγωγής και τις υπορουτίνες που απαιτούνται για την αριθμομηχανή. Είναι λίγο πιο περίπλοκο από ό, τι νομίζατε στην αρχή, αλλά είναι διασκεδαστικό και εφικτό.

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

Συνιστάται: