Κατηγορίες: Κύκλωμα μικροελεγκτή
Αριθμός προβολών: 41940
Σχόλια σχετικά με το άρθρο: 5
Μέθοδοι ανάγνωσης και διαχείρισης θυρών εισόδου / εξόδου Arduino
Για να αλληλεπιδράσετε με τον έξω κόσμο, πρέπει να διαμορφώσετε τις εξόδους του μικροελεγκτή για να λαμβάνετε ή να μεταδίδετε ένα σήμα. Ως αποτέλεσμα, κάθε πείρος θα λειτουργήσει στη λειτουργία εισόδου και εξόδου. Υπάρχουν δύο τρόποι να το κάνετε αυτό σε κάθε πίνακα Arduino που αγαπάτε, ακριβώς πώς μαθαίνετε από αυτό το άρθρο.

Μέθοδος 1 - Η τυπική γλώσσα για το IDE του Arduino
Όλοι το γνωρίζουν Arduino Είναι προγραμματισμένο σε C ++ με μερικές προσαρμογές και απλοποιήσεις για αρχάριους. Καλείται καλωδίωση. Αρχικά, όλες οι θύρες arduino ορίζονται ως είσοδοι, και δεν χρειάζεται να διευκρινιστεί αυτό στον κώδικα.
Οι θύρες συνήθως γράφονται στη λειτουργία μεταβλητής αρχικοποίησης:
void setup ()
{
// code
}
Η εντολή pinMode χρησιμοποιείται για αυτό, έχει μια αρκετά απλή σύνταξη, πρώτα ο αριθμός θύρας υποδεικνύεται και ο ρόλος της χωρίζεται με κόμματα.
pinMode (nomer_porta, naznachenie)
Με αυτή την εντολή, το εσωτερικό κύκλωμα του μικροελεγκτή διαμορφώνεται με συγκεκριμένο τρόπο.
Υπάρχουν τρεις λειτουργίες στις οποίες η θύρα μπορεί να λειτουργήσει: INPUT - είσοδος, σε αυτή τη λειτουργία εμφανίζεται ανάγνωση δεδομένων από αισθητήρες, κατάσταση κουμπιού, αναλογικό και ψηφιακό σήμα. Η θύρα βρίσκεται στο λεγόμενο κατάσταση υψηλής αντίστασης, με απλά λόγια - η είσοδος έχει υψηλή αντίσταση. Αυτή η τιμή ορίζεται, για παράδειγμα, σε 13 ακίδες της σανίδας, εάν είναι απαραίτητο, ως εξής:
pinMode (13, είσοδος);
OUTPUT - έξοδος, ανάλογα με την εντολή που καθορίζεται στον κώδικα, η θύρα παίρνει μια τιμή ενός ή μηδενός. Η έξοδος γίνεται ένα είδος ελεγχόμενης πηγής ισχύος και παράγει ένα μέγιστο ρεύμα (στην περίπτωσή μας 20 mA και 40 mA στην κορυφή) στο φορτίο που συνδέεται με αυτό. Για να εκχωρήσετε μια θύρα ως έξοδο στο Arduino πρέπει να πληκτρολογήσετε:
pinMode (13, OUTPUT).
INPUT_PULLUP - Η θύρα λειτουργεί ως είσοδος, αλλά η λεγόμενη σύνδεση συνδέεται με αυτήν. Αντίσταση έλξης 20 kΩ.
Το υποκείμενο εσωτερικό κύκλωμα της θύρας σε αυτή την κατάσταση φαίνεται παρακάτω. Ένα χαρακτηριστικό αυτής της εισόδου είναι ότι το σήμα εισόδου θεωρείται ανεστραμμένο (η "μονάδα" στην είσοδο θεωρείται από τον μικροελεγκτή ως "μηδέν"). Σε αυτή τη λειτουργία, δεν μπορείτε να χρησιμοποιήσετε εξωτερικές αντιστάσεις pull-up όταν εργάζεστε με κουμπιά.
pinMode (13, INPUT_PULLUP);

Τα δεδομένα λαμβάνονται από τις θύρες και μεταδίδονται σε αυτά από τις εντολές:
-
(13, HIGH) - παρέχει 5 βολτ (λογική μονάδα) σε 13 ακίδες και ψηφιακό λογότυπο (13, χαμηλό) - μετατρέπει τον ακροδέκτη εξόδου σε λογική 1 ή 0, αντίστοιχα, ) - μεταφράζει 13 ακίδες σε κατάσταση λογικού μηδενός (0 βολτ).
-
digitalRead (pin) - διαβάζει την τιμή από την είσοδο, παράδειγμα digitalRead (10), διαβάζει το σήμα από 10 ακίδες,
-
analogRead (pin) - διαβάζει ένα αναλογικό σήμα από μια αναλογική θύρα, παίρνετε μια τιμή στην περιοχή από 0 έως 1023 (σε ADC 10 bit), ένα παράδειγμα είναι το analogRead (3).
Μέθοδος 2 - διαχείριση θυρών μέσω των καταχωρητών Atmega και επιτάχυνση του κώδικα
Αυτός ο έλεγχος είναι φυσικά απλός, αλλά στην περίπτωση αυτή υπάρχουν δύο μειονεκτήματα - μεγαλύτερη κατανάλωση μνήμης και κακή απόδοση κατά την εργασία με θύρες. Αλλά θυμηθείτε τι είναι το Arduino, ανεξάρτητα από το board option (uno, micro, nano); Πρώτα απ 'όλα, αυτό οικογένεια AVR μικροελεγκτή ATMEGA, που χρησιμοποιήθηκε πρόσφατα MK atmega328.
Στο IDE του Arduino, μπορείτε να προγραμματίσετε τη γλώσσα C AVR εγγενή σε αυτή την οικογένεια, σαν να δουλεύατε με έναν ξεχωριστό μικροελεγκτή. Αλλά τα πρώτα πράγματα πρώτα. Για να διαχειριστείτε τις θύρες Arduino με αυτό τον τρόπο, πρέπει πρώτα να εξετάσετε προσεκτικά την παρακάτω εικόνα.
Ίσως κάποιος να εξετάσει σαφέστερα τα λιμάνια σε αυτή τη μορφή (το ίδιο στο σχήμα, αλλά σε διαφορετικό σχέδιο):

Εδώ βλέπετε την αντιστοιχία των συμπερασμάτων του Arduino και τα ονόματα των λιμένων της Atmega. Έτσι, έχουμε 3 θύρες:
-
PORTB;
-
PORTC;
-
PORTD.
Με βάση τις εικόνες που παρουσιάστηκαν, συνέταξα έναν πίνακα αλληλογραφίας μεταξύ των λιμένων Arduino και Atmega, θα σας φανεί χρήσιμο στο μέλλον.

Το Atmega διαθέτει τρεις καταχωρητές 8-bit που ελέγχουν την κατάσταση των θυρών, για παράδειγμα, η θύρα Β θα υπολογίσει το σκοπό τους σχεδιάζοντας αναλογίες με τα τυποποιημένα εργαλεία καλωδίωσης που περιγράφονται στην αρχή αυτού του άρθρου:
-
PORTB - Διαχείριση της κατάστασης παραγωγής. Αν ο ακροδέκτης είναι στη λειτουργία "Έξοδος", τότε 1 και 0 καθορίζουν την παρουσία των ίδιων σημάτων στην έξοδο. Εάν ο ακροδέκτης είναι στη λειτουργία "Είσοδος", τότε 1 συνδέει μια αντίσταση pull-up (ίδια με την INPUT_PULLUP που αναφέρθηκε παραπάνω), αν 0 είναι μια κατάσταση υψηλής σύνθετης αντίστασης (αναλογική του INPUT).
-
Το PINB είναι ένα μητρώο ανάγνωσης. Συνεπώς, περιέχει πληροφορίες σχετικά με την τρέχουσα κατάσταση των ακίδων θύρας (λογική μονάδα ή μηδέν).
-
DDRB - μητρώο διευθύνσεων θύρας. Με αυτό, αναφέρετε στον μικροελεγκτή ποια είναι η θύρα ως είσοδος ή έξοδος, με είσοδο "1" και είσοδο "0".
Αντί το γράμμα "B", μπορεί να υπάρχει κάποιο άλλο σύμφωνα με τα ονόματα των θυρών, για παράδειγμα, άλλες εντολές PORTD ή PORTC λειτουργούν ομοίως.
Αναβοσβήνουμε τη λυχνία LED, αλλάζουμε την τυπική λειτουργία digitalWrite (). Αρχικά, ας θυμηθούμε τι μοιάζει το αρχικό παράδειγμα από τη βιβλιοθήκη IDE του Arduino.

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

Τα σχόλια εξηγούν τον κώδικα. Η λογική αυτής της εργασίας είναι η εξής.
Η εντολή PORTB B00100000 βάζει το PB5 σε κατάσταση λογικής μονάδας, κοιτάξτε και εκείνες οι εικόνες και ο παρακάτω πίνακας βρίσκονται και βλέπουμε ότι το PB5 αντιστοιχεί σε 13 pin της Arduina.
Το γράμμα "B" μπροστά από τους αριθμούς υποδηλώνει ότι γράφουμε τις τιμές σε δυαδική μορφή. Η αρίθμηση στο δυαδικό πηγαίνει από δεξιά προς τα αριστερά, δηλ. εδώ η μονάδα βρίσκεται στο έκτο bit από τη δεξιά άκρη του μπιτ, η οποία λέει στον μικροελεγκτή την αλληλεπίδραση με την κατάσταση του έκτου bit του καταχωρητή θύρας Β (PB5). Ο παρακάτω πίνακας δείχνει τη δομή της θύρας D, είναι παρόμοια και δίνεται ως παράδειγμα.

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

Πληκτρολογήστε τον επιθυμητό αριθμό:

Και κάντε κλικ στο HEX:

Σε αυτή την περίπτωση, μεταφέρουμε όλα αυτά στο IDE του Arduino, αλλά αντί του προθέματος "B" θα είναι "0x".

Αλλά με αυτήν την είσοδο υπάρχει ένα πρόβλημα. Αν έχετε κάτι συνδεδεμένο με άλλες ακίδες, εισάγοντας μια εντολή όπως B00010000 - θα επαναφέρετε όλες τις ακίδες εκτός από το 13 (PB5). Μπορείτε να εισάγετε δεδομένα για κάθε ακίδα χωριστά. Θα μοιάζει με αυτό:

Ένα τέτοιο ρεκόρ μπορεί να φαίνεται ακατανόητο, ας το καταλάβουμε.

Αυτή είναι μια λογική λειτουργία προσθήκης, | = σημαίνει προσθήκη κάτι στο περιεχόμενο της θύρας.

Αυτό σημαίνει ότι πρέπει να προσθέσετε μια λέξη 8 bits στον κατάλογο με μια μονάδα που έχει μεταστραφεί κατά 5 bits - ως αποτέλεσμα, αν το 11000010 αποδειχθεί ότι είναι 11011010. Σε αυτό το παράδειγμα, μπορεί να φανεί ότι μόνο PB5 έχει αλλάξει, τα υπόλοιπα bits αυτού του μητρώου έχουν παραμείνει αμετάβλητα, καθώς και Η κατάσταση των ακίδων μικροελεγκτή παρέμεινε αμετάβλητη.
Αλλά με τη λογική προσθήκη, προκύπτει ένα πρόβλημα - δεν μπορείτε να μετατρέψετε τη μονάδα στο μηδέν, επειδή:
0+0=1
1+0=1
0+1=1
Ο λογικός πολλαπλασιασμός και αντιστροφή θα έρθει στη βοήθειά μας:

& = σημαίνει να πολλαπλασιάσετε το περιεχόμενο της θύρας με συγκεκριμένο αριθμό.

Και αυτός είναι ο αριθμός με τον οποίο πολλαπλασιάζουμε. Το σύμβολο "~" δηλώνει την αντιστροφή. Στην περίπτωσή μας, η ανεστραμμένη μονάδα είναι μηδέν. Δηλαδή πολλαπλασιάζουμε το περιεχόμενο της θύρας με μηδέν, μετατοπίζεται κατά 5 bits. Για παράδειγμα, ήταν 10110001, έγινε 10100001. Τα υπόλοιπα κομμάτια παρέμειναν αμετάβλητα.

Το ίδιο μπορεί να γίνει χρησιμοποιώντας την αντίστροφη λειτουργία (^):
Ανάγνωση από τις θύρες, το ανάλογο του digitalRead () εκτελείται χρησιμοποιώντας το μητρώο PIN, στην πράξη μοιάζει με αυτό:

Εδώ ελέγχεται εάν η έκφραση σε παρενθέσεις είναι ίση με την πραγματική κατάσταση των θυρών, δηλ. παρόμοια αν γράψαμε εάν (digitalRead (12) == 1).
Συμπέρασμα
Γιατί υπάρχουν τέτοιες δυσκολίες στη διαχείριση των θυρών εάν μπορείτε να χρησιμοποιήσετε τυπικές βολικές λειτουργίες; Είναι το θέμα της ταχύτητας και του μεγέθους του κώδικα. Όταν χρησιμοποιείτε τη δεύτερη μέθοδο, που συζητείται στο άρθρο, το μέγεθος του κώδικα μειώνεται σημαντικά και η ταχύτητα αυξάνεται κατά πολλές τάξεις μεγέθους. Το πρότυπο ψηφιακό γράψιμο () διεξήχθη στα 1800 μs και καταγράφηκε απευθείας στη θύρα σε 0,2 μs και ψηφιακή ανάγνωση σε 1900 μs και έγινε επίσης 0,2 μs. Αυτή η μέθοδος ελέγχου βρέθηκε στους ανοικτούς χώρους του δικτύου και βρίσκεται συχνά στον κώδικα. τελικά έργα.
Δείτε επίσης στο electro-el.tomathouse.com
: