- Απαιτούμενα υλικά:
- Τι είναι οι διακοπές και πού να τις χρησιμοποιήσετε:
- Διάγραμμα κυκλώματος και επεξήγηση:
- Προσομοίωση διακοπών στο μικροελεγκτή PIC:
- Επεξήγηση κώδικα:
- Λειτουργία των διακοπών PIC16F877A:
Σε αυτό το σεμινάριο θα μάθουμε πώς να χρησιμοποιούμε μια Εξωτερική Διακοπή στον Μικροελεγκτή PIC και γιατί / πού θα τα χρειαζόμαστε. Αυτό είναι ένα μέρος της ακολουθίας των μαθημάτων PIC στα οποία ξεκινήσαμε να μαθαίνουμε PIC Microcontrollers από το μηδέν. Ως εκ τούτου, αυτό το σεμινάριο προϋποθέτει ότι είστε εξοικειωμένοι με τον τρόπο προγραμματισμού ενός PIC MCU χρησιμοποιώντας το MPLABX και τον τρόπο διασύνδεσης μιας οθόνης LCD με PIC. Εάν όχι, επιστρέψτε στους αντίστοιχους συνδέσμους τους και διαβάστε τους μέσω, γιατί θα παραλείψω τις περισσότερες από τις πληροφορίες που είχαν ήδη καλυφθεί εκεί.
Απαιτούμενα υλικά:
- PIC16F877A Διοικητικό Συμβούλιο
- Οθόνη LCD 16x2
- Πλήκτρο
- Σύνδεση καλωδίων
- Πίνακας ψωμιού
- PicKit 3
Τι είναι οι διακοπές και πού να τις χρησιμοποιήσετε:
Πριν μπείτε στον τρόπο προγραμματισμού των διακοπών μικροελεγκτή PIC, ας καταλάβουμε τι είναι πραγματικά μια Διακοπή και πού θα χρειαζόμασταν να τις χρησιμοποιήσουμε. Επιπλέον, υπάρχουν πολλοί τύποι διακοπών στον Μικροελεγκτή και το PIC16F877A έχει περίπου 15 από αυτά. Ας μην τα συγχέουμε όλα στο μυαλό μας προς το παρόν.
Ετσι! τι είναι μια διακοπή στους μικροελεγκτές;
Όπως όλοι γνωρίζουμε, οι μικροελεγκτές χρησιμοποιούνται για την εκτέλεση ενός συνόλου προκαθορισμένων (προγραμματισμένων) ενεργοποιήσεων που ενεργοποιούν τις απαραίτητες εξόδους με βάση την είσοδο. Όμως, ενώ ο Μικροελεγκτής σας είναι απασχολημένος με την εκτέλεση ενός τεμαχίου κώδικα, ενδέχεται να υπάρχει κατάσταση έκτακτης ανάγκης όπου άλλο κομμάτι του κώδικα σας χρειάζεται άμεση προσοχή. Αυτό το άλλο κομμάτι κώδικα που χρειάζεται άμεση προσοχή πρέπει να αντιμετωπίζεται ως διακοπή.
Για παράδειγμα: Ας υποθέσουμε ότι παίζετε το αγαπημένο σας παιχνίδι στο κινητό σας και ότι ο ελεγκτής (υπόθεση) μέσα στο τηλέφωνό σας είναι απασχολημένος ρίχνοντας όλα τα γραφικά που χρειάζεστε για να απολαύσετε το παιχνίδι. Όμως, ξαφνικά η φίλη σου καλεί τον αριθμό σου. Τώρα, το χειρότερο πράγμα που συμβαίνει είναι ο ελεγκτής κινητών τηλεφώνων σας να παραβλέψετε την κλήση των φίλων σας, καθώς είστε απασχολημένοι παίζοντας ένα παιχνίδι. Για να αποτρέψουμε αυτόν τον εφιάλτη να συμβεί, χρησιμοποιούμε κάτι που ονομάζεται διακοπή.
Αυτές οι διακοπές θα είναι πάντα ενεργή λίστα για να πραγματοποιηθούν ορισμένες συγκεκριμένες ενέργειες και όταν συμβαίνουν εκτελούν ένα κομμάτι κώδικα και στη συνέχεια επιστρέφουν στην κανονική λειτουργία. Αυτό το κομμάτι κώδικα ονομάζεται ρουτίνα διακοπής υπηρεσίας (ISR). Ένα πρακτικό έργο στο οποίο η διακοπή είναι υποχρεωτική είναι "Ψηφιακό ταχύμετρο και κύκλωμα οδομέτρου με χρήση μικροελεγκτή PIC"
Στους μικροελεγκτές υπάρχουν δύο βασικοί τύποι διακοπών. Πρόκειται για εξωτερική διακοπή και εσωτερική διακοπή. Οι εσωτερικές διακοπές πραγματοποιούνται εντός του Μικροελεγκτή για την εκτέλεση μιας εργασίας, για παράδειγμα Διακοπές χρονοδιακόπτη, Διακοπές ADC κ.λπ. Αυτές οι διακοπές ενεργοποιούνται από το λογισμικό για την ολοκλήρωση της λειτουργίας Χρονοδιακόπτη ή ADC αντίστοιχα.
Η εξωτερική διακοπή είναι αυτή που μπορεί να ενεργοποιηθεί από τον χρήστη. Σε αυτό το πρόγραμμα θα μάθουμε πώς να χρησιμοποιούμε μια εξωτερική διακοπή χρησιμοποιώντας ένα κουμπί για να ενεργοποιήσουμε μια διακοπή. Θα χρησιμοποιήσουμε μια οθόνη LCD για να εμφανίσουμε αριθμούς που αυξάνονται από 0 έως 1000 και όταν ενεργοποιείται μια διακοπή, πρέπει να το ενημερώσουμε από το Interrupt Service Routine ISR και στη συνέχεια να συνεχίσουμε να αυξάνουμε τους αριθμούς.
Διάγραμμα κυκλώματος και επεξήγηση:
Το διάγραμμα κυκλώματος για τη χρήση διακοπών PIC16F877 δίνεται στην παραπάνω εικόνα. Απλά πρέπει να συνδέσετε την οθόνη LCD με το PIC, όπως κάναμε στο σεμινάριο διασύνδεσης LCD.
Τώρα για να συνδέσετε τον πείρο διακοπής, πρέπει να κοιτάξουμε το φύλλο δεδομένων για να μάθουμε ποιος πείρος του PIC χρησιμοποιείται για Εξωτερική διακοπή. Στην περίπτωσή μας i n PIC16F877A το 33 rd πείρος RBO / INT χρησιμοποιείται για εξωτερική διακοπή. Δεν μπορείτε να χρησιμοποιήσετε άλλη καρφίτσα εκτός από αυτήν την καρφίτσα. Η σύνδεση Pin για αυτό το διάγραμμα κυκλώματος φαίνεται στον παρακάτω πίνακα.
S.No: |
Αριθμός Pin |
Όνομα καρφιτσώματος |
Συνδεδεμένος με |
1 |
21 |
RD2 |
RS LCD |
2 |
22 |
RD3 |
Ε της LCD |
3 |
27 |
RD4 |
D4 της LCD |
4 |
28 |
RD5 |
D5 της οθόνης LCD |
5 |
29 |
RD6 |
D6 της οθόνης LCD |
6 |
30 |
RD7 |
D7 της οθόνης LCD |
7 |
33 |
RBO / INT |
Πιέστε το κουμπί |
Έχουμε ενεργοποιήσει τις εσωτερικές αντιστάσεις έλξης στο PORT B, επομένως μπορούμε να συνδέσουμε απευθείας τον πείρο RB0 στη γείωση μέσω ενός κουμπιού Push. Έτσι, κάθε φορά που αυτή η καρφίτσα είναι χαμηλή, θα ενεργοποιείται μια διακοπή.
Οι συνδέσεις μπορούν να γίνουν σε έναν πίνακα ψωμιού όπως φαίνεται παρακάτω.
Αν ακολουθήσατε τα σεμινάρια μας, θα πρέπει να εξοικειωθείτε με αυτό το Perf Board που έχω χρησιμοποιήσει εδώ. Εάν όχι, δεν χρειάζεται να το σκέφτεστε απλώς, απλώς ακολουθήστε το διάγραμμα κυκλώματος και θα λειτουργήσετε τα πράγματα.
Προσομοίωση διακοπών στο μικροελεγκτή PIC:
Η Προσομοίωση για αυτό το έργο γίνεται με χρήση του Proteus.
Όταν προσομοιώνετε το έργο, θα πρέπει να δείτε μια σειρά από αριθμούς που αυξάνονται στην οθόνη LCD. Αυτό συμβαίνει μέσα στον κύριο βρόχο και όποτε πατηθεί το κουμπί ώθησης, η οθόνη LCD θα πρέπει να εμφανίζει ότι έχει εισέλθει στο ISR. Μπορείτε να κάνετε τις τροποποιήσεις σας στον κώδικα και να δοκιμάσετε να τον δοκιμάσετε εδώ.
Επεξήγηση κώδικα:
Ο πλήρης κωδικός για αυτό το έργο βρίσκεται στο τέλος αυτού του σεμιναρίου. Ωστόσο, το πρόγραμμα χωρίζεται σε σημαντικά κομμάτια και εξηγείται παρακάτω για την καλύτερη κατανόησή σας.
Όπως όλα τα προγράμματα, πρέπει να ξεκινήσουμε τον κώδικα καθορίζοντας τη διαμόρφωση των ακίδων για τις καρφίτσες που χρησιμοποιούμε στο πρόγραμμά μας. Επίσης εδώ πρέπει να ορίσουμε ότι χρησιμοποιούμε RB0 / INT ως εξωτερικό πείρο διακοπής και όχι ως πείρο εισόδου ή εξόδου. Η κάτω γραμμή κώδικα επιτρέπει την εσωτερική pull-up αντίσταση στην PORTB κάνοντας την 7 Th bit ως 0.
OPTION_REG = 0b00000000;
Στη συνέχεια, ενεργοποιούμε τις καθολικές / περιφερειακές διακοπές και δηλώνουμε ότι χρησιμοποιούμε το RB0 ως εξωτερικό pin διακοπής.
GIE = 1; // Ενεργοποίηση καθολικής διακοπής PEIE = 1; // Ενεργοποιήστε την Περιφερειακή Διακοπή INTE = 1; // Ενεργοποιήστε το RB0 ως εξωτερικό πείρο διακοπής
Μόλις ο πείρος RB0 οριστεί ως εξωτερικός πείρος διακοπής, κάθε φορά που πέφτει χαμηλή, η εξωτερική σημαία διακοπής INTF θα γίνει 1 και ο κώδικας μέσα στη λειτουργία διακοπής κενού θα εκτελεστεί από την κλήση της ρουτίνας διακοπής υπηρεσίας (ISR).
void interrupt ISR_example () {if (INTF == 1) // Εντοπίστηκε εξωτερική διακοπή {Lcd_Clear (); Lcd_Set_Cursor (1,1); Lcd_Print_String ("Εισαχθεί ISR"); INTF = 0; // διαγράψτε τη σημαία διακοπής αφού τελειώσετε με αυτήν __delay_ms (2000). Lcd_Clear (); }}
Όπως βλέπετε, ονόμασα τη λειτουργία διακοπής ως δείγμα ISR_. Μπορείτε να το ονομάσετε σύμφωνα με την επιθυμία σας. Μέσα στη συνάρτηση διακοπής θα ελέγξουμε εάν η σημαία INTF είναι υψηλή και εκτελεί τις απαραίτητες ενέργειες. Είναι πολύ σημαντικό να καθαρίσετε τη σημαία διακοπής μόλις τελειώσετε με τη ρουτίνα. Μόνο τότε το πρόγραμμα θα επιστρέψει στην κενή λειτουργία. Αυτή η εκκαθάριση πρέπει να γίνει από λογισμικό χρησιμοποιώντας τη γραμμή
INTF = 0; // διαγράψτε τη σημαία διακοπής αφού τελειώσετε με αυτήν
Μέσα στην κύρια λειτουργία, αυξάνουμε έναν αριθμό για κάθε 500 ms και τον εμφανίζουμε στην οθόνη LCD. Δεν έχουμε συγκεκριμένη γραμμή για να ελέγξουμε την κατάσταση του πείρου RB0. Η διακοπή θα παραμείνει πάντα ενεργή και όποτε πατηθεί το κουμπί θα βγει από το κεντρικό κεντρικό σημείο και θα εκτελέσει τις γραμμές στο ISR.
Lcd_Set_Cursor (2,1); Lcd_Print_String ("Μέσα στον κύριο βρόχο"); Lcd_Set_Cursor (1,1); Lcd_Print_String ("Αριθμός:"); Lcd_Print_Char (ch1 + '0'); Lcd_Print_Char (ch2 + '0'); Lcd_Print_Char (ch3 + '0'); Lcd_Print_Char (ch4 + '0'); __delay_ms (500); αριθμός ++;
Λειτουργία των διακοπών PIC16F877A:
Μόλις καταλάβετε πώς λειτουργεί η διακοπή, μπορείτε να το δοκιμάσετε στο υλικό και να το παίξετε. Αυτό το πρόγραμμα που δίνεται εδώ είναι ένα πολύ βασικό παράδειγμα εξωτερικής διακοπής όπου αλλάζει απλώς την οθόνη της οθόνης LCD όταν εντοπίζεται μια διακοπή.
Η πλήρης εργασία του έργου μπορεί να βρεθεί στο παρακάτω βίντεο. Ελπίζω να καταλάβατε για τις διακοπές και πού / πώς να τα χρησιμοποιήσετε. Εάν έχετε αμφιβολίες, μπορείτε να επικοινωνήσετε μαζί μου μέσω των φόρουμ ή μέσω της ενότητας σχολίων.