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

Φροντιστήριο AVR Assembler 6: 3 Βήματα
Φροντιστήριο AVR Assembler 6: 3 Βήματα

Βίντεο: Φροντιστήριο AVR Assembler 6: 3 Βήματα

Βίντεο: Φροντιστήριο AVR Assembler 6: 3 Βήματα
Βίντεο: LDmicro 21: Configure C Mode & Arduino Mega (Προγραμματισμός μικροελεγκτών με LDmicro) 2024, Νοέμβριος
Anonim
Φροντιστήριο AVR Assembler 6
Φροντιστήριο AVR Assembler 6

Καλώς ορίσατε στο φροντιστήριο 6!

Το σημερινό σεμινάριο θα είναι σύντομο, όπου θα αναπτύξουμε μια απλή μέθοδο για την επικοινωνία δεδομένων μεταξύ ενός atmega328p και ενός άλλου χρησιμοποιώντας δύο θύρες που τους συνδέουν. Στη συνέχεια, θα πάρουμε τον κύκλο ζαριών από το Σεμινάριο 4 και τον Αναλυτή καταχώρισης από το Εκπαιδευτικό 5, θα τους συνδέσουμε μεταξύ μας και θα χρησιμοποιήσουμε τη μέθοδό μας για να επικοινωνήσουμε το αποτέλεσμα των κυλίνδρων από τον κύλινδρο στον αναλυτή. Στη συνέχεια, θα εκτυπώσουμε το ρολό σε δυαδικό τρόπο χρησιμοποιώντας τα LED που κατασκευάσαμε για τον αναλυτή στο Φροντιστήριο 5. Μόλις έχουμε αυτό το έργο, θα είμαστε σε θέση να κατασκευάσουμε το επόμενο κομμάτι του συνολικού μας έργου στο επόμενο σεμινάριο.

Σε αυτό το σεμινάριο θα χρειαστείτε:

  1. Ο πίνακας πρωτοτύπων σας
  2. Ο κύλινδρος ζαριών σας από το Φροντιστήριο 4
  3. Ο αναλυτής εγγραφής σας από το σεμινάριο 5
  4. Δύο καλώδια σύνδεσης
  5. Αντίγραφο του Πλήρους Φύλλου Δεδομένων (αναθεώρηση 2014):

    www.atmel.com/images/Atmel-8271-8-bit-AVR-M…

  6. Αντίγραφο του εγχειριδίου συνόλου οδηγιών (αναθεώρηση 2014):

    www.atmel.com/images/atmel-0856-avr-instruc…

Ακολουθεί ένας σύνδεσμος για την πλήρη συλλογή των σεμιναρίων AVR assembler μου:

Βήμα 1: Πώς μπορούμε να πείσουμε δύο μικροελεγκτές να μιλούν μεταξύ τους;

Πώς μπορούμε να κάνουμε δύο μικροελεγκτές να μιλούν μεταξύ τους
Πώς μπορούμε να κάνουμε δύο μικροελεγκτές να μιλούν μεταξύ τους

Δεδομένου ότι αρχίζουμε να επεκτείνουμε το έργο μας έτσι ώστε το ενιαίο τελικό προϊόν μας να αποτελείται από μια συλλογή μικρότερων τμημάτων, θα χρειαστούμε περισσότερες καρφίτσες από όσες μπορεί να προσφέρει ένα Atmega328P. Επομένως, θα κάνουμε κάθε κομμάτι του συνολικού έργου σε ξεχωριστό μικροελεγκτή και στη συνέχεια θα τους ζητήσουμε να μοιραστούν τα δεδομένα μεταξύ τους. Το πρόβλημα λοιπόν που πρέπει να λύσουμε είναι πώς μπορούμε να καταλήξουμε σε μια απλή μέθοδο για τους ελεγκτές να μιλούν μεταξύ τους και να μεταφέρουν δεδομένα μεταξύ τους; Λοιπόν, ένα πράγμα για αυτούς τους ελεγκτές είναι ότι ο καθένας εκτελεί 16 εκατομμύρια οδηγίες ανά δευτερόλεπτο. Αυτό είναι πολύ ακριβές και επομένως μπορούμε να χρησιμοποιήσουμε αυτόν τον χρόνο για τη μεταφορά δεδομένων. Εάν χρησιμοποιούμε καθυστερήσεις χιλιοστών του δευτερολέπτου για να συνθέσουμε τα δεδομένα, τότε δεν χρειάζεται πραγματικά να είμαστε τόσο ακριβείς αφού η CPU εκτελεί 16.000 οδηγίες σε ένα χιλιοστό του δευτερολέπτου. Με άλλα λόγια, ένα χιλιοστό του δευτερολέπτου είναι μια αιωνιότητα για την CPU. Ας το δοκιμάσουμε λοιπόν με τα ζάρια. Θέλω να μεταδώσω το αποτέλεσμα μιας ζαριάς από το τσιπ κυλίνδρων ζαριών στο τσιπ αναλυτή. Ας υποθέσουμε ότι στεκόσασταν απέναντι και ήθελα να σας στείλω το αποτέλεσμα της ρίψης μου ενός ζευγαριού ζαριών. Ένα πράγμα που μπορούσα να κάνω, αν είχαμε και οι δύο ένα ρολόι, είναι ότι θα μπορούσα να ανάψω έναν φακό, τότε όταν είστε έτοιμοι να λάβετε τα δεδομένα μου, ανάψτε τον φακό σας και ξεκινάμε και οι δύο τα ρολόγια μας. Στη συνέχεια, κρατάω τον φακό μου αναμμένο για τον ακριβή αριθμό χιλιοστών του δευτερολέπτου καθώς ρίχνει το ζάρι και μετά τον κλείνω. Έτσι, αν έβγαζα ένα 12 θα κρατούσα το φως μου αναμμένο για 12 χιλιοστά του δευτερολέπτου. Τώρα το πρόβλημα με τα παραπάνω είναι ότι, για εσάς και για μένα, δεν υπάρχει περίπτωση να μπορέσουμε να χρονομετρήσουμε τα πράγματα αρκετά σωστά για να διακρίνουμε μεταξύ 5 χιλιοστών του δευτερολέπτου και 12 χιλιοστά του δευτερολέπτου Αλλά τι γίνεται με αυτό: Ας υποθέσουμε ότι αποφασίσαμε ότι θα κρατήσω το φως μου αναμμένο για ένα χρόνο για κάθε αριθμό στα ζάρια; Στη συνέχεια, αν ρίξω ένα 12 θα έριχνα το φως σε εσάς για 12 χρόνια και νομίζω ότι θα συμφωνήσετε ότι δεν υπάρχει πιθανότητα να κάνετε λάθος στο να καταλάβετε τον αριθμό σωστά; Θα μπορούσατε να κάνετε ένα διάλειμμα και να παίξετε μπέιζμπολ, θα μπορούσατε ακόμη και να παίξετε craps στο Βέγκας για 6 μήνες, αρκεί κάποια στιγμή κατά τη διάρκεια του έτους να ρίξετε μια ματιά στην απέναντι πλευρά για να δείτε αν το φως είναι αναμμένο. Λοιπόν, αυτό ακριβώς κάνουμε για τους μικροελεγκτές! Ένα χιλιοστό του δευτερολέπτου για την CPU είναι σαν ένα έτος. Έτσι, εάν ενεργοποιήσω το σήμα για 12 χιλιοστά του δευτερολέπτου, δεν υπάρχει σχεδόν καμία πιθανότητα ο άλλος μικροελεγκτής να το μπερδέψει για 10 ή 11, ανεξάρτητα από το τι διακόπτει και τι δεν συμβαίνει εν τω μεταξύ. Για τους μικροελεγκτές, ένα χιλιοστό του δευτερολέπτου είναι μια αιωνιότητα. Λοιπόν, εδώ είναι αυτό που θα κάνουμε. Αρχικά θα επιλέξουμε δύο θύρες στο χειριστήριο για να είναι οι θύρες επικοινωνίας μας. Θα χρησιμοποιήσω το PD6 για τη λήψη δεδομένων (θα μπορούσαμε να το ονομάσουμε Rx αν θέλουμε) και θα επιλέξω το PD7 για τη μετάδοση δεδομένων (θα μπορούσαμε να το ονομάσουμε Tx αν μας αρέσει). Το τσιπ αναλυτή θα ελέγχει περιοδικά την ακίδα Rx και αν βλέπει σήμα θα πέσει σε "υπορουτίνα επικοινωνίας" και στη συνέχεια θα μεταδώσει ένα σήμα επιστροφής στον κύλινδρο ζαριών λέγοντας ότι είναι έτοιμο για λήψη. Θα ξεκινήσουν και οι δύο χρονισμός και ο κύλινδρος ζαριών θα μεταδίδει ένα σήμα (δηλ. 5V) για χιλιοστό του δευτερολέπτου ανά αριθμό στα ζάρια. Έτσι, εάν ο ρόλος ήταν διπλός έξι, ή 12, τότε ο κύλινδρος ζαριών θα έβαζε το PD7 σε 5V για 12 χιλιοστά του δευτερολέπτου και στη συνέχεια θα το επέστρεφε σε 0V. Ο αναλυτής θα ελέγχει τον ακροδέκτη PD6 κάθε χιλιοστό του δευτερολέπτου, μετρώντας κάθε φορά και όταν επιστρέψει στα 0V, τότε βγάζει τον αριθμό που προκύπτει στην οθόνη του αναλυτή, δείχνοντας ένα δώδεκα σε δυαδικό ψηφίο στα LED. Αυτό είναι το σχέδιο. Ας δούμε αν μπορούμε να το εφαρμόσουμε.

Βήμα 2: Υπορουτίνες επικοινωνιών

Το πρώτο πράγμα που πρέπει να κάνουμε είναι να συνδέσουμε τους δύο ελεγκτές. Πάρτε λοιπόν ένα καλώδιο από το PD6 στο ένα και συνδέστε το στο PD7 από την άλλη και αντίστροφα. Στη συνέχεια, προετοιμάστε τα ρυθμίζοντας το PD7 σε OUTPUT και στα δύο και το PD6 σε INPUT και στα δύο. Τέλος, ρυθμίστε τα όλα σε 0V. Συγκεκριμένα, προσθέστε τα ακόλουθα στην ενότητα Init ή Reset του κώδικα σε κάθε μικροελεγκτή:

sbi DDRD, 7; Το PD7 έχει οριστεί σε έξοδο

cbi PortD, 7; PD7 αρχικά 0V cbi DDRD, 6; Το PD6 έχει οριστεί σε είσοδο cbi PortD, 6; PD6 αρχικά 0V clr συνολικά. συνολικά σε ζάρια αρχικά 0

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

Στη συνέχεια, γράψτε μια υπορουτίνα για επικοινωνία με τον αναλυτή:

ΕΠΙΚΟΙΝΩΝΩ:

cbi PortD, 7 sbi PortD, 7; Αποστολή έτοιμου σήματος αναμονής: sbic PinD, 6; διαβάστε το PinD και παραλείψτε εάν η καθυστέρηση αναμονής 0V rjmp 8. καθυστέρηση συγχρονισμού (βρέθηκε αυτό πειραματικά) αποστολή: dec συνολική καθυστέρηση 2? καθυστέρηση για κάθε μέτρηση μήτρας cpi συνολικά, 0; 0 εδώ σημαίνει ότι έχουν αποσταλεί "συνολικές" καθυστερήσεις αριθμών breq PC+2 rjmp send cbi PortD, 7; Σύνολο PD7 έως 0V clr. επαναφέρετε το σύνολο των ζαριών σε 0 ret

Στον αναλυτή προσθέτουμε μια κλήση από την κύρια ρουτίνα στην υπορουτίνα επικοινωνίας:

αναλυτής clr? προετοιμαστείτε για νέο αριθμό

sbic PinD, 6; ελέγξτε το PD6 για σήμα 5V rcall επικοινωνία? αν 5V πάνε για να επικοινωνήσουν αναλυτή mov, συνολικά? έξοδος στον αναλυτή rcall αναλυτή

και στη συνέχεια γράψτε την υπορουτίνα επικοινωνίας ως εξής:

ΕΠΙΚΟΙΝΩΝΩ:

clr σύνολο? επαναφορά του συνόλου σε 0 καθυστέρηση 10? καθυστέρηση για να απαλλαγούμε από αναπηδήσεις sbi PortD, 7? ρυθμίστε το PB7 σε 5V για λήψη σήματος έτοιμο: καθυστέρηση 2; περιμένετε τον επόμενο αριθμό συνολικά αύξηση συνολικού sbic PinD, 6; αν το PD6 επιστρέψει στα 0V τελειώσαμε με την λήψη rjmp. διαφορετικά δημιουργήστε αντίγραφο ασφαλείας για περισσότερα δεδομένα cbi PortD, 7. επαναφορά PD7 όταν τελειώσει ret

Ορίστε! Τώρα κάθε μικροελεγκτής έχει ρυθμιστεί για να επικοινωνεί το αποτέλεσμα της ρίψης ζαριών και στη συνέχεια να το εμφανίζει στον αναλυτή.

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

Άσκηση 1: Δείτε αν μπορείτε να εφαρμόσετε την καλύτερη μέθοδο και χρησιμοποιήστε τη για να μεταφέρετε το ζάρι ως δυαδικό αριθμό 8-bit.

Θα επισυνάψω ένα βίντεο που δείχνει το δικό μου σε λειτουργία.

Βήμα 3: Συμπέρασμα

συμπέρασμα
συμπέρασμα

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

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

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

Άσκηση 2: Αντί να χρησιμοποιήσετε ένα έτοιμο σήμα για να δείξετε πότε ο κύλινδρος ζαριών είναι έτοιμος για μετάδοση και ένας άλλος όταν ο αναλυτής είναι έτοιμος να λάβει, χρησιμοποιήστε μια "εξωτερική διακοπή" που ονομάζεται "Διακοπή αλλαγής καρφίτσας". Οι ακίδες στο atmega328p μπορούν να χρησιμοποιηθούν με αυτόν τον τρόπο, γι 'αυτό έχουν το PCINT0 μέσω του PCINT23 δίπλα τους στο διάγραμμα pinout. Μπορείτε να το εφαρμόσετε ως διακοπή με παρόμοιο τρόπο όπως κάναμε με τη διακοπή υπερχείλισης του χρονοδιακόπτη. Σε αυτή την περίπτωση ο "χειριστής" διακοπής θα είναι το υποπρόγραμμα που επικοινωνεί με τον κύλινδρο ζαριών. Με αυτόν τον τρόπο δεν χρειάζεται να καλέσετε στην πραγματικότητα την υπορουτίνα επικοινωνιών από το main: θα πάει εκεί κάθε φορά που υπάρχει διακοπή που προέρχεται από μια αλλαγή κατάστασης σε αυτήν την καρφίτσα.

Άσκηση 3: Ένας πολύ καλύτερος τρόπος επικοινωνίας και μεταφοράς δεδομένων μεταξύ ενός μικροελεγκτή σε μια συλλογή άλλων είναι η ενσωματωμένη σειριακή διεπαφή 2 συρμάτων στον ίδιο τον μικροελεγκτή. Προσπαθήστε να διαβάσετε την ενότητα 22 του φύλλου δεδομένων και δείτε αν μπορείτε να καταλάβετε πώς να το εφαρμόσετε.

Θα χρησιμοποιήσουμε αυτές τις πιο απλοποιημένες τεχνικές στο μέλλον όταν προσθέσουμε επιπλέον ελεγκτές.

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

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

Μέχρι την επόμενη φορά…

Συνιστάται: