Περιγραφή
Ψηφιακοί ακροδέκτες με διακοπές
Η πρώτη παράμετρος του attachInterrupt είναι ο αριθμός της διακοπής. Κανονικά θα πρέπει να χρησιμοποιήσετε πρώτα την digitalPinToInterrupt (ακροδέκτης), έτσι ώστε αυτή να μεταφράσει τον πραγματικό ψηφιακό ακροδέκτη στον συγκεκριμένο αριθμό της διακοπής. Για παράδειγμα, εάν συνδέεστε στον ακροδέκτη 3, τότε χρησιμοποιήστε ως πρώτη παράμετρο στην attachInterrupt την digitalPinToInterrupt(3).
| Πλακέτα | Χρησιμοποιούμενοι ψηφιακοί ακροδέκτες των διακοπών |
| Uno, Nano, Mini και άλλοι βασιζόμενοι στο 328 | 2, 3 |
| Mega, Mega2560, MegaADK | 2, 3, 18, 19, 20, 21 |
| Micro, Leonardo και άλλοι βασιζόμενοι στο 32u4 | 0, 1, 2, 3, 7 |
| Zero | όλοι οι ψηφιακοί ακροδέκτες, εκτός από τον 4 |
| MKR1000 Rev.1 | 0, 1, 4, 5, 6, 7, 8, 9, A1, A2 |
| Due | όλοι οι ψηφιακοί ακροδέκτες |
Σημείωση
Η delay() δεν θα λειτουργήσει μέσα στην συνημμένη συνάρτηση και η επιστρεφόμενη τιμή από την millis(), δεν θα αυξάνεται. Τα εισερχόμενα σειριακά δεδομένα της συνάρτησης μπορεί να χαθούν. Θα πρέπει να δηλώσετε ως ασταθείς τις οποιεσδήποτε μεταβλητές που τροποποιείτε στην συνημμένη συνάρτηση. Για περισσότερες πληροφορίες, δείτε την παρακάτω ενότητα που αφορά τα ISRs.
Χρησιμοποίηση των διακοπών
Οι διακοπές είναι χρήσιμες για να κάνουν τα πράγματα να συμβαίνουν αυτόματα σε προγράμματα μικροελεγκτών και μπορούν να βοηθήσουν στην επίλυση των προβλημάτων χρονισμού. Οι καλύτεροι λόγοι της χρήσης μιας διακοπής, μπορεί να περιλαμβάνουν την ανάγνωση ενός περιστροφικού κωδικοποιητή ή την παρακολούθηση της εισόδου του χρήστη.
Αν θέλετε να διασφαλίσετε ότι ένα πρόγραμμα λαμβάνει πάντα τους παλμούς από έναν περιστροφικό κωδικοποιητή, έτσι ώστε αυτό να μην χάνει ποτέ έναν παλμό, θα είχε καταστεί πολύ δύσκολο να γραφεί ένα πρόγραμμα που θα κάνει οτιδήποτε άλλο, διότι το πρόγραμμα θα χρειαζόταν να ζητάει συνεχώς τις γραμμές του αισθητηρίου για τον κωδικοποιητή, προκειμένου να πιάσει τους παλμούς όταν αυτοί συμβαίνουν. Επίσης, τα άλλα αισθητήρια έχουν μια παρόμοια δυναμική διεπαφή, όπως για παράδειγμα η προσπάθεια της ανάγνωσης ενός αισθητηρίου ήχου που προσπαθεί να πιάσει ένα κλικ, ή ένα υπέρυθρο αισθητήριο υποδοχής όπως είναι ο διακόπτης της φωτογραφίας που προσπαθεί να πιάσει το πέσιμο του νομίσματος. Σε όλες αυτές τις περιπτώσεις, η χρησιμοποίηση της διακοπής μπορεί να απελευθερώσει τον μικροελεγκτή έτσι ώστε αυτός να αναλάβει κάποια άλλη εργασία, χωρίς να απουσιάζει η είσοδος.
Σχετικά με τις υπηρεσίες των ρουτινών διακοπής
Οι υπηρεσίες των ρουτινών διακοπής (ISRs), είναι είδη ειδικών συναρτήσεων που έχουν μερικούς μοναδικούς περιορισμούς που οι περισσότερες άλλες συναρτήσεις δεν έχουν. Μία υπηρεσία της ρουτίνας διακοπής (ISR), δεν μπορεί να έχει τις οποιεσδήποτε παραμέτρους και δεν θα πρέπει να επιστρέφει τίποτα.
Γενικά, μια ISR θα πρέπει να είναι όσο το δυνατόν σύντομη και γρήγορη. Εάν το πρόγραμμά σας χρησιμοποιεί πολλαπλές ISRs, τότε μόνο μια μπορεί να εκτελεστεί κάθε φορά, ενώ οι άλλες διακοπές θα εκτελεστούν μετά από το τελείωμα της εκτέλεσης της τρέχουσας διακοπής, σύμφωνα με την σειρά προτεραιότητας που έχουν. Η συνάρτηση millis(), βασίζεται στις διακοπές για να μετράει και γι ‘αυτό ποτέ δεν θα αυξηθεί εάν βρίσκεται μέσα σε μια ISR. Εφόσον η συνάρτηση delay() για να λειτουργήσει απαιτεί τις διακοπές, συνεπώς δεν θα λειτουργήσει εάν καλείται μέσα σε μια ISR. Αρχικά η συνάρτηση micros() θα λειτουργεί, όμως μετά από 1-2 ms θα αρχίσει να συμπεριφέρεται έχοντας αστάθεια. Η συνάρτηση delayMicroseconds() δεν χρησιμοποιεί κάποιον μετρητή και έτσι θα λειτουργεί κανονικά.
Συνήθως οι παγκόσμιες μεταβλητές χρησιμοποιούνται για να περαστούν τα δεδομένα μεταξύ μιας ISR και του κυρίως προγράμματος. Για να βεβαιωθείτε ότι οι μεταβλητές μοιράζονται και ενημερώνονται σωστά μεταξύ μιας ISR και του κυρίως προγράμματος, θα πρέπει να τις δηλώσετε ως ασταθή.
Σύνταξη
| attachInterrupt(digitalPinToInterrupt(pin), ISR, mode); | (συνίσταται) |
| attachInterrupt(διακοπή, ISR, mode); | (δεν συνίσταται) |
| attachInterrupt(ακροδέκτης, ISR, mode); | (δεν συνίσταται για το Arduino Due και το Zero και προτείνεται για το MKR1000) |
Παράμετροι
διακοπή: ο αριθμός της διακοπής (ακέραιος).
ακροδέκτης: ο αριθμός του ακροδέκτη (αφορά μόνο το Arduino Due, Zero και το MKR1000).
ISR: το κάλεσμα της ISR όταν συμβαίνει μια διακοπή. Αυτή η συνάρτηση δεν πρέπει να λαμβάνει καμία παράμετρο και συνεπώς δεν θα επιστρέφει τίποτα. Αυτή η συνάρτηση αναφέρεται μερικές φορές και ως υπηρεσία της ρουτίνας διακοπής.
mode: καθορίζει για το πότε πρέπει να ενεργοποιείται η διακοπή. Οι τέσσερις σταθερές με έγκυρες προκαθορισμένες τιμές είναι οι ακόλουθες:
- LOW (χαμηλή): η διακοπή προκαλείται κάθε φορά που ο ακροδέκτης βρίσκεται σε χαμηλή κατάσταση.
- CHANGE (αλλαγή): η διακοπή προκαλείται κάθε φορά που αλλάζει η τιμή του ακροδέκτη.
- RISING (αύξουσα): η διακοπή προκαλείται όταν ο ακροδέκτης πηγαίνει από την χαμηλή κατάσταση στην υψηλή κατάσταση.
- FALLING (φθίνουσα): η διακοπή προκαλείται όταν ο ακροδέκτης πηγαίνει από την υψηλή κατάσταση στην χαμηλή κατάσταση.
Επίσης η πλακέτα του Due επιτρέπει το εξής:
HIGH (υψηλή): η διακοπή προκαλείται κάθε φορά που ο ακροδέκτης βρίσκεται σε υψηλή κατάσταση. Όμως αυτό αφορά μόνο το Arduino Due, Zero και το MKR1000.
Επιστρέφει
Τίποτα
Παράδειγμα
const byte ledPin = 13;
const byte interruptPin = 2;
volatile byte state = LOW;
void setup() {
pinMode(ledPin, OUTPUT);
pinMode(interruptPin, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(interruptPin), blink, CHANGE);
}
void loop() {
digitalWrite(ledPin, state);
}
void blink() {
state = !state;
}
Αριθμοί διακοπών
Κανονικά θα πρέπει να χρησιμοποιήσετε την συνάρτηση digitalPinToInterrupt(ακροδέκτης), από το να τοποθετήσετε έναν αριθμό διακοπής απευθείας στο πρόγραμμά σας. Οι ειδικοί ακροδέκτες με τις διακοπές καθώς και οι χαρτογραφημένοι αριθμοί των διακοπών, διαφέρουν σε κάθε τύπο πλακέτας. Η απευθείας χρήση των αριθμών διακοπής μπορεί να φαίνεται απλή υπόθεση, αλλά μπορεί να προκαλέσει προβλήματα συμβατότητας, όταν το πρόγραμμά σας τρέχει σε μια διαφορετική πλακέτα.
Ωστόσο, τα παλιότερα προγράμματα συχνά έχουν έτοιμους τους άμεσους αριθμούς των διακοπών. Οι αριθμοί που χρησιμοποιούνταν συχνά ήταν το 0 (για τον ψηφιακό ακροδέκτη 2) ή το 1 (για τον ψηφιακό ακροδέκτη 3). Ο παρακάτω πίνακας απεικονίζει τους διαθέσιμους ακροδέκτες των διακοπών για διαφόρων ειδών πλακέτες.
| Πλακέτα | Διακοπή 0 | Διακοπή 1 | Διακοπή 2 | Διακοπή 3 | Διακοπή 4 | Διακοπή 5 |
| Uno, Ethernet | 2 | 3 | ||||
| Mega2560 | 2 | 3 | 21 | 20 | 19 | 18 |
| βασιζόμενο στο 32u4 (π.χ. Leonardo, Micro) | 3 | 2 | 0 | 1 | 7 |
|
| Due, Zero | (δείτε παρακάτω) | |||||
Η πλακέτα Due του Arduino, διαθέτει ισχυρές δυνατότητες των διακοπών και έτσι σας επιτρέπει να συνδέσετε μια συνάρτηση διακοπής σε όλους τους διαθέσιμους ακροδέκτες. Μπορείτε να καθορίσετε άμεσα τον αριθμό του ακροδέκτη μέσα στην συνάρτηση attachInterrupt().
Η πλακέτα Zero του Arduino, σας επιτρέπει να συνδέσετε μια συνάρτηση διακοπής σε όλους τους διαθέσιμους ακροδέκτες εκτός από τον ακροδέκτη 4. Μπορείτε να καθορίσετε άμεσα τον αριθμό του ακροδέκτη μέσα στην συνάρτηση attachInterrupt().
Επιστροφή στην σελίδα Παραπομπές Γλώσσας
