- Τύποι διακοπών
- Διακοπές στο Arduino
- Χρησιμοποιώντας Διακοπές στο Arduino
- Απαιτούμενα στοιχεία
- Διάγραμμα κυκλώματος
- Προγραμματισμός διακοπής Arduino
- Επίδειξη διακοπής Arduino
Σκεφτείτε ένα γρήγορα κινούμενο αυτοκίνητο, εάν ξαφνικά χτυπηθεί από άλλο αυτοκίνητο σε αντίθετη κατεύθυνση, το πρώτο πράγμα που συμβαίνει είναι ότι, ο αισθητήρας επιταχυνσιόμετρου που υπάρχει στο αυτοκίνητο ανιχνεύει μια ξαφνική απο-επιτάχυνση και ενεργοποιεί μια εξωτερική διακοπή του μικροελεγκτή που υπάρχει στο το αυτοκίνητο. Στη συνέχεια, βάσει αυτής της διακοπής, ο μικροελεγκτής παράγει ένα ηλεκτρικό σήμα για άμεση ανάπτυξη των αερόσακων. Οι μικροελεγκτές που υπάρχουν στο αυτοκίνητο παρακολουθούν πολλά πράγματα ταυτόχρονα, όπως η ανίχνευση της ταχύτητας του αυτοκινήτου, ο έλεγχος άλλων αισθητήρων, ο έλεγχος της θερμοκρασίας του κλιματιστικού κ.λπ. Τι γίνεται λοιπόν ένα ξαφνικό άνοιγμα ενός αερόσακου σε δευτερόλεπτα; Η απάντηση είναι διακοπές, ένα σήμα διακοπής χρησιμοποιείται εδώ που έχει την υψηλότερη προτεραιότητα από όλα.
Ένα άλλο απλό παράδειγμα των διακοπών είναι τα κινητά τηλέφωνα με οθόνη αφής που έχουν την υψηλότερη προτεραιότητα στην έννοια «Touch». Σχεδόν κάθε ηλεκτρονική συσκευή έχει κάποιο είδος διακοπής για να «διακόψει» την κανονική διαδικασία και να κάνει κάποια πράγματα υψηλότερης προτεραιότητας σε ένα συγκεκριμένο συμβάν. Η τακτική διαδικασία συνεχίζεται μετά την υπηρεσία του Interrupt.
Έτσι τεχνικά, το Interrupts είναι ένας μηχανισμός με τον οποίο ένα I / O ή μια εντολή μπορεί να αναστείλει την κανονική εκτέλεση του επεξεργαστή και να εξυπηρετηθεί όπως έχει υψηλότερη προτεραιότητα. Για παράδειγμα, ένας επεξεργαστής που εκτελεί κανονική εκτέλεση μπορεί να διακοπεί από κάποιον αισθητήρα για να εκτελέσει μια συγκεκριμένη διαδικασία που υπάρχει στο ISR (Interrupt Service Routine). Μετά την εκτέλεση του επεξεργαστή ISR μπορεί και πάλι να συνεχίσει την κανονική εκτέλεση.
Τύποι διακοπών
Υπάρχουν δύο τύποι διακοπών:
Διακοπή υλικού: Συμβαίνει όταν συμβαίνει εξωτερικό συμβάν όπως ένας εξωτερικός πείρος διακοπής αλλάζει την κατάστασή του από LOW σε HIGH ή HIGH σε LOW.
Διακοπή λογισμικού: Συμβαίνει σύμφωνα με τις οδηγίες του λογισμικού. Για παράδειγμα, οι διακοπές χρονισμού είναι διακοπή λογισμικού.
Διακοπές στο Arduino
Τώρα θα δούμε πώς να χρησιμοποιούμε διακοπές στο Arduino Board. Έχει δύο τύπους διακοπών:
- Εξωτερική διακοπή
- Αλλαγή καρφίτσας διακοπής
Εξωτερική διακοπή:
Αυτές οι διακοπές ερμηνεύονται από υλικό και είναι πολύ γρήγορες. Αυτές οι διακοπές μπορούν να ρυθμιστούν ώστε να ενεργοποιούνται σε περίπτωση αύξησης ή πτώσης ή χαμηλότερου επιπέδου.
Διοικητικό Συμβούλιο Arduino |
Εξωτερικές καρφίτσες διακοπής: |
UNO, ΝΑΝΟ |
2,3 |
Μέγα |
2,3,18,19,20,21 |
Διακοπές αλλαγής καρφιτσών:
Το Arduinos μπορεί να έχει περισσότερες καρφίτσες διακοπής με τη χρήση διακοπών αλλαγής pin. Σε πίνακες Arduino που βασίζονται στο ATmega168 / 328, οι ακίδες ή και οι 20 ακίδες μπορούν να χρησιμοποιηθούν ως ακροδέκτες διακοπής. Μπορούν επίσης να ενεργοποιηθούν χρησιμοποιώντας RISING ή FALLING άκρα.
Χρησιμοποιώντας Διακοπές στο Arduino
Προκειμένου να χρησιμοποιηθούν διακοπές στο Arduino, πρέπει να γίνουν κατανοητές οι ακόλουθες έννοιες.
Ρουτίνα διακοπής υπηρεσίας (ISR)
Η υπηρεσία ρουτίνας διακοπής ή ένας χειριστής διακοπής είναι ένα συμβάν που περιέχει ένα μικρό σύνολο οδηγιών σε αυτό. Όταν συμβαίνει εξωτερική διακοπή, ο επεξεργαστής εκτελεί πρώτα αυτόν τον κώδικα που υπάρχει στο ISR και επιστρέφει στην κατάσταση όπου άφησε την κανονική εκτέλεση.
Η ISR έχει την ακόλουθη σύνταξη στο Arduino:
attachInterrupt (digitalPinToInterrupt (pin), ISR, λειτουργία);
digitalPinToInterrupt (pin): Στο Arduino Uno, NANO οι ακίδες που χρησιμοποιούνται για διακοπή είναι 2,3 & σε mega 2,3,18,19,20,21. Καθορίστε εδώ τον ακροδέκτη εισόδου που χρησιμοποιείται για εξωτερική διακοπή.
ISR: Είναι μια λειτουργία που καλείται όταν γίνεται εξωτερική διακοπή.
Λειτουργία: Τύπος μετάβασης για ενεργοποίηση, π.χ. πτώση, άνοδο κ.λπ.
- RISING: Για να προκαλέσει διακοπή όταν ο πείρος διέρχεται από LOW σε HIGH.
- ΚΑΤΑΡΓΗΣΗ: Για να ενεργοποιήσετε μια διακοπή όταν ο πείρος διέρχεται από ΥΨΗΛΟ σε ΧΑΜΗΛΟ.
- ΑΛΛΑΓΗ: Για να ενεργοποιήσετε μια διακοπή όταν ο πείρος διέρχεται από LOW σε HIGH ή HIGH σε LOW (δηλαδή, όταν αλλάζει η κατάσταση του πείρου).
Ορισμένες συνθήκες κατά τη χρήση του Interrupt
- Η λειτουργία ρουτίνας υπηρεσίας διακοπής (ISR) πρέπει να είναι όσο το δυνατόν συντομότερη.
- Η λειτουργία καθυστέρησης () δεν λειτουργεί εντός του ISR και πρέπει να αποφεύγεται.
Σε αυτό το σεμινάριο Arduino Interrupt, ένας αριθμός αυξάνεται από το 0 και χρησιμοποιούνται δύο κουμπιά για την ενεργοποίηση του Interrupt, το καθένα συνδέεται με το D2 & D3. Ένα LED χρησιμοποιείται για να υποδείξει τη διακοπή. Εάν πατηθεί ένα πλήκτρο, η λυχνία ανάβει και η οθόνη δείχνει διακοπή2 και σβήνει και όταν πατηθεί άλλο κουμπί, η λυχνία σβήνει και η οθόνη δείχνει διακοπή1 και σβήνει.
Απαιτούμενα στοιχεία
- Arduino Board (Σε αυτό το σεμινάριο χρησιμοποιείται το Arduino NANO)
- Πιέστε το κουμπί - 2
- LED - 1
- Αντίσταση (10K) - 2
- LCD (16x2) - 1
- Πίνακας ψωμιού
- Σύνδεση καλωδίων
Διάγραμμα κυκλώματος
Σύνδεση κυκλώματος μεταξύ Arduino Nano και οθόνης LCD 16x2:
οθόνη υγρού κρυστάλλου |
Arduino Nano |
VSS |
GND |
VDD |
+ 5V |
V0 |
Στο κέντρο ποτενσιόμετρου PIN Για τον έλεγχο της αντίθεσης της οθόνης LCD |
RS |
Δ7 |
RW |
GND |
μι |
Δ8 |
Δ4 |
Δ9 |
Δ5 |
Δ10 |
Δ6 |
Δ11 |
Δ7 |
Δ12 |
ΕΝΑ |
+ 5V |
κ |
GND |
Δύο κουμπιά συνδέονται στο Arduino Nano στον ακροδέκτη D2 & D3. Χρησιμοποιούνται για τη χρήση δύο εξωτερικών διακοπών, το ένα για να ανάψετε το LED και το άλλο για να σβήσετε ένα LED. Κάθε κουμπί έχει μια αντίσταση προς τα κάτω 10k συνδεδεμένη με τη γείωση. Έτσι, όταν πατηθεί το κουμπί είναι λογική HIGH (1) και όταν δεν πατηθεί είναι λογική LOW (0). Η αντίσταση τραβήγματος προς τα κάτω είναι υποχρεωτική, διαφορετικά θα υπάρχουν κυμαινόμενες τιμές στον ακροδέκτη εισόδου D2 & D3.
Μια λυχνία LED χρησιμοποιείται επίσης για να δείξει ότι έχει ενεργοποιηθεί μια διακοπή ή έχει πατηθεί ένα κουμπί.
Προγραμματισμός διακοπής Arduino
Σε αυτό το σεμινάριο ένας αριθμός αυξάνεται από το 0 που εμφανίζεται συνεχώς σε (16x2) LCD που είναι συνδεδεμένη στο Arduino Nano, κάθε φορά που πατάτε το αριστερό κουμπί (pin pin D3) το LED ανάβει και η οθόνη δείχνει Interrupt2 και όταν το δεξί κουμπί (ο διακόπτης διακοπής D2) πιέζεται το LED σβήνει και η οθόνη δείχνει Interrupt1.
Ο πλήρης κώδικας με ένα βίντεο εργασίας δίνεται στο τέλος αυτού του σεμιναρίου.
1. Πρώτα περιλαμβάνεται το αρχείο κεφαλίδας για την οθόνη LCD και στη συνέχεια ορίζονται οι ακίδες LCD που χρησιμοποιούνται για τη σύνδεση με το Arduino Nano.
#περιλαμβάνω
2. Μέσα στη λειτουργία κενής ρύθμισης (), εμφανίστε πρώτα κάποιο εισαγωγικό μήνυμα στην οθόνη LCD. Μάθετε περισσότερα σχετικά με τη διασύνδεση της οθόνης LCD με το Arduino εδώ.
lcd.begin (16,2); lcd.setCursor (0,0); lcd.print ("CIRCUIT DIGEST"); lcd.setCursor (0,1); lcd.print ("ArduinoInterrupt"); καθυστέρηση (3000) lcd.clear ();
3. Στη συνέχεια, στην ίδια λειτουργία κενής ρύθμισης () πρέπει να καθοριστούν οι ακίδες εισόδου και εξόδου. Ο πείρος D13 είναι συνδεδεμένος με την άνοδο των LED, οπότε αυτός ο πείρος πρέπει να οριστεί ως έξοδος.
pinMode (13, ΕΞΟΔΟΣ);
4. Τώρα το κύριο σημαντικό μέρος του προγραμματισμού έρχεται να είναι η συνάρτηση attachInterrupt (), περιλαμβάνεται επίσης στην κενή ρύθμιση ().
attachInterrupt (digitalPinToInterrupt (2), buttonPressed1, RISING); attachInterrupt (digitalPinToInterrupt (3), κουμπίΠατήστε2, RISING);
Εδώ διευκρινίζεται ότι ο ακροδέκτης 2 προορίζεται για εξωτερική διακοπή και η συνάρτηση buttonPressed1 καλείται όταν υπάρχει RISING (LOW to HIGH) στην καρφίτσα D2. Και ο ακροδέκτης 3 είναι επίσης για εξωτερική διακοπή και καλείται η λειτουργία Pressed2 όταν υπάρχει RISING στο D3 pin.
5. Μέσα στον κενό βρόχο (), ένας αριθμός (i) αυξάνεται από το μηδέν και εκτυπώνεται σε LCD (16x2).
lcd.clear (); lcd.print ("COUNTER:"); lcd.print (i); ++ i; καθυστέρηση (1000)
Στο ίδιο κενό βρόχο (), το digitalWrite () χρησιμοποιείται στον πείρο D13 όπου είναι συνδεδεμένη η άνοδος των LED. Ανάλογα με την τιμή της μεταβλητής εξόδου, το LED θα ανάψει ή θα σβήσει
digitalWrite (13, έξοδος);
6. Το πιο σημαντικό μέρος είναι η δημιουργία μιας συνάρτησης χειριστή διακοπής σύμφωνα με το όνομα που χρησιμοποιείται στη συνάρτηση attachInterrupt () .
Καθώς χρησιμοποιούνται δύο ακροδέκτες διακοπής 2 και 3, έτσι απαιτούνται δύο ISR. Εδώ σε αυτόν τον προγραμματισμό χρησιμοποιούνται τα ακόλουθα ISR
Πιέζεται κουμπί1 ():
κουμπί κενούΠαρεμπιεσμένο1 () { έξοδος = ΧΑΜΗΛΟ; lcd.setCursor (0,1); lcd.print ("Διακοπή 1"); }
Αυτή η λειτουργία εκτελείται όταν πατηθεί το κουμπί στον πείρο D2 (RISING EDGE). Αυτή η λειτουργία αλλάζει την κατάσταση της εξόδου σε ΧΑΜΗΛΗ προκαλώντας σβήσιμο της λυχνίας LED και εκτυπώνει το "interrupt1" στην οθόνη LCD.
Πιέζεται κουμπί2 ():
κουμπί άκυρου Πατημένο2 () {έξοδος = ΥΨΗΛΟ; lcd.setCursor (0,1); lcd.print ("Interrupt2"); }
Αυτή η λειτουργία εκτελείται όταν πατηθεί το κουμπί ώθησης στον πείρο D3. Αυτή η λειτουργία αλλάζει την κατάσταση της εξόδου σε ΥΨΗΛΗ προκαλώντας την ενεργοποίηση της λυχνίας LED και εκτυπώνει το "interrupt2" στην οθόνη LCD.
Επίδειξη διακοπής Arduino
1. Όταν πιέζετε το πλήκτρο PUSH στην αριστερή πλευρά, η λυχνία LED ανάβει και η οθόνη LCD εμφανίζει Interrupt2.
2. Όταν πατηθεί το κουμπί ΠΙΝΑΚΑΣ στη δεξιά πλευρά, η λυχνία LED σβήνει και η οθόνη LCD εμφανίζει διακοπή1
Αυτός είναι ο τρόπος με τον οποίο μια Διακοπή μπορεί να είναι χρήσιμη για την ενεργοποίηση οποιασδήποτε σημαντικής εργασίας μεταξύ της κανονικής εκτέλεσης.