Πίνακας περιεχομένων:

ΜΕΡΟΣ 2 - ΣΥΝΕΛΕΥΣΗ GPIO ARM - RGB - ΚΛΗΣΕΙΣ ΛΕΙΤΟΥΡΓΙΑΣ - Διακόπτες: 6 Βήματα
ΜΕΡΟΣ 2 - ΣΥΝΕΛΕΥΣΗ GPIO ARM - RGB - ΚΛΗΣΕΙΣ ΛΕΙΤΟΥΡΓΙΑΣ - Διακόπτες: 6 Βήματα

Βίντεο: ΜΕΡΟΣ 2 - ΣΥΝΕΛΕΥΣΗ GPIO ARM - RGB - ΚΛΗΣΕΙΣ ΛΕΙΤΟΥΡΓΙΑΣ - Διακόπτες: 6 Βήματα

Βίντεο: ΜΕΡΟΣ 2 - ΣΥΝΕΛΕΥΣΗ GPIO ARM - RGB - ΚΛΗΣΕΙΣ ΛΕΙΤΟΥΡΓΙΑΣ - Διακόπτες: 6 Βήματα
Βίντεο: 43η Τακτική Γενική Συνέλευση ΣΕΒΕ - Ανοιχτό μέρος 2 2024, Νοέμβριος
Anonim
ΜΕΡΟΣ 2 - ΣΥΝΕΛΕΥΣΗ GPIO ARM - RGB - ΚΛΗΣΕΙΣ ΛΕΙΤΟΥΡΓΙΑΣ - Διακόπτες
ΜΕΡΟΣ 2 - ΣΥΝΕΛΕΥΣΗ GPIO ARM - RGB - ΚΛΗΣΕΙΣ ΛΕΙΤΟΥΡΓΙΑΣ - Διακόπτες

Στο Μέρος 1, μάθαμε πώς να αλλάζουμε ένα μόνο Κόκκινο LED στον πίνακα ανάπτυξης MSP432 LaunchPad από την Texas Instruments, χρησιμοποιώντας συναρμολόγηση αντί για C / C ++.

Σε αυτό το Instructable, θα κάνουμε κάτι παρόμοιο - ελέγξτε ένα LED RGB που βρίσκεται επίσης στον ίδιο πίνακα.

Στην πορεία, ελπίζουμε να βελτιώσουμε τις γνώσεις μας για τη συναρμολόγηση ARM και όχι μόνο να διασκεδάσουμε φωτίζοντας μερικά LED.

Βήμα 1: Ας μεταβούμε αμέσως

Πραγματικά, το πρώτο βίντεο τα λέει όλα. Δεν υπάρχουν πολλά περισσότερα να προσθέσω.

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

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

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

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

Ενισχύσαμε ότι χρειαζόμαστε πολλούς καταχωρητές: το μητρώο DIR, το μητρώο SEL0, το μητρώο SEL1 και το μητρώο OUTPUT. Και τρία κομμάτια κάθε φορά.

Βήμα 2: Βελτίωση κώδικα - Προσθήκη συνάρτησης

Image
Image

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

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

Αν ο κώδικας LED-off μας είχε εμπλακεί περισσότερο με πολλές περισσότερες οδηγίες, αυτό θα ήταν πραγματικός εξοικονόμηση μνήμης.

Μέρος του ενσωματωμένου προγραμματισμού και των μικροελεγκτών είναι να γνωρίζουν πολύ περισσότερο το μέγεθος του προγράμματος.

Το βίντεο εξηγεί.

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

Βήμα 3: Προσθέστε μια καθυστέρηση απασχόλησης

Στην ενότητα Δηλώσεις του κώδικα, προσθέστε μια σταθερά για να διευκολύνετε την προσαρμογή του επιθυμητού χρονισμού:

? τυχόν λέξεις μετά από ημι-άνω τελεία (';') ξεκινά ένα σχόλιο.

? ο κώδικας σε αυτό το μέρος αποδίδει ένα όνομα σε μια τιμή. ? θα μπορούσατε επίσης να χρησιμοποιήσετε το «.equ» αλλά είναι ελαφρώς διαφορετικά. ? Το «.equ» (νομίζω) δεν μπορεί να αλλάξει, ενώ το «.set» σημαίνει ότι μπορείτε. αλλάξτε την τιμή του 'DLYCNT' αργότερα στον κώδικα, αν θέλετε. 'DLYCNT' θα χρησιμοποιηθεί ως τιμή αντίστροφης μέτρησης στην υπορουτίνα καθυστέρησης. DLYCNT. Ρύθμιση 0x30000

Προσθέστε μια νέα λειτουργία καθυστέρησης:

