- Γιατί χρειαζόμαστε διακοπή;
- Τύποι διακοπής στο MSP430
- Διακοπή ελέγχου προγράμματος στο MSP430
- Κύκλωμα MSP430 για έλεγχο διακοπής GPIO
- Προγραμματισμός MSP430 για Διακοπές
- Μεταφόρτωση προγράμματος στο MSP430 από το CCS
- Πρόγραμμα διακοπής στο MSP430
Σκεφτείτε ένα απλό ψηφιακό ρολόι που έχει προγραμματιστεί για να σας δείξει μόνο χρόνο, τώρα φανταστείτε ότι θέλετε να αλλάξετε τη ζώνη ώρας του. Τι θα έκανες? Απλώς πατάτε ένα κουμπί που αλλάζει στο μενού που σας επιτρέπει να αλλάξετε τη ζώνη ώρας. Εδώ, το σύστημα δεν μπορεί να προβλέψει την εξωτερική σας διακοπή στις διαδικασίες διατήρησης του χρόνου και δεν μπορεί να σας ζητήσει να περιμένετε, καθώς είναι απασχολημένο με την αύξηση της τιμής των δευτερολέπτων στο ρολόι σας. Εδώ είναι που οι διακοπές διακόπτονται.
Οι διακοπές δεν πρέπει πάντα να είναι εξωτερικές. μπορεί να είναι και εσωτερικό. Τις περισσότερες φορές σε μια ενσωματωμένη διακοπή διευκολύνει επίσης την επικοινωνία μεταξύ δύο περιφερειακών της CPU. Θεωρήστε ότι έχει ρυθμιστεί ξανά ένα προκαθορισμένο χρονόμετρο και ενεργοποιείται μια διακοπή όταν ο χρόνος φτάσει στην τιμή στον καταχωρητή χρονοδιακόπτη. Ο χειριστής διακοπής μπορεί να χρησιμοποιηθεί για την έναρξη των άλλων περιφερειακών όπως το DMA.
Σε αυτό το σεμινάριο, χρησιμοποιήσαμε τις εξωτερικές διακοπές στο MSP430 για εναλλαγή διαφορετικών LED. Όταν μια εξωτερική διακοπή δίνεται από την αλλαγή κατάστασης χρησιμοποιώντας ένα μπουτόν, το στοιχείο ελέγχου μεταφέρεται (προεγκατεστημένο) στο ISR και κάνει το απαραίτητο. Για να μάθετε τα βασικά στοιχεία όπως η ρύθμιση περιβάλλοντος CCS για το Launchpad MSP430G2, ακολουθήστε αυτόν τον σύνδεσμο ξεκινώντας με το MSP430 χρησιμοποιώντας το CCS επειδή δεν θα λάβουμε λεπτομέρειες σχετικά με αυτό σε αυτό το σεμινάριο. Ελέγξτε επίσης άλλα σεμινάρια που βασίζονται στο MSP430 χρησιμοποιώντας το Energia IDE και το CCS ακολουθώντας τον σύνδεσμο.
Γιατί χρειαζόμαστε διακοπή;
Απαιτούνται διακοπές για να αποθηκεύσετε την ψηφοφορία γενικά σε ένα ενσωματωμένο σύστημα. Καλούνται όταν τα καθήκοντα με υψηλότερη προτεραιότητα πρέπει να εκτελεστούν με την προαίρεση της τρέχουσας εργασίας που εκτελείται. Μπορεί επίσης να χρησιμοποιηθεί για την αφύπνιση της CPU από λειτουργίες χαμηλής ισχύος. Όταν αφυπνίζεται από την έξοδο εξωτερικού σήματος μέσω θύρας GPIO, το ISR εκτελείται και η CPU επιστρέφει ξανά στη Λειτουργία Χαμηλής Ισχύος.
Τύποι διακοπής στο MSP430
Οι διακοπές στο MSP430 εμπίπτουν στους ακόλουθους τύπους:
- Επαναφορά συστήματος
- Διακοπή χωρίς μάσκα
- Διακοπή με δυνατότητα κάλυψης
- Διακοπές με διανύσματα και χωρίς διανύσματα
Επαναφορά συστήματος:
Μπορεί να συμβεί λόγω τάσης τροφοδοσίας (Vcc) και λόγω χαμηλού σήματος στον ακροδέκτη RST / NMI με επιλεγμένη τη λειτουργία επαναφοράς και μπορεί επίσης να συμβεί για λόγους όπως υπερχείλιση χρονοδιακόπτη παρακολούθησης και παραβίαση κλειδιού ασφαλείας.
Διακοπή χωρίς μάσκα:
Αυτές οι διακοπές δεν μπορούν να καλυφθούν από τις οδηγίες της CPU. Μόλις ενεργοποιηθεί η Γενική Διακοπή, η διακοπή χωρίς μάσκα δεν μπορεί να εκτραπεί από την επεξεργασία. Αυτό δημιουργείται από πηγές όπως σφάλματα Oscillator και ένα πλεονέκτημα που δίνεται χειροκίνητα στο RST / NMI (σε λειτουργία NMI).
Διακοπή με δυνατότητα κάλυψης:
Όταν συμβεί διακοπή και εάν μπορεί να καλυφθεί με εντολή CPU, τότε είναι Διακοπή μασκαρίσματος. Δεν χρειάζεται να είναι πάντα εξωτερικοί. Εξαρτώνται επίσης από περιφερειακά και τις λειτουργίες τους. Οι διακοπές εξωτερικής θύρας που χρησιμοποιούνται εδώ εμπίπτουν σε αυτήν την κατηγορία.
Διακοπές με διανύσματα και Διακοπές χωρίς φορέα:
Vectored: Σε αυτήν την περίπτωση, οι συσκευές που διακόπτουν μας παρέχουν την πηγή της διακοπής, περνώντας τη διεύθυνση φορέα διακοπής. Εδώ η διεύθυνση του ISR είναι σταθερή και ο έλεγχος μεταφέρεται σε αυτήν τη διεύθυνση και ο ISR αναλαμβάνει τα υπόλοιπα.
Non-Vectored: Εδώ όλες οι διακοπές έχουν κοινό ISR. Όταν προκύπτει μια διακοπή από μια πηγή χωρίς διανύσματα, το στοιχείο ελέγχου μεταφέρεται στην κοινή διεύθυνση, στην οποία μοιράζονται όλες οι διακοπές χωρίς διανύσματα.
Διακοπή ελέγχου προγράμματος στο MSP430
Όταν συμβεί η διακοπή, το MCLK είναι ΕΝΕΡΓΟΠΟΙΗΜΕΝΟ και η CPU καλείται πίσω από την κατάσταση OFF. Καθώς ο έλεγχος του προγράμματος μεταφέρεται στη διεύθυνση ISR μετά την εμφάνιση της διακοπής, οι τιμές στο μετρητή προγράμματος και ο καταχωρητής κατάστασης μεταφέρονται στη στοίβα.
Διαδοχικά, το Status Register διαγράφεται, εκκαθαρίζοντας έτσι το GIE και τερματίζοντας τη λειτουργία χαμηλής ισχύος. Η διακοπή με την υψηλότερη προτεραιότητα επιλέγεται και εκτελείται τοποθετώντας τη διεύθυνση φορέα διακοπής στον μετρητή προγράμματος. Προτού φτάσουμε στον MSP430 GPIO Interrupt Contoh Code, είναι σημαντικό να κατανοήσουμε τη λειτουργία των μητρώων Port που εμπλέκονται σε αυτόν.
Μητρώα λιμένων για έλεγχο GPIO στο MSP430:
PxDIR: Πρόκειται για ένα μητρώο ελέγχου κατεύθυνσης θύρας. Επιτρέπει στον προγραμματιστή να επιλέξει συγκεκριμένα τη λειτουργία του γράφοντας 0 ή 1. Εάν μια καρφίτσα έχει επιλεγεί ως 1, τότε λειτουργεί ως έξοδος. Θεωρήστε τη θύρα 1 ως θύρα 8-bit και εάν οι ακίδες 2 και 3 πρέπει να αντιστοιχιστούν ως θύρες εξόδου, τότε ο καταχωρητής P1DIR πρέπει να οριστεί με την τιμή 0x0C.
PxIN: Είναι ένας καταχωρητής μόνο για ανάγνωση και οι τρέχουσες τιμές στη θύρα μπορούν να διαβαστούν χρησιμοποιώντας αυτόν τον καταχωρητή.
PxOUT: Αυτό το συγκεκριμένο μητρώο μπορεί να χρησιμοποιηθεί για την άμεση εγγραφή τιμών στις θύρες. Αυτό είναι δυνατό μόνο όταν είναι απενεργοποιημένος ο καταχωρητής pullup / pulldown.
PxREN: Πρόκειται για έναν καταχωρητή 8 bit που χρησιμοποιείται για την ενεργοποίηση ή απενεργοποίηση του pullup / pulldown register. Όταν ένας πείρος έχει οριστεί ως 1 και στον καταχωρητή PxREN και PxOUT, τότε ο συγκεκριμένος πείρος τραβιέται προς τα πάνω.
PxDIR |
PxREN |
PxOUT |
Διαμόρφωση I / O |
0 |
0 |
Χ |
Είσοδος με απενεργοποιημένες αντιστάσεις |
0 |
1 |
0 |
Είσοδος με εσωτερική αναπτυσσόμενη κίνηση ενεργοποιημένη |
0 |
1 |
1 |
Είσοδος με ενεργοποιημένο το εσωτερικό pullup |
1 |
Χ |
Χ |
Έξοδος - Το PxREN δεν έχει αποτέλεσμα |
PxSEL και PxSEL2: Καθώς όλες οι ακίδες του MSP430 είναι πολυπλεξίες, η συγκεκριμένη λειτουργία πρέπει να επιλεγεί πριν από τη χρήση. Όταν και οι δύο καταχωρητές PxSEL και PxSEL2 έχουν οριστεί ως 0 για έναν συγκεκριμένο πείρο, τότε επιλέγεται ο γενικός σκοπός I / O. Όταν το PxSEL έχει οριστεί ως 1, επιλέγεται η κύρια περιφερειακή λειτουργία και ούτω καθεξής.
PxIE: Επιτρέπει ή απενεργοποιεί τις διακοπές για μια συγκεκριμένη καρφίτσα σε μια θύρα x.
PxIES: Επιλέγει το άκρο στο οποίο δημιουργείται μια διακοπή. Για το 0, επιλέγεται ένα ανερχόμενο άκρο και για το 1, επιλέγεται ένα άκρο πτώσης.
Κύκλωμα MSP430 για έλεγχο διακοπής GPIO
Το κύκλωμα MSP430 που χρησιμοποιείται για τη δοκιμή του κωδικού παραδείγματος διακοπής MSP430 εμφανίζεται παρακάτω.
Η γείωση της πλακέτας χρησιμοποιείται για τη γείωση τόσο του LED όσο και του κουμπιού. Οι διαγώνια αντίθετες πλευρές του μπουτόν είναι συνήθως ανοιχτοί ακροδέκτες και συνδέονται όταν πατήσετε το κουμπί. Μια αντίσταση συνδέεται πριν από το LED για να αποφευχθεί η υψηλή κατανάλωση ρεύματος από το LED. Συνήθως, χρησιμοποιούνται χαμηλές αντιστάσεις στην περιοχή των 100ohm - 220ohm.
Χρησιμοποιούμε 3 διαφορετικούς κωδικούς για να κατανοήσουμε καλύτερα τις Διακοπές της θύρας. Οι δύο πρώτοι κωδικοί χρησιμοποιούν το ίδιο κύκλωμα όπως στο Διάγραμμα κυκλώματος 1. Ας δούμε τον κώδικα. Μετά την πραγματοποίηση των συνδέσεων, το στήσιμο μου μοιάζει με αυτό.
Προγραμματισμός MSP430 για Διακοπές
Το πλήρες πρόγραμμα διακοπής MSP430 βρίσκεται στο κάτω μέρος αυτής της σελίδας, η εξήγηση του κώδικα έχει ως εξής.
Η παρακάτω γραμμή σταματά το χρονόμετρο παρακολούθησης από τη λειτουργία. Το χρονόμετρο Watchdog εκτελεί συνήθως δύο λειτουργίες. Το ένα εμποδίζει τον ελεγκτή από άπειρους βρόχους με επαναφορά του ελεγκτή και ο άλλος είναι ότι ενεργοποιεί περιοδικά συμβάντα χρησιμοποιώντας το ενσωματωμένο χρονόμετρο. Όταν γίνεται επαναφορά του μικροελεγκτή (ή ενεργοποίηση), βρίσκεται σε λειτουργία χρονοδιακόπτη και τείνει να επαναφέρει το MCU μετά από 32 χιλιοστά του δευτερολέπτου. Αυτή η γραμμή εμποδίζει τον ελεγκτή να το κάνει.
WDTCTL = WDTPW + WDTHOLD;
Η ρύθμιση του καταχωρητή P1DIR στην τιμή 0x07 ορίζει την κατεύθυνση των pin0, pin1 και pin2 ως εξόδου. Η ρύθμιση του P1OUT σε 0x30 διαμορφώνει μια είσοδο με εσωτερική αντίσταση pullup ενεργοποιημένη στο pin4 και το pin5 Η ρύθμιση του P1REN σε 0x30 επιτρέπει την εσωτερική αναδίπλωση αυτών των ακίδων. Το P1IE επιτρέπει τη διακοπή, όπου το P1IES επιλέγει τη μετάβαση από το υψηλό στο χαμηλό ως το άκρο διακοπής σε αυτές τις ακίδες.
P1DIR - = 0x07; P1OUT = 0x30; P1REN - = 0x30; P1IE - = 0x30; P1IES - = 0x30; P1IFG & = ~ 0x30;
Η επόμενη γραμμή ενεργοποιεί τη λειτουργία χαμηλής ισχύος και ενεργοποιεί το GIE στον καταχωρητή κατάστασης έτσι ώστε να μπορούν να ληφθούν οι διακοπές.
__bis_SR_register (LPM4bits + GIE)
Ο μετρητής προγράμματος ρυθμίζεται με τη διεύθυνση του διανύσματος θύρας 1 χρησιμοποιώντας τη μακροεντολή.
PORT1_VECTOR . #pragma vector = PORT1_VECTOR __ διακοπή κενού Θύρα_1 (άκυρη)
Ο παρακάτω κώδικας αλλάζει κάθε ένα από τα LED που είναι συνδεδεμένα στα pin0, pin1, pin2 ένα προς ένα.
εάν (μέτρηση% 3 == 0) { P1OUT ^ = BIT1; P1IFG & = ~ 0x30; μέτρηση ++; } αλλιώς εάν (μέτρηση% 3 == 1) { P1OUT ^ = BIT1; P1IFG & = ~ 0x30; μέτρηση ++; } αλλιώς { P1OUT ^ = BIT2; P1IFG & = ~ 0x30; μέτρηση ++; }
Διάγραμμα κυκλώματος 2:
Ομοίως, ας δοκιμάσουμε ένα διαφορετικό πείρο για να κατανοήσουμε την έννοια πολύ καλύτερα. Εδώ λοιπόν το μπουτόν συνδέεται με τον πείρο 2.0 αντί για τον πείρο 1.5. το τροποποιημένο κύκλωμα έχει ως εξής. Και πάλι αυτό το κύκλωμα χρησιμοποιείται για τη δοκιμή του προγράμματος διακοπής του κουμπιού MSP430.
Εδώ η θύρα 2 χρησιμοποιείται για είσοδο. Πρέπει λοιπόν να χρησιμοποιηθεί διαφορετικός φορέας διακοπής. Τα P1.4 και P2.0 λαμβάνουν τις εισόδους.
Καθώς η θύρα 2 χρησιμοποιείται μόνο για είσοδο, το P2DIR έχει οριστεί ως 0. Για να ορίσετε το pin0 της θύρας 2 ως είσοδο με ενεργοποιημένες εσωτερικές αντιστάσεις pull-up, οι καταχωρητές P2OUT και P2REN πρέπει να ρυθμιστούν με τιμή 1. Για να ενεργοποιήσετε το διακοπή στο pin0 της θύρας 2 και επίσης για να επιλέξετε την άκρη της διακοπής, τα P2IE και P2IES ρυθμίζονται με τιμή 1. Για να επαναφέρετε τη σημαία στη θύρα 2, το P2IFG διαγράφεται, έτσι ώστε η σημαία να μπορεί να ρυθμιστεί ξανά στο εμφάνιση της διακοπής.
P2DIR - = 0x00; P2OUT = 0x01; P2REN - = 0x01; P2IE - = 0x01; P2IES - = 0x01; P2IFG & = ~ 0x01;
Όταν η πηγή διακοπής είναι από τη θύρα 1, τότε το LED που είναι συνδεδεμένο στο pin1 της θύρας 1 ανάβει. Όταν η πηγή διακοπής ανήκει στη θύρα 2, τότε το LED που είναι συνδεδεμένο στο pin2 της θύρας 1 ανάβει.
#pragma vector = PORT1_VECTOR __ interrupt void Port_1 (void) { P1OUT ^ = BIT1; P1IFG & = ~ 0x10; για (i = 0; i <20000; i ++) { } P1OUT ^ = BIT1; } #pragma vector = PORT2_VECTOR __ interrupt void Port_2 (void) { P1OUT ^ = BIT2; P2IFG & = ~ 0x01; για (j = 0; j <20000; j ++) { } P1OUT ^ = BIT2; }
Μεταφόρτωση προγράμματος στο MSP430 από το CCS
Για να φορτώσετε το έργο στην επιφάνεια εκκίνησης και να το διορθώσετε, επιλέξτε το έργο και κάντε κλικ στο εικονίδιο εντοπισμού σφαλμάτων στη γραμμή εργαλείων. Εναλλακτικά, πατήστε F11 ή κάντε κλικ στο RunàDebug για είσοδο στη λειτουργία εντοπισμού σφαλμάτων.
Μόλις εισαχθεί η λειτουργία εντοπισμού σφαλμάτων, πατήστε το πράσινο κουμπί λειτουργίας για να εκτελέσετε ελεύθερα τον φορτωμένο κώδικα στο MCU. Τώρα, όταν πατηθεί το κουμπί ώθησης προς τα κάτω, η διακοπή ενεργοποιείται από την αλλαγή στην άκρη, προκαλώντας έτσι την αλλαγή στην κατάσταση του LED.
Πρόγραμμα διακοπής στο MSP430
Μετά την επιτυχή μεταφόρτωση του κώδικα, μπορούμε να τον δοκιμάσουμε χρησιμοποιώντας απλά το κουμπί. Το μοτίβο LED θα αλλάξει σύμφωνα με το πρόγραμμά μας κάθε φορά που παρέχεται διακοπή χρησιμοποιώντας το κουμπί.
Η πλήρης εργασία βρίσκεται στο παρακάτω βίντεο. Ελπίζω να απολαύσατε το σεμινάριο και να μάθετε κάτι χρήσιμο. Εάν έχετε οποιεσδήποτε ερωτήσεις, αφήστε τις στην ενότητα σχολίων ή χρησιμοποιήστε τα φόρουμ μας για άλλες τεχνικές ερωτήσεις.