Κατηγορίες: Κύκλωμα μικροελεγκτή
Αριθμός προβολών: 41940
Σχόλια σχετικά με το άρθρο: 5

Μέθοδοι ανάγνωσης και διαχείρισης θυρών εισόδου / εξόδου Arduino

 

Για να αλληλεπιδράσετε με τον έξω κόσμο, πρέπει να διαμορφώσετε τις εξόδους του μικροελεγκτή για να λαμβάνετε ή να μεταδίδετε ένα σήμα. Ως αποτέλεσμα, κάθε πείρος θα λειτουργήσει στη λειτουργία εισόδου και εξόδου. Υπάρχουν δύο τρόποι να το κάνετε αυτό σε κάθε πίνακα 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 με αυτό τον τρόπο, πρέπει πρώτα να εξετάσετε προσεκτικά την παρακάτω εικόνα.

Θύρες μικροελεγκτών Atmega168

Ίσως κάποιος να εξετάσει σαφέστερα τα λιμάνια σε αυτή τη μορφή (το ίδιο στο σχήμα, αλλά σε διαφορετικό σχέδιο):

Θύρες μικροελεγκτών Atmega328

Εδώ βλέπετε την αντιστοιχία των συμπερασμάτων του Arduino και τα ονόματα των λιμένων της Atmega. Έτσι, έχουμε 3 θύρες:

  • PORTB;

  • PORTC;

  • PORTD.

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

Πίνακας αντιστοιχίας των λιμένων 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.

Arduino LED αναβοσβήνει κώδικα

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

Διαχείριση ακίδων

Τα σχόλια εξηγούν τον κώδικα. Η λογική αυτής της εργασίας είναι η εξής.

Η εντολή PORTB B00100000 βάζει το PB5 σε κατάσταση λογικής μονάδας, κοιτάξτε και εκείνες οι εικόνες και ο παρακάτω πίνακας βρίσκονται και βλέπουμε ότι το PB5 αντιστοιχεί σε 13 pin της Arduina.

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

Δομή δομής D

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

Αριθμομηχανή Windows

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

Λειτουργία Υπολογιστή Προγραμματιστή

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

Μετάφραση αριθμών σε μια αριθμομηχανή

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

Μεταφορά αριθμού στο IDE του Arduino

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

Εισαγωγή δεδομένων σε κάθε ακίδα

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

Ανάλυση αρχείου

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

Λειτουργία λογικής προσθήκης

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

Αλλά με τη λογική προσθήκη, προκύπτει ένα πρόβλημα - δεν μπορείτε να μετατρέψετε τη μονάδα στο μηδέν, επειδή:

0+0=1

1+0=1

0+1=1

Ο λογικός πολλαπλασιασμός και αντιστροφή θα έρθει στη βοήθειά μας:

Λογικός πολλαπλασιασμός και αντιστροφή

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

 

Πολλαπλασιάζοντας τα περιεχόμενα της θύρας με έναν αριθμό

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

Πολλαπλασιάστε τα περιεχόμενα της θύρας με μηδενική μετατόπιση κατά 5 μπιτ

Το ίδιο μπορεί να γίνει χρησιμοποιώντας την αντίστροφη λειτουργία (^):

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

Διαβάστε από τις θύρες

Εδώ ελέγχεται εάν η έκφραση σε παρενθέσεις είναι ίση με την πραγματική κατάσταση των θυρών, δηλ. παρόμοια αν γράψαμε εάν (digitalRead (12) == 1).


Συμπέρασμα

Γιατί υπάρχουν τέτοιες δυσκολίες στη διαχείριση των θυρών εάν μπορείτε να χρησιμοποιήσετε τυπικές βολικές λειτουργίες; Είναι το θέμα της ταχύτητας και του μεγέθους του κώδικα. Όταν χρησιμοποιείτε τη δεύτερη μέθοδο, που συζητείται στο άρθρο, το μέγεθος του κώδικα μειώνεται σημαντικά και η ταχύτητα αυξάνεται κατά πολλές τάξεις μεγέθους. Το πρότυπο ψηφιακό γράψιμο () διεξήχθη στα 1800 μs και καταγράφηκε απευθείας στη θύρα σε 0,2 μs και ψηφιακή ανάγνωση σε 1900 μs και έγινε επίσης 0,2 μs. Αυτή η μέθοδος ελέγχου βρέθηκε στους ανοικτούς χώρους του δικτύου και βρίσκεται συχνά στον κώδικα. τελικά έργα.

Δείτε επίσης στο i.electricianexp.com:

  • Σύνδεση και προγραμματισμός του Arduino για αρχάριους
  • Πώς να συνδέσετε τον αυξητικό κωδικοποιητή στο Arduino
  • Μικροελεγκτές PIC για αρχάριους
  • Τηλεχειριστήριο μικροελεγκτών: IR Remote, Arduino, ESP8266, 433 ...
  • Μετρήστε τη θερμοκρασία και την υγρασία στο Arduino - μια επιλογή μεθόδων

  •  
     
    Σχόλια:

    # 1 έγραψε: Kipovets | [παραθέτω]

     
     

    "Αλλά με τη λογική προσθήκη, προκύπτει ένα πρόβλημα - δεν μπορείτε να μετατρέψετε τη μονάδα στο μηδέν, επειδή:

    0 + 0 = 1 "(γ)

    Μικρή εποπτεία: 0 + 0 = 0.

     
    Σχόλια:

    # 2 έγραψε: chugou | [παραθέτω]

     
     

    Kipovets, πιθανότατα ήθελε να πει:

    1 + 1 = 1

     
    Σχόλια:

    # 3 έγραψε: | [παραθέτω]

     
     

    Kipovets,
    Banal τύπος! Βλέπετε πόσο καλά είναι ότι οι ειδικοί κάθεται στην πύλη μας! Πρέπει να κάνετε μόνο κατάλληλο περιεχόμενο!

     
    Σχόλια:

    # 4 έγραψε: Serg | [παραθέτω]

     
     

    Στο τελευταίο μέρος λέει PORTB | = 1 << 5 ... εάν (digitalRead (12) == 1). Αλλά 5 ακροδέκτες της θύρας Β, είναι 13 pin από arduino. Ή μήπως λάθος;

     
    Σχόλια:

    # 5 έγραψε: ρ-α-Η-α | [παραθέτω]

     
     

    Εάν (PINB == B00010000) {} δεν είναιπαρόμοια με αν γράψαμε αν (digitalRead (12) == 1)
    μάλλον ανάλογη
    (ψηφιακή ανάγνωση (12) == 1) &&(digitalRead (13) == 1) &&(ψηφιακή ανάγνωση (14) == 1) &&(ψηφιακή ανάγνωση (15) == 1) &&(digitalRead (11) == 1) ... και έτσι 8 ακροδέκτες θύρας

    Εδώ χρειάζεστε είτε αυτό:
    εάν (
    ! (~ PORTB & (1 << PB4))) {} //επιστρέφει0 ή 1
    είτε ως εξής:
    εάν (PORTB & (1 << PB4)) {} // επιστρέφει τη μετατοπισμένη μονάδα = 16, DEC
    είτε ως εξής:
    εάν (
    bit_is_set (PORTB, 4)) {}// επιστρέφει τη μετατοπισμένη μονάδα = 16, DEC