καθυστέρηση:.asmfunc; την έναρξη της υπορουτίνας ή της λειτουργίας «καθυστέρησης».

MOV R5, #DLYCNT; φορτώστε τον πυρήνα cpu καταχωρητή R5 με τιμή που έχει εκχωρηθεί στο 'DLYCNT'. dlyloop? αυτό σηματοδοτεί την έναρξη του βρόχου καθυστέρησης. ο συναρμολογητής καθορίζει τη διεύθυνση. SUB R5, #0x1; αφαιρέστε το 1 από την τρέχουσα τιμή στον κεντρικό καταχωρητή CPU R5. CMP R5, #0x0; σύγκριση της τρέχουσας τιμής σε R5 σε 0. BGT dlyloop. διακλάδωση εάν η τιμή στο R5 είναι μεγαλύτερη 0, στην ετικέτα (διεύθυνση) 'dlyloop'. BX LR; αν φτάσουμε εδώ, σημαίνει ότι η τιμή R5 ήταν 0. επιστροφή από υπορουτίνα..endasmfunc; σηματοδοτεί το τέλος της υπορουτίνας.

Στη συνέχεια, στο κύριο σώμα, μέσα στον κύριο βρόχο, καλέστε ή καλέστε αυτήν τη λειτουργία καθυστέρησης:

? αυτό είναι ένα κομμάτι κώδικα, του κύριου σώματος ή της κύριας λειτουργίας (βλ. αρχείο 'main.asm').

? Αυτός είναι ένας βρόχος στο 'main' και δείχνει πώς καλούμε ή χρησιμοποιούμε αυτήν τη νέα συνάρτηση 'καθυστέρησης'. ? τα "#REDON" και "#GRNON" είναι επίσης δηλώσεις (σταθερές) (βλ. κορυφή του "main.asm"). ? είναι απλώς ένας εύκολος τρόπος για να ορίσετε το καθορισμένο χρώμα του RGB LED. βρόχος MOV R0, #REDON; Κόκκινο - καθορίστε τον πυρήνα CPU καταχωρητή R0 με τιμή που αντιστοιχεί στο "REDON". STRB R0, [R4] · ο κεντρικός καταχωρητής R4 είχε προηγουμένως οριστεί με διεύθυνση εξόδου GPIO. · γράψτε τι υπάρχει στο R0, στη διεύθυνση που καθορίζεται από το R4. BL καθυστέρηση · διακλάδωση στη νέα λειτουργία «καθυστέρησης». BL ledsoff · διακλάδωση στην προϋπάρχουσα λειτουργία «ledsoff». BL καθυστέρηση; ditto MOV R0, #GRNON; Πράσινο - ditto STRB R0, [R4]; και ούτω καθεξής. BL καθυστέρηση BL ledsoff BL καθυστέρηση

Το βίντεο μπαίνει σε λεπτομέρειες.

Βήμα 4: Πρότυπο κλήσης διαδικασίας αρχιτεκτονικής ARM (AAPCS)

Probablyσως είναι μια καλή στιγμή για να παρουσιάσετε κάτι. Είναι ένα συνέδριο στη γλώσσα συνέλευσης. Γνωστό και ως το Πρότυπο Κλήσης Διαδικασίας για την Αρχιτεκτονική ARM.

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

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

Βασικά Μητρώα

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

1) Υποτίθεται ότι χρησιμοποιούμε το R0 ως παράμετρο συνάρτησης. Εάν θέλουμε να περάσουμε μια τιμή στη συνάρτηση (υπορουτίνα), θα πρέπει να χρησιμοποιήσουμε το R0 για να το κάνουμε αυτό.

2) Πρέπει να χρησιμοποιήσουμε το Μητρώο συνδέσμων για τον επιδιωκόμενο σκοπό του - διατηρεί τη διεύθυνση που υποδεικνύει πού να επιστρέψετε μετά την ολοκλήρωση της υπορουτίνας.

Θα δείτε πώς τα εφαρμόζουμε αυτά.

Βήμα 5: Λειτουργία με παράμετρο - Ένθετες συναρτήσεις

Μπορούμε να καθαρίσουμε τον κώδικά μας και να μειώσουμε τον όγκο της μνήμης που καταλαμβάνει συνδυάζοντας επαναλαμβανόμενα τμήματα σε μία μόνο λειτουργία. Η μόνη διαφορά στο κύριο σώμα βρόχου είναι ότι χρειαζόμαστε μια παράμετρο ώστε να μπορούμε να περάσουμε τα διάφορα χρώματα που θέλουμε να δούμε από το LED RGB.

Ρίξτε μια ματιά στο βίντεο για λεπτομέρειες. (συγνώμη για το μήκος)

Βήμα 6: Είσοδος GPIO - Προσθήκη διακοπτών

Ας το κάνουμε πιο ενδιαφέρον. It'sρθε η ώρα να προσθέσουμε κάποιο switch-control στο πρόγραμμα συναρμολόγησης.

Αυτό το Instructable έχει εικόνες που δείχνουν πώς συνδέονται οι δύο ενσωματωμένοι διακόπτες στο MSP432.

Ουσιαστικά: Ο διακόπτης 1 (SW1 ή S1) είναι συνδεδεμένος στο P1.1 και ο διακόπτης 2 (SW2 ή S2) είναι συνδεδεμένος στο P1.4.

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

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

Θύρα 1 Αποκλεισμός διεύθυνσης

Θυμηθείτε ότι τα καλύψαμε στο προηγούμενο Instructable, αλλά πρέπει να συμπεριλάβουμε ένα νέο:

  • Θύρα 1 Διεύθυνση μητρώου εισόδου = 0x40004C00
  • Θύρα 1 Διεύθυνση καταχώρισης εξόδου = 0x40004C02
  • Λιμάνι 1 Κατεύθυνση Διεύθυνση μητρώου = 0x40004C04
  • Θύρα 1 Resistor Ενεργοποίηση καταχώρισης διεύθυνση = 0x40004C06
  • Θύρα 1 Επιλέξτε 0 Διεύθυνση καταχώρισης = 0x40004C0A
  • Θύρα 1 Επιλέξτε 1 Διεύθυνση καταχώρισης = 0x40004C0C

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

Δεδομένου ότι ο πίνακας ανάπτυξης Launchpad έχει συνδέσει τους δύο διακόπτες στη γείωση (LOW όταν πιέζεται), αυτό σημαίνει ότι πρέπει να χρησιμοποιούμε αντιστάσεις pull UP για να βεβαιωθούμε ότι έχουμε σταθερό HIGH όταν δεν πιέζονται.

Τραβήξτε προς τα πάνω / Τραβήξτε τις αντιστάσεις

Χρειάζονται δύο διαφορετικές διευθύνσεις Port 1 Register για να συνδέσετε αυτές τις εισόδους διακόπτη σε αντιστάσεις έλξης.

1) Χρησιμοποιήστε τον καταχωρητή Port 1 Resistor-Enable (0x40004C06) για να υποδείξετε ότι θέλετε αντιστάσεις (για αυτά τα δύο bits), 2) και στη συνέχεια χρησιμοποιήστε τον καταχωρητή εξόδου Port 1 (0x40004C02) για να ορίσετε τις αντιστάσεις είτε ως pull-up είτε ως pull-down. Μπορεί να φαίνεται μπερδεμένο το γεγονός ότι χρησιμοποιούμε έναν καταχωρητή εξόδου στις εισόδους. Το μητρώο εξόδου έχει σχεδόν διπλής χρήσης.

Έτσι, για να επαναδιατυπώσουμε έναν άλλο τρόπο, ο καταχωρητής εξόδου μπορεί είτε να στείλει ένα Υ HIGHΗΛΟ είτε ΧΑΜΗΛΟ σε μια έξοδο (όπως η ενιαία κόκκινη λυχνία LED) και / ή χρησιμοποιείται για να ορίσει αντιστάσεις έλξης ή έλξης για εισόδους, ΑΛΛΑ ΜΟΝΟ αν αυτή η δυνατότητα έχει ενεργοποιηθεί μέσω του μητρώου Resistor-Enable.

Σημαντικό στα παραπάνω-κατά την αποστολή/ρύθμιση LOW ή HIGH σε οποιοδήποτε bit εξόδου, θα πρέπει να διατηρήσετε ταυτόχρονα την κατάσταση pull-up/pull-down των bit εισόδου.

(το βίντεο προσπαθεί να εξηγήσει)

Ανάγνωση δυαδικού ψηφίου εισόδου θύρας

  • Ρυθμίστε τη λειτουργία SEL0 / SEL1 για τη λειτουργία GPIO
  • Ορίστε τον καταχωρητή DIR ως είσοδο για τα δυαδικά ψηφία μεταγωγής, αλλά ως έξοδο για το LED (ταυτόχρονα στο ίδιο byte)
  • Ενεργοποιήστε τις αντιστάσεις
  • Ορίστε τα ως αντιστάσεις έλξης
  • Διαβάστε το λιμάνι
  • Μπορεί να θέλετε να φιλτράρετε την τιμή που διαβάζεται για να απομονώσετε μόνο τα bits που χρειάζεστε (διακόπτης 1 και 2)

Συνιστάται: