PIC Tutorial- Από μητρώα σε διακοπές

Δοκιμάστε Το Όργανο Μας Για Την Εξάλειψη Των Προβλημάτων





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

Κατανόηση των μητρώων

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



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

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



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


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

2. Τα μητρώα.

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

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

Μπορείτε να δείτε ότι βασικά χωρίζεται σε Τράπεζα 0 και Τράπεζα 1. Η Τράπεζα 1 είναι υπεύθυνη για τον έλεγχο της πραγματικής λειτουργίας του PIC, για παράδειγμα τηλεφωνεί στο PIC ποια bit στο Port A εκχωρούνται ως είσοδοι και τα οποία είναι εξόδους.

Η Τράπεζα 2 προορίζεται μόνο για χειρισμό των πληροφοριών.

Ας το καταλάβουμε με το ακόλουθο παράδειγμα:

Ας υποθέσουμε ότι θέλουμε να αντιστοιχίσουμε ένα bit στο υψηλό PortA. Για αυτό θα πρέπει πρώτα να πάμε στην Τράπεζα 1 για να ορίσουμε το καθορισμένο bit ή pin στο Port A με τη μορφή εξόδου. Μετά από αυτό επιστρέφουμε στην Τράπεζα 0 και παραδίδουμε μια λογική 1 (bit 1) σε αυτό το συγκεκριμένο pin.

Τα πιο συνηθισμένα μητρώα που θα θέλαμε να χρησιμοποιήσουμε στην Τράπεζα 1 είναι STATUS, TRISA και TRISB.

Η ΚΑΤΑΣΤΑΣΗ μας βοηθά να επιστρέψουμε στην Τράπεζα 0, το TRISA μας επιτρέπει να επιλέξουμε ποιες καρφίτσες στη Θύρα Α είναι έξοδοι και ποιες μπορεί να είναι είσοδοι, ενώ το TRISB διευκολύνει την επιλογή μεταξύ εξόδου και εισόδου στο Λιμάνι Β. Ο SELECT register στο BANK 0 επιτρέπει στον χρήστη για μετάβαση στην Τράπεζα 1.

Ας συνοψίσουμε ολόκληρη την ιδέα με την ακόλουθη περιγραφή:

ΚΑΤΑΣΤΑΣΗ:

Για να αλλάξουμε από την Τράπεζα 0 στην Τράπεζα 1, έχουμε εντολή στον κατάλογο STATUS. Αυτό υλοποιείται ρυθμίζοντας το bit # 5 του καταχωρητή STATUS σε 1. Για να επιστρέψετε στην Τράπεζα 0, αντιστοιχίζουμε το bit 5 του μητρώου STATUS στο 0. Ο καταχωρητής STATUS βρίσκεται στη διεύθυνση 03h, εδώ υποδηλώνει τον αριθμό μπορεί να είναι σε δεκαεξαδικό.

TRISA και TRISB:

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

Τώρα έχουμε 5 ακίδες στο Port A, το οποίο αντιστοιχεί σε 5 ακίδες. Εάν σκοπεύουμε να διορθώσουμε έναν από τους ακροδέκτες ως εισόδους, παραδίδουμε ένα «1» στο συγκεκριμένο bit.

Σε περίπτωση που θέλαμε να αντιστοιχίσουμε έναν από τους ακροδέκτες ως εξόδους, θα θέσαμε το συγκεκριμένο pin σε '0'. Τα bit είναι υποβοήθηση προς τα κάτω που αντιστοιχεί ακριβώς στα bit, ή πιο ακριβές το bit 0 είναι RA0, το bit 1 θα είναι RA1, το bit 2 = RA2 και ούτω καθεξής. Ας το καταλάβουμε με αυτόν τον τρόπο:

Ας υποθέσουμε ότι θέλετε να διορθώσετε τα RA0, RA3 και RA4 ως έξοδοι, ενώ τα RA1 / RA2 ως i / ps, θα το κάνατε στέλνοντας 00110 (06h). Ελέγξτε ότι το bit 0 είναι προς τα δεξιά όπως υποδεικνύεται εδώ:

Θύρα A Pin RA4 RA3 RA2 RA1 RA0

Αριθμός bit 4 3 2 1 0

Δυαδικό 0 0 1 1 0

Το ίδιο ισχύει και για το TRISB.

PORTA και PORTB

Προκειμένου να αποσπάσουμε έναν από τους ακροδέκτες εξόδου, προσφέρουμε απλώς ένα «1» έως το αντίστοιχο bit στο μητρώο PORTA ή PORTB. Μια ίδια διαδικασία μπορεί να ακολουθηθεί και για τα μητρώα TRISA και TRISB. Πριν προχωρήσουμε στο πρώτο μας παράδειγμα κωδικοποίησης, ας καταλάβουμε απλώς ένα κουπέ με περισσότερα μητρώα, δηλαδή: w και f.

W και F

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

Το μητρώο F προωθεί το γραπτό του θέμα σε ένα μητρώο. Θα χρειαζόμασταν αυτό το μητρώο F να εκχωρήσει μια τιμή πάνω από ένα μητρώο, μπορεί να είναι πάνω από το STATUS ή τα μητρώα TRISA, καθώς αυτά δεν θα μας επιτρέψουν να τοποθετήσουμε τις τιμές απευθείας πάνω τους. Ένα παράδειγμα προγράμματος

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

Ας ξεκινήσουμε διορθώνοντας τη θύρα Α όπως συζητήθηκε παραπάνω.

Γι 'αυτό πρέπει να αλλάξουμε από την Τράπεζα 0 στην Τράπεζα1, αυτό γίνεται με τη ρύθμιση του μητρώου STATUS που βρίσκεται στη διεύθυνση 03h, bit 5 έως 1.

BSF 03h, 5

Το BSF σημαίνει Bit Set F. Χρησιμοποιούμε δύο αριθμούς μετά από αυτήν την οδηγία - 03h, που είναι η διεύθυνση μητρώου STATUS, και τον αριθμό 5 που αντιστοιχεί στον αριθμό bit.

Λοιπόν, αυτό που λέμε είναι 'Ορίστε το bit 5 στη διεύθυνση 03h έως 1'.

Είμαστε τώρα στην Τράπεζα 1.

MOVLW 00110β

Βάζουμε τη δυαδική τιμή 00110 (το γράμμα b σημαίνει ότι ο αριθμός είναι δυαδικός) στο μητρώο γενικού σκοπού W. Θα μπορούσα φυσικά να το έκανα σε hex, οπότε η εντολή μας θα ήταν:

MOVLW 06h

Είτε λειτουργεί. Το MOVLW σημαίνει «Move Literal Value Into W», το οποίο στα Αγγλικά σημαίνει ότι βάζει την τιμή που ακολουθεί απευθείας στο W register.

Τώρα πρέπει να βάλουμε αυτήν την τιμή στο μητρώο TRISA για να ρυθμίσουμε τη θύρα:

MOVWF 85 ώρες

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

Το μητρώο TRISA μας σε αυτό το σημείο φέρει το σχήμα 00110 ή παρουσιάζεται γραφικά:

Θύρα A Pin RA4 RA3 RA2 RA1 RA0

Δυαδικό 0 0 1 1 0

Είσοδος / Έξοδος O O I I O

Τώρα λοιπόν διαθέτουμε τις καρφίτσες Port A, πρέπει να επιστρέψουμε στην Τράπεζα 0 για να προσαρμόσουμε μία από τις πληροφορίες.

BCF 03h, 5

Αυτή η οδηγία ολοκληρώνει το αντίστροφο του BSF. Αυτό σημαίνει 'Bit Clear F'. Το ζεύγος αριθμών που αντιστοιχούν είναι η διεύθυνση του μητρώου, εδώ ο καταχωρητής STATUS, καθώς και ο αριθμός bit, σε αυτήν την περίπτωση bit πέντε. Αυτό που έχουμε ολοκληρώσει αυτήν τη στιγμή είναι, ορίζεται το bit 5 στο δικό μας

Εγγραφή STATUS στο 0

Σε αυτό το σημείο έχουμε επιστρέψει στην Τράπεζα 0.
Το παρακάτω είναι ο κωδικός όλα σε ένα μπλοκ:

BSF 03h, 5 Μετάβαση στην Τράπεζα 1
MOVLW 06h Βάλτε το 00110 στο W
MOVWF 85h Μετακινήστε το 00110 στο TRISA
BCF 03h, 5 Επιστρέψτε στην Τράπεζα 0

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

Μέσω αυτού του μαθήματος, Επιτρέψτε μου να σας βοηθήσω να στείλετε δεδομένα στις θύρες.

Αποστολή δεδομένων σε θύρες

Στο επόμενο σεμινάριο, πρόκειται να ολοκληρώσουμε αναβοσβήνοντας ένα LED που αποτελείται από ένα πλήρες πρόγραμμα λεπτομερειών και ένα απλό διάγραμμα κυκλώματος, έτσι ώστε να μπορείτε να δείτε το PIC να εκτελεί ακριβώς αυτό που περιμένουμε.

Μην προσπαθήσετε να συνδυάσετε και να προγραμματίσετε το PIC σας με τα παρακάτω αποτελέσματα, καθώς είναι μόνο εικόνες. Αρχικά, θα δημιουργήσουμε το Port A bit 2 ως έξοδο:

Αυτό θα μπορούσε να είναι αναγνωρίσιμο από το προηγούμενο εκπαιδευτικό. Η μόνη διάκριση θα μπορούσε να είναι Έχουμε καθορίσει κάθε bit των ακίδων στο A ως έξοδο, παραδίδοντας 0h στον καταχωρητή τριών καταστάσεων. Αυτό που πρέπει τώρα να κάνει είναι να ανάψει ένα LED.

Αυτό το επιτυγχάνουμε προγραμματίζοντας έναν από τους ακροδέκτες (αυτός με το LED συνδεδεμένο σε αυτό) ψηλά. Για να το θέσουμε διαφορετικά, εφαρμόζουμε ένα «1» στον πείρο. Αυτός είναι ακριβώς ο τρόπος με τον οποίο εκτελείται (παρατηρήστε τα σχόλια για διευκρίνιση για κάθε γραμμή):

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

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

Πληκτρολογούμε έναν όρο, ας πούμε START, στη συνέχεια πληκτρολογήστε τον κωδικό:

Όπως αποδεικνύεται, αρχικά αναφέραμε την έκφραση «Έναρξη» αμέσως στην αρχή του προγράμματος.

Στη συνέχεια, στο τέλος του προγράμματος αναφέραμε ξεκάθαρα το «goto Start». Η εντολή «goto» εκτελεί ακριβώς αυτό που δηλώνει.

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

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

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

Αν και τα σχόλια μπορούν να τοποθετηθούν ακόμα, θα μπορούσε να γίνει λίγο ακατάστατο. Αυτό θα απαιτήσει την ονομασία των αριθμών και θα μπορούσε να επιτευχθεί με μια πρόσθετη εντολή: 'Equ' Η εντολή 'equ' υποδηλώνει ότι ορισμένα πράγματα μπορεί να είναι ίδια με άλλα πράγματα.

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

Θα δημιουργήσουμε μερικές σταθερές για το πρόγραμμά μας και θα παρακολουθήσουμε επίσης πόσο απλή διαβάζει το πρόγραμμα.

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

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

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

Μπορεί να υπάρχει ένα μικρό μειονέκτημα του προγράμματος LED που αναβοσβήνει.
Κάθε εντολή χρειάζεται 1 ακολουθία ρολογιού για να ολοκληρωθεί. Σε περίπτωση που χρησιμοποιούμε κρύσταλλο 4MHz, τότε κάθε οδηγία απαιτεί 1 / 4MHz ή 1uS για να ολοκληρωθεί.

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

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

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

Ας ορίσουμε αυτό το σταθερό COUNT. Μετά από αυτό, πρέπει να προσδιορίσουμε πόσο σημαντικό είναι να αρχίσει να μετράει ένας αριθμός. Σίγουρα, ο μεγαλύτερος αριθμός που θα μπορούσαμε να συμπεριλάβουμε είναι 255, ή FFh σε δεκαεξαδικό., Όπως μίλησα στο προηγούμενο σεμινάριο, η εντολή equ αποδίδει μια έκφραση σε μια κατάσταση μητρώου.

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

Ο λόγος που είναι η τοποθεσία FFh είναι, επομένως δεν μπορούμε να αποκτήσουμε πρόσβαση σε αυτήν. Επομένως, πώς πρέπει να ορίσουμε έναν γνήσιο αριθμό; Σίγουρα, θα απαιτήσει μια μικρή ποσότητα πλευρικής συλλογισμού.

Αν ίσως ορίσουμε το COUNT μας στη διεύθυνση 08h, για παράδειγμα, αυτό θα έδειχνε έναν βασικό προορισμό αντικειμενικού μητρώου. Από προεπιλογή, οι ανέγγιχτες περιοχές έχουν ρυθμιστεί σε FFh. Κατά συνέπεια, εάν το COUNT οδηγεί σε 08 ώρες, θα συναντήσετε την τιμή του FFh ενώ ενεργοποιούμε για πρώτη φορά. Ωστόσο, εγώ εσείς, πώς μπορούμε να διορθώσουμε το COUNT σε άλλο αριθμό;, το μόνο που εφαρμόζουμε είναι «μετακίνηση» μιας αποτίμησης σε αυτόν τον προορισμό πρώτα.

Για παράδειγμα, ας υποθέσουμε ότι θέλαμε το COUNT να έχει τιμή 85 ωρών, δεν μπορούμε να αναφέρουμε COUNT ίση με 85 ώρες, καθώς αυτή είναι η θέση του Μητρώου Tri-State για το Λιμάνι Α. Αυτό που επιτυγχάνουμε είναι ακριβώς το εξής: movlw 85h η τιμή των 85 ωρών στο W register movwf 08h

Τώρα μετακινήστε το στο μητρώο 08 ωρών. Στη συνέχεια, σε περίπτωση που εκφράσουμε COUNT ίση με 08 ώρες, COUNT θα ταιριάζει με την τιμή 85 ώρες. Λεπτό, έτσι δεν είναι! Επομένως, αρχικά καθορίζουμε τη σταθερά μας: COUNT equ 08h Ακολουθώντας πρέπει να μειώσουμε αυτό το COUNT κατά ένα έως ότου γίνει μηδέν.

Απλώς συμβαίνει ότι υπάρχει μια οδηγία που έχει σχεδιαστεί για να το επιτύχει αυτό, χρησιμοποιώντας ένα «goto» και μια ετικέτα.

Η οδηγία που πρόκειται να εφαρμόσουμε είναι: DECFSZ COUNT, 1 Αυτή η οδηγία αναφέρει «Μείωση του μητρώου (εδώ είναι COUNT) από τον αριθμό που παρακολουθεί το κόμμα. Εάν πετύχουμε μηδέν, προχωρήστε δύο σημεία μπροστά. »Ας το βρούμε σε δράση πρώτα, προτού το βάλουμε στην πορεία μας.

Αυτό που έχουμε εκτελέσει είναι να δημιουργήσουμε αρχικά το σταθερό μας COUNT έως 255. Το επόμενο τμήμα τοποθετεί μια ετικέτα, που ονομάζεται LABEL κοντά στην εντολή decfsz.

Το decfsz COUNT, 1 μειώνει την τιμή COUNT κατά ένα και διατηρεί το τελικό αποτέλεσμα κατευθείαν σε COUNT. Επιπλέον, επαληθεύει για να ελέγξει αν COUNT έχει τιμή 0.

Εάν όχι, σε αυτήν την περίπτωση ενεργοποιεί το πρόγραμμα να μεταβεί στην επόμενη γραμμή. Τώρα έχουμε μια δήλωση «goto» που μας επαναφέρει στις οδηγίες του decfsz.

Σε περίπτωση που η τιμή του COUNT αποδίδει ίση, τότε η εντολή decfsz καταλήγει στο πρόγραμμά μας να κάνει άλμα 2 σημείων μπροστά και αποστέλλεται στο σημείο που έχουμε διεκδικήσει «Συνεχίστε εδώ».

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

Κατανόηση των βρόχων καθυστέρησης

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

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


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

Θα προσπαθούσατε να αλλάξετε τους βρόχους καθυστέρησης για να κάνετε το φλας LED πιο γρήγορα - ποια φαίνεται η ελάχιστη τιμή COUNT για να δείτε ουσιαστικά το φλας LED; Ή ίσως, θα θελήσετε να συμπεριλάβετε έναν τρίτο ή συμπληρωματικό βρόχο καθυστέρησης μετά τον αρχικό για να σταθεροποιήσετε το LED κάτω. μια μοναδική σταθερά για κάθε βρόχο καθυστέρησης.

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

Τι είναι οι υπορουτίνες

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

Αρχικά, πρέπει να δώσουμε μια ονομασία στην υπορουτίνα μας, και σε αυτήν την περίπτωση έχουμε επιλέξει το ROUTINE. Μετά από αυτό πληκτρολογούμε τον κωδικό που θα θέλαμε να κάνουμε κανονικά. Γι 'αυτό, επιλέξαμε την καθυστέρηση στο πρόγραμμα flash που αναβοσβήνει. Τέλος, ολοκληρώνουμε την υπορουτίνα πληκτρολογώντας την εντολή RETURN.

Για να ξεκινήσετε την υπορουτίνα από οπουδήποτε στο πρόγραμμά μας, πληκτρολογούμε γρήγορα την εντολή CALL και μετά τον προσδιορισμό υπορουτίνας.

Θα το εξετάσουμε σε λίγο περισσότερο βάθος. Μόλις φτάσουμε στην ενότητα του προγράμματός μας CALL xxx, στην οποία xxx είναι το όνομα της υπορουτίνας μας, το πρόγραμμα πηδά οπουδήποτε είναι εγκατεστημένη η υπορουτίνα xxx. Εκτελούνται οι οδηγίες μέσα στην υπορουτίνα.

Όποτε ολοκληρωθεί η εντολή RETURN, το πρόγραμμα επιστρέφει στο βασικό μας πρόγραμμα στην εντολή που ακολουθεί την οδηγία CALL xxx.

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

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

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

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

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

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

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

Μετά από αυτό επικοινωνούμε με την υπορουτίνα. Το πρόγραμμα επιστρέφει στη συνέχεια για να μπορέσουμε να σβήσουμε το LED. Καλούμε την υπορουτίνα για άλλη μια φορά, σε περίπτωση που η υπορουτίνα μπορεί να έχει ολοκληρωθεί, το πρόγραμμα επιστρέφει και η επόμενη εντολή που αναγνωρίζει είναι «Goto Start». Για οποιονδήποτε μπορεί να ενδιαφέρεται, το πρώτο μας πρόγραμμα ήταν 120 bytes.

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

Στο επόμενο εκπαιδευτικό πρόγραμμα, ας δούμε την ανάγνωση από τις θύρες.

Μέχρι στιγμής, έχουμε συνθέσει στο Port A για να μπορούμε να ανάβουμε και να σβήσουμε ένα LED. Σε αυτό το σημείο, θα δούμε πώς θα διαβάσουμε τις καρφίτσες I / O στις θύρες.

Ανάγνωση θυρών εισόδου / εξόδου

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

Εάν απομνημονεύσετε από τα προηγούμενα μαθήματά μας, εάν θέλετε να δημιουργήσετε τις θύρες εισόδου / εξόδου, έπρεπε να μεταβείτε από την Τράπεζα 0 στην Τράπεζα 1. Θα το πετύχουμε αρχικά:

Σε αυτό το σημείο έχουμε διορθώσει το bit 0 της θύρας Α στην είσοδο. πρέπει τώρα να εξετάσουμε εάν ο πείρος είναι υψηλός ή χαμηλός. Για να επιτευχθεί αυτό, μπορεί κανείς να χρησιμοποιήσει μία από τις δύο οδηγίες:

BTFSC και BTFSS.

Η οδηγία BTFSC δηλώνει «Κάνετε μια δοκιμή bit στον καταχωρητή καθώς και το bit που ορίζουμε.

Σε περίπτωση που είναι 0, σε αυτήν την περίπτωση παραλείπουμε τις επόμενες οδηγίες ». Το BTFSS υποδηλώνει «Κάντε ένα τεστ bit στο μητρώο και το bit που δημιουργούμε. Σε περίπτωση που έχει οριστεί σε 1, τότε παρακάμπτουμε τις επόμενες οδηγίες.

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

Κωδικός εδώ:

BTFSS PortA, 0Πρώτα ξεκινήστε Συνεχίστε εδώ:
:

Το πρόγραμμα θα αλλάξει απλώς στο 'Carry on here' υπό την προϋπόθεση ότι το bit 0 στο PortA έχει προγραμματιστεί για 1.

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

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

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

Αυτό που επιτύχαμε εδώ είναι να ανάψουμε το LED. Στη συνέχεια καθορίζω εάν ο διακόπτης είναι κλειστός.

Σε περίπτωση που είναι περιορισμένη, στη συνέχεια συνδέομαι με την υπορουτίνα καθυστέρησης. Αυτό μας προσφέρει την ισοδύναμη καθυστέρηση όπως πριν, ωστόσο είμαστε σε αυτό το σημείο που επικοινωνούμε δύο φορές.

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

Παρακολουθείτε αυτά τα μαθήματα από την αρχή, ίσως προσπαθείτε να καταλάβετε ότι έχετε ανακαλύψει επί του παρόντος δέκα από τις 35 οδηγίες για το PIC 16F84! Και κάθε κομμάτι από αυτά τυχαίνει να μάθει απλώς ενεργοποιώντας και σβήνοντας ένα LED.

Μέχρι τώρα, έχουμε συνθέσει το PIC να αναβοσβήνει ένα LED και να σβήνει.

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

Χρήση του χώρου μνήμης αποτελεσματικά

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

movlw 02hmovwf PORTAmovlw 00hmovlw PORTA

Αρχικά γεμίσαμε το w register μας με 02h, μετά από αυτό το μεταφέραμε στο μητρώο PortA για να ανάψουμε το LED. Για να το απενεργοποιήσουμε, συσκευάσαμε w με 00h και μετά το μεταφέραμε στο μητρώο PortA.

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

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

Χρησιμοποιούμε μια διαφορετική οδηγία γνωστή ως XORF. Η οδηγία XORF λειτουργεί μια αποκλειστική λειτουργία OR στο μητρώο που ορίζουμε με τις πληροφορίες που παρέχουμε. Πιστεύω ότι πρέπει να ξεκαθαρίσω τι είναι ένας αποκλειστικός Ή στον κόσμο πριν συνεχίσουμε. Σε περίπτωση που έχουμε δύο εισόδους και μία έξοδο, η είσοδος μπορεί να είναι 1 μόνο εάν και εφόσον οι δύο είσοδοι διαφέρουν. Ενώ είναι τα ίδια, τότε η έξοδος θα είναι πιθανώς 0. Το παρακάτω είναι ένας πίνακας αλήθειας, για άτομα που επιλέγουν να τα ελέγξουν:

A B F0 0 00 1 11 0 11 1 0

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

Α Β F
0 0 0
0 0 0
1 0 1
1 1 0
1 0 1

Εάν διατηρήσουμε την τιμή του ίδιου με το 1 και το Αποκλείουμε Ή με την έξοδο, η έξοδος θα εναλλάσσεται. Σε περίπτωση που δεν μπορείτε να το παρατηρήσετε από τον πίνακα αλήθειας, παρακάτω μπορείτε να το δείτε χρησιμοποιώντας δυαδικό:

0 Τρέχουσα έξοδος
EX-OR Με 1 1 νέα έξοδο
EX-OR Με 1 0 νέα έξοδο

Ίσως μπορείτε να το βρείτε με την αποκλειστική ORing την έξοδο με 1, τώρα θα αλλάξουμε την έξοδο από 0 σε 1 έως 0.
Επομένως, για να ανάψουμε και να σβήσουμε το LED, απαιτούμε μόνο δύο προτάσεις:

MOVLW 02h
ΠΟΡΤΑ XORWF, 1

Αυτό που ακριβώς θα επιτύχουμε είναι να προσθέσουμε το w register μας με 02h. Σε αυτήν την περίπτωση είμαστε Αποκλειστικοί ORING αυτόν τον αριθμό, ανεξάρτητα από το τι υπάρχει στο PortA μας. Στην περίπτωση που το bit 1 είναι 1, πρόκειται να αλλάξει σε 0. Στην περίπτωση που το bit 1 είναι 0, θα αλλάξει σε 1. Ας εξετάσουμε αυτόν τον κώδικα μία ή δύο φορές, για να δείξουμε πώς λειτουργεί δυαδικό:

ΠΟΡΤΑ
00010
xorwf 00000
xorwf 00010
xorwf 00000
xorwf 00010

Δεν χρειάζεται να φορτώνουμε την ίδια τιμή στο w register μας κάθε φορά, επομένως είναι δυνατόν να το πετύχουμε μία φορά στην αρχή και απλά να επιστρέψουμε στην εντολή εναλλαγής. Επιπλέον, δεν πρέπει να καθορίσουμε μια τιμή στο μητρώο PortA. Ο λόγος? Σίγουρα, καθώς σε περίπτωση ενεργοποίησης είναι 1, μπορούμε εύκολα να το αλλάξουμε. Εναλλακτικά, ένα 0 στο power up, θα το κάναμε ακόμα και τώρα.

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

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

Διαστάσεις προγράμματος αλλαγής (Bytes)
Αναβοσβήνει πρωτότυπο LED 120
Προστέθηκε υπορουτίνα LED που αναβοσβήνει 103
Λειτουργία LED που αναβοσβήνει XOR 91
LED με διακόπτη αυθεντικό 132
LED με διακόπτη XOR Λειτουργία που χρησιμοποιείται 124.

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

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

Λογικοί διαχειριστές

Στο τελευταίο σεμινάριο παρουσίασα τη λειτουργία Exclusive OR. Η συνάρτηση ExOR νοείται ως λογικός τελεστής.

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

Η συνάρτηση AND αναλύει βασικά δύο δυφία και παρέχει 1 αν είναι ίδια και 0 σε περίπτωση που είναι διακριτικά. Για παράδειγμα, αν αναφέραμε το 1 ΚΑΙ 1, το αποτέλεσμα είναι 1, ενώ στην περίπτωση που δηλώσαμε 1 ΚΑΙ 0 η συνέπεια θα ήταν 0.

Περιττό να πούμε, είμαστε σε θέση να αξιολογήσουμε και τις λέξεις, καθώς και όλα τα επιτεύγματα της συνάρτησης AND είναι η αναθεώρηση των δύο όρων σιγά-σιγά. Η παρακάτω παρουσίαση δείχνει δύο λέξεις 8 bit που γίνονται ANDed μαζί με το προϊόν:

11001011
ΚΑΙ 10110011
Ισούται με 10000011

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

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

Το PIC μας παρέχει δύο συστατικά για AND.
Είναι ANDLW και ANDWF. Το ANDLW μας επιτρέπει να πραγματοποιήσουμε μια συνάρτηση AND με τις λεπτομέρειες του μητρώου W και ένα ποσό που ορίζουμε.

Η σύνταξη είναι: ANDLW όπου είναι ακριβώς αυτό που πηγαίνουμε ΚΑΙ τα περιεχόμενα του W με.

Η συνέπεια της συνάρτησης AND θα αποθηκευτεί απευθείας στον καταχωρητή W.
Το ANDWF μας επιτρέπει να πραγματοποιήσουμε μια συνάρτηση AND στον καταχωρητή W και έναν διαφορετικό καταχωρητή, για παράδειγμα ένα PORT. Η σύνταξη είναι: ANDWF, d στο οποίο είναι ο καταχωρητής για τον οποίο είμαστε ενθουσιασμένοι, π.χ. Το PORTA και το d δείχνει το PIC όπου πρέπει να τοποθετήσετε το αποτέλεσμα. Εάν d = 0, το αποτέλεσμα τοποθετείται στον καταχωρητή W και του d = 1 το τελικό αποτέλεσμα αποθηκεύεται στον καταχωρητή που ορίσαμε. Τα δύο μέρη του κώδικα που ακολουθούν εμφανίζουν ένα καλό παράδειγμα κάθε συνάρτησης AND.

Το αρχικό εξετάζει την κατάσταση της PORTA, στην οποία πρέπει να ελέγξουμε εάν οι εισόδους είναι 1100. Μπορούμε να τοποθετήσουμε ξανά το αποτέλεσμα στον κατάλογο W

movlw 1100
ANDWF 05h, 0 Η δεύτερη εικόνα μπορεί τώρα να επαληθεύσει τα περιεχόμενα του μητρώου W:
ANDLW 1100

Ή

Ανακαλύψαμε τώρα μία συνάρτηση OR, για να είμαστε ακριβείς το XOR. Αυτό εξελίσσεται σε 1 εάν δύο bits δεν είναι τα ίδια, αλλά είναι διαφορετικά. Μπορείτε να βρείτε μια άλλη συνάρτηση OR που ονομάζεται IOR, η οποία είναι η αποκλειστική OR. Αυτή η συνάρτηση θα δημιουργήσει ένα 1 σε περίπτωση που ένα bit είναι 1, αλλά επιπλέον εάν κάθε bit είναι 1. Ακολουθεί ένας ξεκάθαρος πίνακας αλήθειας για να το δείξετε αυτό:

A B O / P
0 0 0
0 1 1
1 0 1
1 1 1

Τι είναι οι αριθμητικοί χειριστές

ΠΡΟΣΘΗΚΗ

Αυτή η συνάρτηση επιτυγχάνει αυτό που συνήθως ισχυρίζεται. Συνεισφέρει δύο αριθμούς! Σε περίπτωση που η συνέπεια της προσθήκης των δύο αριθμών ξεπερνά τα 8 bits, σε αυτήν την περίπτωση πιθανότατα θα οριστεί μια σημαία CARRY. Η σημαία CARRY βρίσκεται στη διεύθυνση 03h bit 0.

Όταν προγραμματιστεί αυτό το bit, τότε οι δύο αριθμοί ξεπέρασαν τα 8 bit. Όταν είναι 0, σε αυτήν την περίπτωση η συνέπεια βρίσκεται εντός 8 bit. Όπως και πριν, το PIC μας προσφέρει δύο στυλ ADD, συγκεκριμένα ADDLW και ADDWF. Όπως θα μπορούσατε να υποθέσετε, αυτό μοιάζει με την παραπάνω συνάρτηση. Το ADDLW προσφέρει τα περιεχόμενα του μητρώου W σε αυτό που ορίζουμε. Η σύνταξη είναι: ADDLW ADDWF προσθέστε τα περιεχόμενα του μητρώου W και κάποιου άλλου μητρώου που ορίζουμε.

Η σύνταξη είναι: ADDWF, d είναι πού

ΥΠΟ

Σε αυτό το σημείο, υποθέτω ότι δεν μπορείτε να υποθέσετε τι κάνει αυτή η λειτουργία! Πράγματι, το υποψιάσατε, αυτή η λειτουργία
αφαιρεί το ένα bit από το άλλο. Και πάλι το PIC μας προσφέρει 2 γεύσεις: SUBLW και SUBWF. Η σύνταξη είναι ακριβώς παρόμοια με τη συνάρτηση ADD, εκτός από προφανώς πληκτρολογείτε SUB αντί για ADD!

Αύξηση Σε περίπτωση που θέλαμε να συμπεριλάβουμε 1 έως έναν αριθμό στο PIC, θα μπορούσαμε να χρησιμοποιήσουμε απολύτως τη συνάρτηση ADD και να χρησιμοποιήσουμε τον νούμερο ένα. ~ Η δυσκολία με αυτό είναι ότι πρέπει πρώτα να τοποθετήσουμε το σχήμα στον καταχωρητή W, στη συνέχεια να χρησιμοποιήσουμε τον έλεγχο ADDLW 1 για να τον αυξήσουμε. Σε περίπτωση που θέλαμε να συμπεριλάβουμε 1 σε ένα μητρώο, μπορεί να είναι ακόμη χειρότερο. Πρέπει πρώτα να τοποθετήσουμε τον αριθμό 1 στον καταχωρητή W, μετά από αυτήν τη χρήση ADDWF, 1. Επομένως, για παράδειγμα, για να συμπεριλάβουμε 1 στην τοποθεσία 0C, ας πούμε, θα πρέπει να έχουμε το ακόλουθο μέρος του σεναρίου:

movlw 01
addwf 0c, 1

Υπάρχει μια ευκολότερη μέθοδος διεξαγωγής αυτού. Μπορούμε να ασκήσουμε την εντολή INCF. Η σύνταξη είναι: INCF, d πού, είναι ο καταχωρητής, ή ο τόπος, στον οποίο μας ενδιαφέρει, και d δείχνει το PIC όπου πρέπει να τοποθετήσετε το αποτέλεσμα. Στην περίπτωση d = 0, το αποτέλεσμα βρίσκεται εντός του μητρώου W, και στην περίπτωση d = 1, η συνέπεια ορίζεται στο μητρώο που ορίσαμε.

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

Υπάρχει εντολή αύξησης. Είναι INCFSZ. Αυτή η εντολή μπορεί να αυξήσει το μητρώο που ορίζουμε, ωστόσο, εάν το μητρώο ισούται με 0 μετά την αύξηση (που θα συμβεί ενώ συμπεριλαμβάνουμε 1 έως 127) μετά από αυτό το PIC πιθανότατα θα περάσει τις επόμενες οδηγίες. Το τμήμα του παρακάτω κώδικα αντικατοπτρίζει αυτό:

Βρόχος incfsz 0C
Πήγαινε βρόχος
:
:
Υπόλοιπο προγράμματος.

Στο παραπάνω τμήμα του κώδικα, το 0C πρόκειται να αυξηθεί από το 1. Έχουμε στη συνέχεια μια οδηγία που ενημερώνει το PIC για να επιστρέψει στην ετικέτα μας με το όνομα Loop και να αυξήσει το 0C κατά 1 ξανά. Αυτό συνεχίζεται μέχρι το 0C να ισούται με 127. Σε αυτήν την περίπτωση, όταν αυξάνουμε το 0C με 1, το 0C θα ταιριάζει τώρα με το 0. Η οδηγία INCFSZ θα μπορούσε πολύ καλά να ενημερώσει το PIC για να παραλείψει την επόμενη οδηγία, η οποία σε αυτήν την περίπτωση είναι η δήλωση goto, Ως εκ τούτου, το PIC θα προχωρήσει με το υπόλοιπο του προγράμματος.

Μείωση

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

Συμπλήρωμα

Η τελική οδηγία σε αυτήν τη συζήτηση θα αντιστρέψει κάθε bit στο μητρώο που ορίζουμε. Η σύνταξη είναι: COMF, d όπου

Κατανόηση των λειτουργιών Bit

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

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

Επιτρέψτε μου να επαναλάβω τη χρήση τους εδώ.

BCF

Αυτή η οδηγία θα διαγράψει λίγο που ορίζουμε σε ένα μητρώο που ορίζουμε. Η σύνταξη
είναι:
BCF,

Χρησιμοποιήσαμε αυτό νωρίτερα για να αλλάξουμε από τη σελίδα 1 στη σελίδα 0 αφαιρώντας λίγο στον κατάλογο STATUS. Μπορούμε επίσης να το χρησιμοποιήσουμε για να διορθώσουμε λίγο σε 0 σε οποιοδήποτε διαφορετικό μητρώο / τοποθεσία. Για παράδειγμα, σε περίπτωση που θέλαμε να ρυθμίσουμε το 3ο bit στο 11001101 που αποθηκεύτηκε στην ενότητα 0C σε 0, ίσως
εισάγετε:

BCF 0C, 03

BSF

Αυτή η οδηγία θα διορθώσει ό, τι ορίζουμε στο 1 σε οποιοδήποτε μητρώο που υποδεικνύουμε. Το χρησιμοποιήσαμε νωρίτερα για να προχωρήσουμε από τη σελίδα 0 στη σελίδα 1. Η σύνταξη είναι: BSF ,, και χρησιμοποιείται με την ίδια ακριβώς μέθοδο με την παραπάνω BCF.

BTFSC Μέχρι τώρα θα μπορούσαμε να ορίσουμε ή να διαγράψουμε λίγο σε ένα μητρώο. Ωστόσο, φανταστείτε αν πρέπει να ελέγξουμε αν ένα bit είναι 1 ή 0 σε ένα μητρώο;

Σίγουρα, είναι δυνατή η χρήση του BTFSC. Αναφέρει το Bit Test Register F και παραλείψτε εάν είναι σαφές. Αυτή η οδηγία θα αναλύσει το bit που ορίζουμε στο μητρώο. Σε περίπτωση που το bit είναι 0, η εντολή θα ενημερώνει το PIC για να περάσει τις επόμενες οδηγίες.

Ενδέχεται να χρησιμοποιήσουμε αυτήν την οδηγία σε περίπτωση που θέλουμε να ελέγξουμε μια σημαία, για παράδειγμα η σημαία μεταφοράς. Αυτό μας απαλλάσσει από την ανάγκη να διαβάσουμε τον κατάλογο STATUS και να αναζητήσουμε τα μεμονωμένα bits για να μάθουμε ποιες σημαίες είναι σταθερές. 29 Για παράδειγμα, σε περίπτωση που θέλαμε να ελέγξουμε αν η σημαία του Carry είχε οριστεί σε 1 αφού προσθέσαμε 2 σχήματα, τότε θα μπορούσαμε να πληκτρολογήσουμε τα εξής:

BTFSC 03h, 0
συνεχίστε εδώ αν οριστεί σε 1
ή εδώ αν οριστεί σε 0

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

Βρόχος:
:
:
BTFSC 03,0
Πήγαινε βρόχος

Στον παραπάνω κώδικα, το PIC θα βγει απλώς από το βρόχο σε περίπτωση που το bit 0 του καταχωρητή STATUS (ή η σημαία του Carry) ορίζεται στο 0. Διαφορετικά, θα εκτελεστεί η εντολή goto.

BTFSS

Αυτή η οδηγία αναφέρει το Bit Test Register F και το Skip If Set. Αυτό μπορεί να συγκριθεί με την εντολή BTFSC, εκτός από το ότι το PIC θα παραλείψει την επόμενη εντολή εάν το bit που έχουμε αξιολογήσει έχει οριστεί σε 1, αντί για 0.

CLRF

Αυτή η οδηγία θα διορθώσει όλες τις λεπτομέρειες ενός μητρώου σε 0. Η σύνταξη είναι:

CLRF
Χρησιμοποιήσαμε αυτό νωρίτερα για να ορίσουμε την έξοδο των Ports στο 0, εφαρμόζοντας το CLRF 85h. Επιπλέον, το χρησιμοποιήσαμε για να διορθώσουμε τις θύρες ώστε να συμπεριλάβουν όλες τις καρφίτσες στην έξοδο χρησιμοποιώντας CLRF
05 ω.

CLRW

Αυτό θα μπορούσε να μοιάζει με την οδηγία CLRF, εκτός από την εκκαθάριση του μητρώου W. Η σύνταξη είναι αρκετά απλή:

CLRW

RLF και RRF

Αυτές οι οδηγίες θα μεταφέρουν ένα κομμάτι σε έναν καταχωρητή μία μόνο υποδοχή προς τα αριστερά (RLF) ή τα δεξιά (RRF) σε έναν καταχωρητή. Για παράδειγμα, αν χρειαζόμασταν το 00000001 και χρησιμοποιήσαμε το RLF, στην περίπτωση αυτή θα μπορούσαμε να έχουμε το 00000010. Σε αυτό το σημείο, τι συμβαίνει σε περίπτωση που υπάρχει 10000000 και εφαρμόσαμε την οδηγία RLF; Σίγουρα, το 1 θα τοποθετηθεί στη σημαία μεταφοράς. Σε περίπτωση που εφαρμόσαμε την εντολή RLF για άλλη μια φορά, το 1 θα επανεμφανιστεί στην αρχή. Το ίδιο συμβαίνει, ωστόσο, αντίθετα, για την εντολή RRF. Η υπόθεση στο σημείο παρακάτω δείχνει αυτό για την οδηγία RLF, στην οποία έχουμε να δούμε τα 8 bit ενός μητρώου, καθώς και τη σημαία μεταφοράς:

C 87654321
0 00000001
0 00000010 RLF
0 00000100 RLF
RLF 0 00001000
0 00010000 RLF
0 00100000 RLF
0 01000000 RLF
0 10000000 RLF
1 00000000 RLF
0 00000001 RLF

Παράδειγμα προγράμματος

Τώρα θα δούμε ένα παράδειγμα κώδικα που μπορεί κανείς να μεταγλωττίσει και να οδηγήσει. Θα δημιουργούσε ένα φως ακολουθίας ξεκινώντας από το PortA bit 0, πηγαίνοντας στο PortB bit 8 και
μετά επιστρέφω.
Συνδέστε τα LED σε κάθε έναν από τους ακροδέκτες της θύρας. Θα έχουμε λίγο
διαδικασίες που επισημαίνονται σε αυτό το σεμινάριο.

TIME EQU 9FH Μεταβλητή για το βρόχο καθυστέρησης.
Διεύθυνση PORTB EQU 06H Port B.
TRISB EQU 86H Port B Tristate διεύθυνση.
Θύρα PORTA EQU 05H Μια διεύθυνση.
TRISA EQU 85H Port A Tristate διεύθυνση.
STATUS EQU 03H Σελίδα επιλέξτε εγγραφή.
COUNT1 EQU 0CH Εγγραφή βρόχου.
COUNT2 EQU 0DH Loop register.

BSF STATUS, 5 Μεταβείτε στη σελίδα 1
MOVLW 00H και ρύθμιση
MOVWF TRISB και οι δύο θύρες Α και Β
MOVLW 00H στην έξοδο,
Στη συνέχεια, επιστρέψτε στο MOVWF TRISA
BCF STATUS, 5 σελίδα 0.
MOVLW 00H Clear Port A.
ΠΟΡΤΑ MOVWF

Έναρξη του κύριου προγράμματος

RUNMOVLW
01H Ρυθμίστε το πρώτο bitMOVWF
PORTB στη θύρα B.CALL
ΚΑΘΥΣΤΕΡΗΣΗ Περιμένετε λίγο ΚΛΗΣΗ
ΚΑΘΥΣΤΕΡΗΣΗ
Μετακινήστε το bit στο Port B αριστερά και, στη συνέχεια, σταματήστε.RLF
PORTB, 1CALL
ΚΑΘΥΣΤΕΡΗΣΗ ΚΛΗΣΗΣ
DELAYRLF
PORTB, 1CALL
ΚΑΘΥΣΤΕΡΗΣΗ ΚΛΗΣΗΣ
DELAYRLF
PORTB, 1CALL
ΚΑΘΥΣΤΕΡΗΣΗ ΚΛΗΣΗΣ
DELAYRLF
PORTB, 1CALL
ΚΑΘΥΣΤΕΡΗΣΗ ΚΛΗΣΗΣ
DELAYRLF
PORTB, 1CALL
ΚΑΘΥΣΤΕΡΗΣΗ ΚΛΗΣΗΣ
DELAYRLF
PORTB, 1CALL
ΚΑΘΥΣΤΕΡΗΣΗ ΚΛΗΣΗΣ
DELAYRLF
PORTB, 1CALL
ΚΑΘΥΣΤΕΡΗΣΗ ΚΛΗΣΗΣ
DELAYRLF
PORTB, 1 Αυτό μετακινεί το κομμάτι στη σημαία μεταφοράς
Τώρα μετακινηθείτε στη θύρα A και μετακινήστε το αριστερό κομμάτι.RLF
PORTA, 1 Αυτό μετακινεί το bit από τη σημαία μηδέν στο PortACALL
DELAYCALL DELAYRLF
ΠΟΡΤΑ, 1ΚΛΗΣΗ
ΚΑΘΥΣΤΕΡΗΣΗ ΚΛΗΣΗΣ
DELAYRLF
ΠΟΡΤΑ, 1ΚΛΗΣΗ
ΚΑΘΥΣΤΕΡΗΣΗ ΚΛΗΣΗΣ
DELAYRLF
ΠΟΡΤΑ, 1ΚΛΗΣΗ
ΚΑΘΥΣΤΕΡΗΣΗ ΚΛΗΣΗΣ
ΚΑΘΥΣΤΕΡΗΣΗ
Μετακινήστε το bit πίσω στο Port ARRF
ΠΟΡΤΑ, 1ΚΛΗΣΗ
ΚΑΘΥΣΤΕΡΗΣΗ
DELAYRRF
ΠΟΡΤΑ, 1ΚΛΗΣΗ
ΚΑΘΥΣΤΕΡΗΣΗ ΚΛΗΣΗΣ
DELAYRRF
ΠΟΡΤΑ, 1ΚΛΗΣΗ
ΚΑΘΥΣΤΕΡΗΣΗ ΚΛΗΣΗΣ
DELAYRRF
PORTA, 1 Αυτό μετακινεί το bit στο μηδέν σημαία Τώρα μετακινήστε το bit
πίσω στο Port BRRF
PORTB, 1CALL
ΚΑΘΥΣΤΕΡΗΣΗ ΚΛΗΣΗΣ
DELAYRRF
PORTB, 1CALL
ΚΑΘΥΣΤΕΡΗΣΗ ΚΛΗΣΗΣ
DELAYRRF
PORTB, 1CALL
ΚΑΘΥΣΤΕΡΗΣΗ ΚΛΗΣΗΣ
DELAYRRF
PORTB, 1CALL
DELAYCALL DELAYRRF
PORTB, 1CALL
ΚΑΘΥΣΤΕΡΗΣΗ ΚΛΗΣΗΣ
DELAYRRF
PORTB, 1CALL
ΚΑΘΥΣΤΕΡΗΣΗ ΚΛΗΣΗΣ
DELAYRRF
PORTB, 1CALL
ΚΑΘΥΣΤΕΡΗΣΗ ΚΛΗΣΗΣ
ΚΑΘΥΣΤΕΡΗΣΗ Τώρα επιστρέφουμε από το σημείο που ξεκινήσαμε, GOTO
ΛΕΙΤΟΥΡΓΙΑ ας πάμε ξανά.

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

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

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

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

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

10 ΧΡΟΝΙΑ Κ = 0
11 Κ = Κ + 1
12 ΕΑΝ Κ> 10 ΑΥΤΟ ΠΟΤΕ 20 ΕΛΛΕΣ ΠΕΡΙΣΣΟΤΕΡΑ 11
20 ΕΚΤΥΠΩΣΗ Κ
21 ΤΕΛΟΣ

Το πρόγραμμα ξεκινά στη γραμμή 10. Μόλις το K έχει προγραμματιστεί στο 0, στη συνέχεια προχωρά στη γραμμή 11. Αφού συμπεριλάβουμε το 1 έως το Κ μετά από αυτό προχωράμε στη γραμμή 12.

Σε αυτό το σημείο μπορεί να είμαστε περίεργοι εάν το Κ είναι υψηλότερο από το 10. Σε περίπτωση που είναι, στη συνέχεια κατευθυνόμαστε στη γραμμή 20, αλλιώς επιστρέφουμε στη γραμμή 11.

Η γραμμή 20 τεκμηριώνει το Κ και η γραμμή 21 ολοκληρώνει το πρόγραμμα. Η BASIC χρησιμοποιεί στατιστικά στοιχεία γραμμής για να βοηθήσει τον προγραμματιστή να διατηρεί αρχείο σχετικά με το πού βρίσκονται τα ζητήματα, καθώς οι ετικέτες δεν επιτρέπονται. Το PIC χρησιμοποιεί ετικέτες για να ξεφύγει μεταξύ προορισμών - ή μπορεί πραγματικά;

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

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

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

PC Instruction0000 movlw 03
0001 movwf 0C
0002 Loop decfsc 0C
0003 goto Loop
0004 τέλος

Στην παραπάνω επίδειξη, Διορθώσαμε τον υπολογιστή στο 0000. Σε αυτό έχουμε την οδηγία movlw 03. Όταν το PIC έχει εφαρμόσει αυτά τα δεδομένα, αυξάνει τον υπολογιστή έτσι ώστε να σαρωθεί η επόμενη οδηγία. Σε αυτό το σημείο το PIC προβάλλει το movwf 0C. Ο υπολογιστής αυξάνεται ξανά.

Τώρα το PIC μελετά decfsc 0C. Σε περίπτωση που οι λεπτομέρειες του 0C δεν είναι 0, σε αυτήν την περίπτωση ο υπολογιστής αυξάνεται από το 1, καθώς και η ακόλουθη εντολή, goto Loop, ενημερώνει τον υπολογιστή για να επιστρέψει στη θέση 0003, την οποία υπάρχει ο εν λόγω βρόχος. Σε περίπτωση που οι λεπτομέρειες του 0C είναι 0, τότε ο υπολογιστής συνιστάται να αυξηθεί κατά 2, απλώς παραλείψτε τις επόμενες οδηγίες.

Κατανόηση των πινάκων δεδομένων

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

Υπολογιστής 02
movlw 03
πίνακας κλήσεων
:
επιτραπέζιος υπολογιστής addwf
ανταπόκριση 01
απάντηση 02
ανταπόκριση 03
απάντηση 04
ανταπόκριση 05
απάντηση 06
ανταπόκριση 07
ΕΠΙΣΤΡΟΦΗ

Η αρχική οδηγία εκχωρεί την ετικέτα PC με τη διεύθυνση του μετρητή προγράμματος (02h). Θα είμαστε σύντομα αφού βάλουμε την τιμή των 03 ωρών στο μητρώο w. Εμείς μετά επικοινωνούμε στον πίνακα. Η πρώτη γραμμή στον πίνακα υπορουτίνας αυξάνει τις λεπτομέρειες του μητρώου W (03h) στον μετρητή προγράμματος.

Αυτό ενεργοποιεί τον μετρητή προγράμματος να αυξήσει κατά 3, ή να το θέσει με διαφορετικό τρόπο, διεγείρει τον μετρητή προγράμματος για να προχωρήσει κάτω από 3 γραμμές. Ενώ ο μετρητής φτάνει 3 γραμμές προς τα κάτω, το PIC αναγνωρίζει την αναδρομική οδηγία. Αυτή η εντολή στέλνει την τιμή που ακολουθεί στον καταχωρητή W, μετά την οποία επιστρέφει από την υπορουτίνα. Το RETLW σημαίνει βασικά Return, Literal to W.

Βλέπε έβαλα κόμμα μετά τη λέξη Return. Δεδομένου ότι βρισκόμαστε σε μια υπορουτίνα, απαιτούμε μια εντολή Επιστροφής στην επιφάνεια της. Επομένως, η RET στην οδηγία. Μετά την εντολή RETLW είναι ένας αριθμός, και αυτό είναι ακριβώς αυτό που τοποθετείται στο μητρώο W.

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

Το θέμα των διακοπών μπορεί να είναι το πιο μακρύ και πιο δύσκολο να περάσει κανείς.

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

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

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

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

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

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

Κατανόηση Διακοπών

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

Εάν ελέγξετε το pin-out του PIC, θα παρατηρήσετε ότι το pin 6 είναι RB0 / INT. Σε αυτό το σημείο, το RB0 είναι σαφώς Port B bit 0. Το INT αντιπροσωπεύει ότι θα μπορούσε επίσης να διαμορφωθεί ως εξωτερικός πείρος διακοπής. Επιπλέον, οι ακίδες Port B 4 έως 7 (ακίδες 10 έως 13) μπορούν επίσης να χρησιμοποιηθούν για διακοπές. Προτού μπορέσουμε να χρησιμοποιήσουμε το INT ή άλλους ακροδέκτες Port B, πρέπει να ολοκληρώσουμε δύο εργασίες. Πρώτα πρέπει να ενημερώσουμε το PIC ότι θα χρησιμοποιήσουμε τις διακοπές.

Στη συνέχεια, πρέπει να ορίσουμε ποια ακίδα B θα χρησιμοποιήσουμε ως διακοπή και όχι ως καρφίτσα I / O. Μέσα στο PIC μπορείτε να βρείτε ένα μητρώο γνωστό ως INTCON και βρίσκεται στη διεύθυνση 0Bh. Σε αυτό το μητρώο θα ανακαλύψετε 8 bit που μπορεί να είναι ενεργοποιημένα ή απενεργοποιημένα. Το bit 7 του INTCON είναι γνωστό ως GIE. Αυτό είναι το Global Interrngupt Enable. Η διόρθωση σε 1 ενημερώνει το PIC ότι θα χρησιμοποιήσουμε μια διακοπή.

Το bit 4 του INTCON είναι γνωστό ως INTE, INTerrupt Enable. Βάζοντας αυτό το bit σε 1 μεταδίδουμε στο PIC ότι το RB0 θα είναι ένα pin διακοπής. Η διαμόρφωση του bit 3, που ονομάζεται RBIE, ενημερώνει το PIc ότι πρόκειται να χρησιμοποιήσουμε τα bit B έως 4 έως 7. Σε αυτό το σημείο το PIC κατανοεί πότε αυτός ο πείρος μπορεί να είναι υψηλός ή χαμηλός, πρέπει να σταματήσει αυτό που εκτελεί και να προχωρήσει με μια διακοπή ρουτίνα. Σε αυτό το σημείο, πρέπει να ενημερώσουμε το PIC εάν η διακοπή θα είναι πιθανότατα στην ανερχόμενη άκρη (0V έως + 5V) ή στον μετασχηματισμό του σήματος (+ 5V έως 0V).

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

Το άκρο «triggering» έχει προγραμματιστεί σε έναν πρόσθετο καταχωρητή που ονομάζεται OPTION register, στη διεύθυνση 81h. Το bit για το οποίο είμαστε ενθουσιασμένοι είναι το bit 6, που συχνά αναφέρεται ως INTEDG.

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

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

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

Αυτό ενημερώνει τον εσωτερικό επεξεργαστή του PIC ότι έχει πραγματοποιηθεί διακοπή. Στη συνέχεια, ο μετρητής προγράμματος (για τον οποίο μίλησα στο προηγούμενο σεμινάριο) συμβουλές για μια συγκεκριμένη διεύθυνση στο PIC. Ας δούμε γρήγορα όλα αυτά ξεχωριστά. Σημαία διακοπής Στο μητρώο INTCON, το bit 1 είναι η σημαία διακοπής, που ονομάζεται INTF. Σε αυτό το σημείο, όποτε προκύψει διακοπή, αυτή η σημαία πιθανότατα θα οριστεί σε 1.

Όταν δεν υπάρχει διακοπή, η σημαία τοποθετείται στο 0. Αυτό είναι σχεδόν όλα τα επιτεύγματα. Σε αυτό το σημείο μπορεί να σκέφτεστε «ποιο είναι το νόημα;» Σίγουρα, παρόλο που αυτή η σημαία έχει προγραμματιστεί για 1, το PIC δεν είναι σε θέση και δεν θα αντιδράσει σε άλλη διακοπή. Επομένως, ας εκφράσουμε ότι προκαλούμε διακοπή. Η σημαία πιθανότατα θα σταθεροποιηθεί στο 1 και το PIC μπορεί να πάει στη ρουτίνα μας για να εργαστεί η διακοπή.

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

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

Θέση μνήμης Κάθε φορά που ενεργοποιείτε αρχικά το PIC, ή σε περίπτωση επαναφοράς, οι συμβουλές του μετρητή προγράμματος για την αντιμετώπιση 0000 ωρών, που θα μπορούσαν να είναι αμετάβλητα στην αρχή της μνήμης του προγράμματος. Όμως, σε περίπτωση διακοπής, ο μετρητής προγράμματος υποδεικνύει τη διεύθυνση 0004h.

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

Αυτό μπορεί να είναι χωρίς προβλήματα. Αρχικά, ξεκινάμε το πρόγραμμά μας με μια εντολή γνωστή ως ORG. Αυτή η εντολή υποδεικνύει Origin, ή start. Τηρούμε με μια διεύθυνση. Δεδομένου ότι το PIC ξεκινά στη διεύθυνση 0000h, πληκτρολογούμε ORG 0000h. Μετά από αυτό πρέπει να παρακάμψουμε τη διεύθυνση 0004h. Αυτό το επιτυγχάνουμε τοποθετώντας μια εντολή GOTO, συνοδευόμενη από μια ετικέτα που συμβουλεύει το πρωταρχικό μας πρόγραμμα.

Μετά από αυτό τηρούμε αυτήν την εντολή GOTO με ένα ακόμη ORG, αυτή τη στιγμή με τη διεύθυνση 0004h. Μετά από αυτήν την εντολή θα εισάγουμε τη ρουτίνα διακοπής. Σε αυτό το σημείο, ενδέχεται να είμαστε σε θέση να πληκτρολογήσουμε τη ρουτίνα διακοπής αμέσως μετά τη δεύτερη εντολή ORG ή μπορούμε να τοποθετήσουμε μια δήλωση GOTO που δείχνει τη ρουτίνα διακοπής.

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

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

Για παράδειγμα, ας χρησιμοποιήσουμε το w register για να προωθήσουμε δεδομένα στο πρωτεύον πρόγραμμα Port A, επομένως μπορείτε επιπλέον να χρησιμοποιήσετε το w register στη ρουτίνα διακοπής για να μετακινήσετε δεδομένα από έναν προορισμό σε έναν άλλο.

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

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

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

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

Σε αυτό το σημείο, ένα σημείο είναι το γεγονός ότι εάν χρησιμοποιείτε τα bits 4 έως 7 του Port B ως διακοπή. Δεν μπορείτε να επιλέξετε συγκεκριμένες καρφίτσες στη Θύρα B για να λειτουργήσει ως διακοπή.

Επομένως, σε περίπτωση που επιτρέπετε αυτές τις καρφίτσες, πιθανότατα θα μπορούσαν να είναι όλες διαθέσιμες. Επομένως, για παράδειγμα, δεν μπορείτε απλά να έχετε bits 4 και 5 - πιθανότατα τα bits 6 και 7 θα είναι ταυτόχρονα ενεργοποιημένα. Ποιος ακριβώς είναι ο σκοπός της λήψης τεσσάρων bits για την αναπαράσταση μιας διακοπής; Σίγουρα, μπορεί να έχετε ένα κύκλωμα συνδεδεμένο με το PIC, σε περίπτωση που κάποιος από τέσσερις γραμμές φτάσει ψηλά, σε αυτήν την περίπτωση αυτό μπορεί να είναι ένα ζήτημα που απαιτείται από το PIC να επηρεάσει άμεσα.

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

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

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

Το πρόγραμμα θα μετρήσει από 0 έως 9, ορατό σε 4 LED σε δυαδική μορφή, μαζί με την είσοδο ή η διακοπή πιθανότατα θα είναι στο RB0.

Το νούμερο ένα πράγμα που πρέπει να κάνουμε είναι να ενημερώσουμε το PIC για να ξεπεράσει τη διεύθυνση στην οποία δείχνει ο μετρητής προγράμματος κάθε φορά που πραγματοποιείται διακοπή.

Θα παρατηρήσετε ότι χρησιμοποιούμε μια μοναδική μέθοδο έκθεσης δεκαεξαδικών αριθμών. Προτού συμβεί, εφαρμόστε το F9h στο οποίο το h έδειξε δεκαεξαδικό. Θα μπορούσαμε να το γράψουμε ως 0xF9, που είναι η δομή που πρόκειται να χρησιμοποιήσουμε από τώρα και στο εξής.

Τώρα πρέπει να πούμε στο PIC ότι πρόκειται να χρησιμοποιήσουμε διακοπές και χρησιμοποιούμε RB0 pin 6 ως pin διακοπής:

bsf INTCON, 7GIE - Ενεργοποίηση καθολικής διακοπής (1 = ενεργοποίηση)
bsf INTCON, 4INTE - RB0 διακοπή ενεργοποίησης (1 = ενεργοποίηση)
Θα καθαρίσω τη σημαία διακοπής για κάθε περίπτωση (δεν εμπιστεύομαι ποτέ τίποτα!)
bcf INTCON, 1INTF - Διαγράψτε το bit σημαίας για κάθε περίπτωση

Αυτήν τη στιγμή πρέπει να δημιουργήσουμε τις 2 θύρες μας. Λάβετε υπόψη ότι καθώς τώρα χρησιμοποιούμε το RB0 ως pin διακοπής, αυτό πρέπει να καθοριστεί ως είσοδος:

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

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

Παρ 'όλα αυτά, θέλουμε απλώς να δείξουμε πόσες φορές ο διακόπτης κλείνει από 0 έως 9. Πάνω, ανέφερα ότι θα μπορούσαμε απλώς να αυξήσουμε την τιμή στο Port A κάθε φορά που υπάρχει διακοπή. Ωστόσο, το Port A έχει 5 bits, σε περίπτωση που αυξήσουμε απλώς τη θύρα, θα έχουμε τον υψηλότερο αριθμό 31. Υπάρχουν μερικές εξηγήσεις γιατί επέλεξα να μην προχωρήσω μέχρι το 31.

Αρχικά, θα χρησιμοποιήσουμε μια οθόνη 7 τμημάτων, η οποία θα μπορούσε το πολύ να κυμαίνεται από 0 έως 15 (0 έως F σε hex). Στη συνέχεια, θα ήθελα επιπλέον να σας δείξω μερικές από τις αριθμητικές εντολές που σκοντάψατε τα τελευταία μαθήματα.

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

Σε αυτό το σημείο καταλαβαίνουμε εάν η τιμή COUNT είναι 9 ή μεγαλύτερη. Αυτό που πρέπει να ολοκληρώσουμε τώρα είναι αν το COUNT είναι περισσότερο από 9, τοποθετήστε το πίσω στο 0, αλλιώς επιστρέψτε στο κύριο πρόγραμμα για να βεβαιωθείτε ότι είμαστε σε θέση να το παραδώσουμε στο Port A. Η εντολή BTFSS δεδομένου ότι καταλαβαίνετε ότι θα ακολουθήσει το επόμενο
οδηγίες σε περίπτωση που η σημαία μεταφοράς είναι προγραμματισμένη, δηλαδή COUNT = 10:

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

Κάθε φορά που ενεργοποιείτε τον διακόπτη, οι λυχνίες LED θα μετράνε δυαδικά από 0000 έως 1010 και μετά θα είναι 0000.

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

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

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




Προηγούμενο: Προγραμματιζόμενο αμφίδρομο κύκλωμα χρονοδιακόπτη κινητήρα Επόμενο: Πώς λειτουργούν τα κυκλώματα Buck-Boost