Εξερευνήθηκαν τα βασικά στοιχεία του μικροελεγκτή

Δοκιμάστε Το Όργανο Μας Για Την Εξάλειψη Των Προβλημάτων





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

Εισαγωγή

Βασικά συσκευές μικροελεγκτή χρησιμοποιούνται ευρέως σε εφαρμογές που περιλαμβάνουν εκτιμήσεις του περιβάλλοντος περιβάλλοντος και σε παρόμοια ηλεκτρονικά.



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

Η πρωταρχική κατανόηση σχετικά με τους μικροελεγκτές θα μπορούσε να ληφθεί αναφερόμενος στον μικροελεγκτή AVR Amega32 που είναι τόσο προηγμένος που μερικές φορές ονομάζεται υπολογιστής μέσα σε ένα τσιπ.



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

Η γλώσσα του προγράμματος που θα δείτε εδώ είναι το C ++. Θα μάθετε αυτήν τη γλώσσα σε μεγαλύτερο βάθος στο μάθημα εδώ.

Όταν πρόκειται για MCU, έχετε τη δυνατότητα να έχετε την επιλογή ελέγχου και διαμόρφωσης όλων των pinouts.

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

Σε ένα τσιπ MCU, όλες οι καρφίτσες εκτός από τις Vdd και Vss που είναι οι καρφίτσες ισχύος του τσιπ, μπορούν να αντιστοιχιστούν με αποκλειστικές ονομασίες.

Λεπτομέρειες Pinout

Αν κοιτάξετε το chip από την κορυφή, θα βρείτε μια μικρή τριγωνική εγκοπή που δείχνει το σημείο εκκίνησης από το σημείο έναρξης των pinouts μετράει ότι η # 1 καρφίτσα του chip ξεκινά ακριβώς κάτω από αυτήν την εγκοπή.

Ξεκινώντας από αυτόν τον πείρο θα βρείτε 20 καρφίτσες μέχρι το κάτω μέρος αυτής της πλευράς (αριστερά) και άλλες 20 καρφίτσες στην άλλη πλευρά (δεξιά), συνεχίζοντας από κάτω προς τα πάνω στη δεξιά πλευρά.

Οι πρώτες 8 ακίδες που ξεκινούν από την εγκοπή είναι το PBO-7 που σχηματίζουν τις καρφίτσες ευρετηρίου του IC αφού όλα τα προγράμματα εδώ ξεκινούν με το ευρετήριο μηδέν.

Η παραπάνω σειρά pinouts ονομάζεται PORT B, ενώ υπάρχουν και άλλα πανομοιότυπα σύνολα θυρών που έχουν αντιστοιχιστεί A σε D.

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

Δύο από τους ακροδέκτες που ανήκουν στη γενική κατηγορία είναι οι ακίδες (+) / (-) οι οποίες αναφέρονται επίσης ως Vdd και GND.

Μπορεί να φαίνεται ένας πείρος από το PORT D (PDO-6) που βρίσκεται στην αριστερή πλευρά του τσιπ στην κάτω περιοχή.

Το PD7 που είναι ο πείρος # 7 του PORT D θα μπορούσε να εντοπιστεί μόνος του και ξεκινώντας τη σειρά των pinouts στη δεξιά πλευρά.

Τώρα προχωρώντας από τη δεξιά πλευρά του τσιπ όπου τελειώνει το PORT D, το PORT C ξεκινά τη μέτρησή του προς τα πάνω με τη σειρά.

Αυτά συμβάλλουν στις πολλές ενδιαφέρουσες καρφίτσες του MCU από αναλογικές έως ψηφιακές.

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

Οι παραπάνω καρφίτσες αποτελούν το PORT A.

Η αναλογική σε ψηφιακή μετατροπή μεταξύ των παραπάνω ακίδων θα μπορούσε να γίνει κατανοητή με τη βοήθεια ενός παραδείγματος όπου ένα αναλογικό επίπεδο θερμοκρασίας που ανιχνεύεται χρησιμοποιώντας έναν συνηθισμένο αισθητήρα όπως ένα θερμοστάτη εφαρμόζεται σε έναν από τους ακροδέκτες PORT A που είναι εύκολα αποδεκτός και μετατρέπεται από το MCU για την παραγωγή ψηφιακής ανάγνωσης από μηδέν έως 255 βαθμούς F (σχήμα 8-bit που θα μπορούσε να αναβαθμιστεί για επίτευξη εξόδου 10-bit).

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

Επιπλέον, οι MCU έχουν ενσωματωμένο ρολόι για την καταμέτρηση των σχετικών παραμέτρων.

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

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

Πώς να δημιουργήσετε μια σύνδεση SPI από τον προγραμματιστή στον μικροελεγκτή

Τώρα είναι ώρα να πάμε λίγο πιο βαθιά στο θέμα και να ερευνήσουμε τον κόσμο του προγραμματισμού.

Τούτου λεχθέντος, πριν ξεκινήσουμε μια διαδικασία φόρτωσης προγράμματος στο τσιπ, πρέπει να βρούμε έναν κατάλληλο τρόπο για να ενσωματώσουμε τη σύνδεση SPI (Serial Peripheral Interface) με το MCU.

Ωστόσο, ακόμη και μετά από αυτό, δεν μπορούμε απλώς να ωθήσουμε το SPI στα σημεία σύνδεσης MCU, έτσι; Ούτε μπορούμε να επιτρέψουμε στα εκτεταμένα καλώδια από το SPI να εισάγονται απευθείας στην πλακέτα ψωμιού. Αυτό μπορεί επίσης να προκαλέσει εσφαλμένη ρύθμιση καλωδίων που συνδέεται με εσφαλμένες ακίδες που κάνουν κακές συνδέσεις.

Επομένως, για να κάνουμε τα πράγματα εντελώς άψογα, κάνουμε τις διαδικασίες πάνω σε μια μικρή πλακέτα όπου έχουμε τις απαιτούμενες μεταλλικές ακίδες που ονομάζονται επίσης «επικεφαλίδα» συγκολλημένες. Αυτές οι καρφίτσες κεφαλίδας θα μπορούσαν τώρα να χρησιμοποιηθούν για σύνδεση με την υποδοχή SPI. Οι συνδέσεις από αυτήν την κεφαλίδα μπορούν να τερματιστούν σε άλλες παράλληλες καρφίτσες κεφαλίδας που μπορούν να χρησιμοποιηθούν για τις συνδέσεις του breadboard.

Έτσι, το παραπάνω συγκρότημα σχηματίζει τώρα μια άνετη και αξιόπιστη ενδιάμεση πλατφόρμα σύνδεσης για το SPI στο MCU.

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

Μπορεί να υπάρξει μια σειρά εταιρειών που κατασκευάζουν και πωλούν αυτές τις μονάδες προγραμματιστών, οπότε η προμήθεια αυτών δεν πρέπει να αποτελεί πρόβλημα για εσάς, όπως Adafruit Industries, USBtinyISP ή Sparkfun κ.λπ.

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

Ωστόσο, βεβαιωθείτε ότι κάποιος σκέφτεται, εάν χρησιμοποιείτε κάποιο άλλο MCU και όχι ένα AVR Atmega32, ίσως χρειαστεί να ελέγξετε έναν αντίστοιχο συμβατό προγραμματιστή για το συγκεκριμένο τσιπ MCU.

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

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

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

Το παραπάνω σχήμα δείχνει τις λεπτομέρειες σύνδεσης που πρέπει να ακολουθήσετε ενώ διασυνδέετε τα καλώδια μεταξύ των κεφαλίδων.

Για να κάνουμε τα πράγματα ακόμα πιο απλά, ας δούμε τις ακόλουθες λεπτομέρειες σύνδεσης για το ίδιο, ανατρέχοντας στην παραπάνω εικόνα:

Ο πείρος SPI ξεκινώντας από πάνω αριστερά πηγαίνει στο 'Master IN, Slave OUT' (MISO)

Ο πείρος SPI από το κέντρο αριστερά συνδέεται με τον πείρο ρολογιού (SCK)

Ο πείρος SPI κάτω αριστερά ενώνεται με το Reset. (Θα μάθουμε λεπτομερώς σχετικά με αυτήν την καρφίτσα στα ακόλουθα σεμινάρια)

SPI σχετικό με τα κάτω δεξιά άγκιστρα με τον πείρο GND του MCU, το GND αναφέρεται στον πείρο που σχηματίζει τη γραμμή μηδενικής τροφοδοσίας ή την αρνητική (σχετική) ράγα της τροφοδοσίας.

Το SPI που τερματίζεται από τη μεσαία δεξιά κεφαλίδα συνδέεται με την καρφίτσα 'Master Out, Slave IN' (MOSI) του MCU.

Το SPI που βγαίνει από την επάνω δεξιά κεφαλίδα συνδέεται με το (+) του MCU, το οποίο είναι προφανώς το Vdd ή ο θετικός πείρος τροφοδοσίας του MCU.

Αυτό είναι.

Συνδέστε τους δύο συνδετήρες όπως εξηγείται και ο πίνακας διασύνδεσης SPI είναι έτοιμος για τις απαιτούμενες ενέργειες.

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

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

Δημιουργία ενός απλού κώδικα προγραμματισμού για ένα MCU

Παίρνουμε μια μονάδα USBTinyISP διαθέσιμη από το Sparkfun, για σύνδεση του υπολογιστή με τον μικροελεγκτή.

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

Ας ρίξουμε μια ματιά στις διαδικασίες που απαιτούνται για την εγκατάσταση των προγραμμάτων οδήγησης στο λειτουργικό σύστημα του υπολογιστή σας, ακολουθούμε το παράδειγμα του λειτουργικού συστήματος Windows 7 με προδιαγραφές 32-bit ή 64-bit.

Ανοίξτε το sparkfun.com και κάντε κλικ στη «σελίδα προγραμματιστή τσέπης AVR». Ο σύνδεσμος μπορεί να απεικονιστεί εύκολα μέσα στη σελίδα.

Στη συνέχεια, βρείτε το 'Πρόγραμμα οδήγησης Windows' κάτω από έγγραφα και απλά κάντε κλικ σε αυτό.

Αυτό θα σας παρέχει το αρχείο pocketprog-driver.zip στον υπολογιστή σας.

Μεταβείτε στον υπολογιστή σας, βρείτε τη θέση λήψης και απλώς αποσυμπιέστε το ληφθέν αρχείο σε ένα φάκελο.

Σε περίπτωση που ο υπολογιστής σας είναι λειτουργικό σύστημα 64-bit, θα πρέπει να ακολουθήσετε μερικά ακόμη βήματα όπως δίνονται παρακάτω, με λειτουργικό σύστημα 32-bit, μπορείτε να ξεκινήσετε απευθείας την εγκατάσταση από το αποσυνδεδεμένο αρχείο.

Για 64-bit ακολουθήστε αυτά, για 32-bit απλώς αγνοήστε:

Google 'libusb sourceforge' και κάντε κλικ σε αυτήν την σύνδεση τελευταία έκδοση.

Θα συναντήσετε μερικά επιπλέον αρχεία, ωστόσο θα σας ενδιαφέρει να βρείτε το αρχείο bib, δηλαδή: libusb-win32-bin - #. #. #. #. Zip

Τώρα, μεταβείτε και βρείτε αυτήν τη θέση λήψης στον υπολογιστή σας, αποσυμπιέστε και αποθηκεύστε την σε έναν από τους φακέλους.

Σε αυτόν τον φάκελο, μεταβείτε στον φάκελο του κάδου, προχωρώντας στον φάκελο amd64.

Θα δείτε μερικούς φακέλους εδώ ως: ghcalled libusb0.dll και libusb0.sys.

Θα θέλατε να μετονομάσετε αυτά ως: libusb0_x64.dll και libusb0_x64.sys.

Τώρα θα χρειαστεί να αντιγράψετε τα παραπάνω αρχεία στον φάκελο pocketprog-driver, απλά να αντικαταστήσετε τα αρχεία στην υπάρχουσα έκδοση.

Για να εγκαταστήσετε τα παραπάνω προγράμματα οδήγησης, σας ενδιαφέρει η ακόλουθη μέθοδος που είναι μάλλον μη συμβατική στον τύπο της:

Είναι μια λειτουργία 'προσθήκη υλικού παλαιού τύπου'.

Κάντε κλικ στο 'Start Menu'

Στη συνέχεια, προχωρήστε κάνοντας δεξί κλικ στον 'υπολογιστή'

Κάντε κλικ στο 'Διαχείριση' και τέλος κάντε κλικ στο 'Διαχείριση συσκευών'

Στη συνέχεια, μέσα στο μενού, επιλέξτε 'Προσθήκη παλαιού υλικού'

Πηγαίνετε για να πατήσετε 'επόμενο', μέχρι να εισαχθεί ο οδηγός

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

Τώρα απλώς κάντε κλικ στο 'Επόμενο'

Αυτό θα σας δείξει το μενού 'Εμφάνιση όλων των συσκευών' στο οποίο θα πρέπει να κάνετε κλικ.

Μετά από αυτό προχωρήστε για να κάνετε κλικ στο εικονίδιο 'Have Disk'.

Με τη βοήθεια του εικονιδίου 'Αναζήτηση', προχωρήστε στη θέση του φακέλου pocketprog-driver. Εάν η επιλογή έγινε σωστά από εσάς, θα απεικονίσετε το αρχείο pocketprog.inf που βρίσκεται στον συγκεκριμένο φάκελο.

Κάντε διπλό κλικ πάνω σε αυτό το αρχείο και σίγουρα θα δείτε το πρόγραμμα οδήγησης να εγκατασταθεί στον υπολογιστή σας.

Πάνω και έξω !! Ας συνεχίσουμε με τον επόμενο οδηγό μας στην επόμενη σελίδα.

Μέχρι τώρα ενδέχεται να έχετε εγκαταστήσει το απαιτούμενο λογισμικό και να έχετε δημιουργήσει τη διεπαφή SPI.

Πώς να μεταφέρετε ένα πρόγραμμα σε ένα τσιπ μικροελεγκτή

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

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

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

Το AVRdude είναι ένα πρόγραμμα που σχετίζεται με την τελευταία εγκατάσταση WinAVR χωρίς την οποία δεν είναι δυνατή η πραγματική μεταφορά του αρχείου στο MCU.

Αυτό το πρόγραμμα είναι μια μορφή αρχείου .hex που ουσιαστικά γίνεται κατανοητή από το MCU για τις απαιτούμενες εκτελέσεις.

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

Ας δούμε γρήγορα πώς μπορούμε να εφαρμόσουμε τη διαδικασία δοκιμής με τη βοήθεια των παρακάτω οδηγιών:

Ανοίξτε την προτροπή DOS (λειτουργικό σύστημα δίσκου) κάνοντας κλικ στο 'μενού έναρξης' και πληκτρολογώντας cmd.exe στο δεδομένο πλαίσιο αναζήτησης.

Τώρα η εκτέλεση του AVRdude μπορεί να γίνει απλά πληκτρολογώντας το avrdude –c usbtiny –p m32 πάνω από την προτροπή DOS. Μόλις εφαρμοστεί, το DOS θα αναγνωρίσει αμέσως εάν η σύνδεση ήταν επιτυχής.

Στην παραπάνω εντολή, το '-c' είναι μια ειδοποίηση που περιλαμβάνει την προδιαγραφή παραμέτρων προγραμματιστή 'usbtiny', ενώ η ετικέτα '-p' προσδιορίζει τη συσκευή μικροελεγκτή ('m32 που υποδεικνύει Atmega32).

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

Μόλις ολοκληρωθεί η παραπάνω διαδικασία, μπορείτε να πληκτρολογήσετε 'έξοδος' πάνω από την προτροπή DOS και αυτό θα σας μετακινήσει έξω από το παράθυρο.

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

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

Η τιμή της αντίστασης μπορεί να υπολογιστεί χρησιμοποιώντας τον ακόλουθο απλό τύπο:

R = (Ub - LEDfwd) / I

Όπου το Ub είναι η τάση τροφοδοσίας, το LEDfwd είναι η βέλτιστη τάση λειτουργίας του χρησιμοποιούμενου LED και I είναι οι βέλτιστοι ενισχυτές.

Ας υποθέσουμε ότι χρησιμοποιούμε ένα ΚΟΚΚΙΝΟ LED που έχει μια μπροστινή τάση LED = 2.5V και ρεύμα I = 20mA, η παραπάνω εξίσωση μπορεί να λυθεί ως εξής:

Δεδομένου ότι η τάση από MCU θα ήταν 5V, μπορεί να εκφραστεί ως:

R = (5 - 2,5) /. 02 = 125 ohms, ¼ watt, η πλησιέστερη τιμή είναι 120 ohms.

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

Μόλις γίνει αυτό, το MCU θα μπορούσε να προγραμματιστεί για την προβλεπόμενη απόκριση στο παραπάνω LED.

Στη συνέχεια, ο προγραμματισμός του MCU.

Προκειμένου να επιτρέπεται στον μικροελεγκτή να εκτελεί κάποιες ουσιαστικές υλοποιήσεις, είναι επιτακτική ανάγκη να γράφετε κατάλληλες οδηγίες στο MCU.

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

Γι 'αυτό θα μπορούσαμε πιθανώς να χρησιμοποιήσουμε τον δικό μας 'επεξεργαστή κειμένου' στον υπολογιστή μας, αν και ίσως να εκτιμούμε τη χρήση ενός πιο επαγγελματικού 'περιβάλλοντος προγραμματισμού' αντί ενός απλού προγράμματος επεξεργασίας κειμένου, απλό γιατί αυτή η προσέγγιση θα σας επιτρέψει να απολαύσετε μερικά ενσωματωμένα ενδιαφέροντα χαρακτηριστικά σε αυτό το πακέτο «περιβάλλον προγραμματισμού».

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

Τελικά αυτό θα υποστηριζόταν από το WinAVR και θα μεταφερθεί στο σχετικό τσιπ MCU.

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

Θα θέλατε η πορεία εγκατάστασης του WinAVR να είναι εξαιρετικά γρήγορη και γρήγορη. Ας δούμε τις λεπτομέρειες με τα ακόλουθα σημεία:

Θα χρειαστεί να κατεβάσετε τις πιο πρόσφατες εκδόσεις από το φάκελο WinAVR source forge files. Θα συναντήσετε μερικές χρήσιμες πληροφορίες σχετικά με αυτήν τη λήψη από τον επίσημο ιστότοπό της.

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

Κατεβάστε το αρχείο και ξεκινήστε τη διαδικασία εκτέλεσης κάνοντας κλικ σε αυτό. Αφήστε την εγκατάσταση να ξεκινήσει.

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

Μέχρι τώρα θα βρείτε τα πάντα αρκετά φυσιολογικά και άνετα και θα βρείτε μερικές επιλογές από το αρχικό μενού που σας ρίχνονται. Μην ανησυχείτε, μόνο μερικά από αυτά θα χρησιμοποιούν μόνο ένα από τα tem που ονομάζονται 'σημειωματάριο προγραμματιστών'.

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

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

Το επόμενο σεμινάριο θα καλύψει τη δοκιμή του παραπάνω προγραμματιστή, ώστε να μπορούμε να είμαστε σίγουροι σχετικά με τη συμβατότητά του με τα Windows και εάν 'χειραψεί τέλεια' με το IC του μικροελεγκτή σας.

Πώς να προγραμματίσετε ένα MCU για ενεργοποίηση ενός LED

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

Φυσικά είμαστε τώρα έτοιμοι να εφαρμόσουμε το πρώτο μας πρόγραμμα μέσα στο MCU, αλλά πριν από αυτό θα ήταν ενδιαφέρον να συνοψίσουμε γρήγορα τι κάναμε κατά τη διάρκεια των προηγούμενων σεμιναρίων μας:

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

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

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

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

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

Είναι πολλή δουλειά, ωστόσο είναι καιρός να κατευθυνθείτε αμέσως σε κάποια πραγματικά πράγματα προγραμματισμού!

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

Έλεγχος, ανίχνευση και επικοινωνία

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

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

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

Προχωρώντας με την παρούσα εργασία, κάνοντας τον έλεγχο MCU το LED είναι πραγματικά πολύ απλό:

Γι 'αυτό δίνουμε εντολή στον ακροδέκτη # 0 στο PORT B ​​να παράγει τα απαιτούμενα 5V για το LED.

Θυμηθείτε από το προηγούμενο σεμινάριο, συνδέσαμε την άνοδο του LED με τον παραπάνω ακροδέκτη του MCU.

Υπάρχουν δύο βασικά πράγματα που πρέπει να αντιμετωπιστούν σε αυτόν τον πείρο της MCU: 1) έξοδος και 2) 5 βολτ

Θα μάθουμε έναν τρόπο με τον οποίο θα καθοδηγήσουμε τη συγκεκριμένη καρφίτσα να γίνει η έξοδος του MCU.

Μόλις οριστεί να είναι η έξοδος του τσιπ, ενδέχεται να το καθοδηγήσουμε να είναι είτε «υψηλό» (5V) είτε «χαμηλό» (0V) όπως επιθυμείτε για μια εφαρμογή.

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

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

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

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

Για να εκχωρήσουμε έναν πείρο ως έξοδο πρέπει να χρησιμοποιήσουμε το Data Direction Register (DDR). Εάν αναρωτιέστε τι σημαίνει εδώ, είναι απλώς ένας χώρος στο MCU που επιτρέπει στον μικροελεγκτή να ανταποκρίνεται με συγκεκριμένο τρόπο.

Χρησιμοποιώντας το DDR μπορούμε να ρυθμίσουμε το pin είτε να στείλει δεδομένα που μοιάζουν με 'έξοδο', είτε να δεχτούμε δεδομένα που έχουν τη μορφή 'input'.

Ωστόσο, μπορεί να μπερδευτείτε σχετικά με τη λέξη, τι σημαίνει αυτό; Τα δεδομένα προσθέτουν μια τρίτη διάσταση στους ακροδέκτες που μπορεί να αντιστοιχούν συνεχώς στο λογικό μηδέν (0V) ή στο λογικό υψηλό (5V), αλλά τι γίνεται με τα σήματα που θα μπορούσαν να ποικίλουν γρήγορα, όπως συχνότητα παλμών. Μια συχνότητα θα συνοδευόταν με υψηλή και χαμηλή λογική (5V και 0V) που ταλαντεύεται με ορισμένα καθορισμένα διαστήματα ή περιόδους, έτσι γίνεται χρονικά προσανατολισμένη και μπορεί να προσαρμοστεί σε σχέση με το χρόνο, γι 'αυτό προσδιορίζουμε ως «δεδομένα» που σημαίνει μια παράμετρο που δείχνει μια συνάρτηση σε σχέση με μια άλλη συνάρτηση (καταστάσεις λογικής και χρόνος).

Μια μέθοδος εκχώρησης του pin0 ως εξόδου είναι γράφοντας τον ακόλουθο κώδικα:

DDRB = 0b00000001

Στο παραπάνω πρόγραμμα, το DDRB δηλώνει το Data Direction Register για το PORT B ​​0b δίνει εντολή στον μεταγλωττιστή σχετικά με την ακόλουθη δυαδική έκφραση ενός αριθμού, ενώ το '1' στο τέλος της έκφρασης δείχνει τη θέση του pin0, δηλαδή είναι η θέση του στη φόρμα του πρώτου πείρου του PORT B.

Αν θυμάστε μάθαμε ότι το PORT B ​​συσχετίζει 8 ακίδες με αυτό (από 0 έως pin7) και αν παρατηρήσετε ότι ο παραπάνω κώδικας έχει επίσης 8 ψηφία σε αυτό, που σημαίνει ότι κάθε ψηφίο σημαίνει αυτές τις 8 ακίδες του PORT B.

Τώρα η επόμενη διαδικασία θα ήταν να αντιστοιχίσετε 5V σε αυτόν τον πείρο (pin0). Και πάλι, η αρχή της λειτουργίας είναι ίδια με το DDR όπως εκφράζεται παραπάνω μέσω του ακόλουθου δυαδικού κώδικα:

PORTB = 0b00000001

Όπως μπορεί να φανεί, η μόνη διαφορά μεταξύ του παραπάνω κώδικα και του προηγούμενου είναι ότι σε αυτόν τον κώδικα χρησιμοποιήσαμε το μητρώο PORT. Αυτός ο καταχωρητής χειρίζεται συγκεκριμένα τις αναθέσεις pin της συγκεκριμένης θύρας για την οποία έχει τοποθετηθεί μέσα στο MCU. Έτσι μας επιτρέπει να αντιστοιχίσουμε τη λογική πραγματικών δεδομένων (0 ή 1) για αυτά τα pinouts.

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

Η «κύρια» συνάρτηση εδώ είναι η τοποθεσία όπου κάθε ένα από τα προγράμματα C / C ++ ξεκινά την εκτέλεση. Επομένως το κύριο μπορεί να δημιουργηθεί ως:

int main (άκυρο)
{
}

Ωστόσο, για να μπορέσει το πρόγραμμα να ερμηνεύσει τα στοιχεία καταχώρησης DDR και PORT και τη λειτουργία τους μέσα στο τσιπ MCU, πρέπει να συμπεριληφθεί μια πρόσθετη δήλωση που μπορεί να αποτελείται από όλα τα δεδομένα σχετικά με το AVR MCU. Ίσως θα θέλαμε να προσθέσουμε αυτήν την συμπερίληψη σε όλα τα προγράμματά μας.

#περιλαμβάνω
int main (άκυρο)
{
}

Μόλις ξεκινήσει η συλλογή, η ενότητα προ-επεξεργαστή του μεταγλωττιστή εστιάζει στον κατάλογο AVR για την αναγνώριση του αρχείου «io.h». Η επέκταση '.h' εδώ υποδεικνύει ότι είναι ένα αρχείο κεφαλίδας και ότι αυτός ο κώδικας μέσα στο αρχείο θα εισαχθεί στην αρχή (κεφαλίδα) του αρχείου προέλευσης που δημιουργείται, εξ ου και το όνομα 'κεφαλίδα'.

Εδώ μπορούμε να εισαγάγουμε τις δηλώσεις DDR και PORT στον κώδικά μας, επειδή η προσθήκη του αρχείου κεφαλίδας io.h θα οδηγούσε τον μεταγλωττιστή σχετικά με αυτές.

#περιλαμβάνω

int main (άκυρο)

{

DDRB = 0b00000001 // Εγγραφή κατεύθυνσης δεδομένων Ρύθμιση pin0 στην έξοδο και οι υπόλοιπες ακίδες ως είσοδος

PORTB = 0b00000001 // Ρύθμιση pin0 έως 5 volt

}

Τα παραπάνω διορθώνουν τον προσανατολισμό του pin0 ως έξοδο, με μέγεθος 5V. Ωστόσο, εξακολουθεί να υπάρχει ένα ζήτημα που δεν έχει καθοριστεί για αυτήν την πινέζα, είναι ότι αυτή η πινέζα δεν έχει ακόμη δοθεί οδηγίες για να ενεργοποιηθεί επ 'αόριστον, εφόσον το MCU είναι ενεργοποιημένο. Αυτός ο άπειρος βρόχος ανάδρασης θα διασφαλίσει ότι αυτός ο πείρος από το MCU δεν θα απενεργοποιείται, αλλά συνεχίζει με την έξοδο 5V επ 'αόριστον.

Παρόλο που υπάρχουν πολλές διαφορετικές μέθοδοι εφαρμογής μιας εντολής βρόχου για έναν πείρο, θα προσπαθήσουμε να χρησιμοποιήσουμε τον βρόχο «while» εδώ. Όπως υποδηλώνει το όνομα, ο βρόχος 'while' λέει στον μικροελεγκτή ότι 'ενώ' η ισχύς είναι διαθέσιμη πρέπει να παραμείνετε ενεργοποιημένοι με το εκχωρημένο 5V για την αντιστοιχισμένη pinout.

#περιλαμβάνω

int main (άκυρο)

{

DDRB = 0b00000001 // Εγγραφή κατεύθυνσης δεδομένων Ρύθμιση pin0 στην έξοδο και οι υπόλοιπες ακίδες ως είσοδος

PORTB = 0b00000001 // Ρύθμιση pin0 έως 5 volt

ενώ (1)

{

// Ο κώδικας θα ήταν εδώ αν χρειαζόταν να εκτελείται ξανά και ξανά ... ατελείωτα

}

}

Ίσως θέλετε να σημειώσετε ότι, εδώ έχουμε χρησιμοποιήσει το «1» με τη μορφή ενός επιχειρήματος για το βρόχο «while», καθώς όλα εκτός από το «0» θα μπορούσαν να θεωρηθούν λογικό «αληθινό».

Αυτό συνεπάγεται ότι η αντίληψη βρόχου «while» δεν θα ήταν ποτέ υπεύθυνη για τίποτα εκτός από ένα λογικό «true», που σημαίνει ότι η συγκεκριμένη ακίδα θα ασφαλίσει με την καθορισμένη κατάσταση επ 'αόριστον.

Η ενδεικτική λυχνία LED μπορεί να είναι αναμμένη μόνιμα στον εκχωρημένο πείρο, αρκεί το MCU να έχει ισχύ σε όλες τις Vdd και Vss του.

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

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

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

Θα δούμε πώς μπορεί να προστεθεί αυτός ο βρόχος με καθυστέρηση όπως είναι επιθυμητό, ​​ώστε το LED να αναβοσβήνει με αυτόν τον καθυστερημένο ρυθμό.

Πώς να κάνετε ένα LED να αναβοσβήνει με χρήση μικροελεγκτή AVR

Στην τελευταία συζήτηση, μάθαμε πώς να κάνουμε έναν διακόπτη LED ON μέσω ενός μικροελεγκτή, ήταν εξαιρετικό, έτσι δεν είναι; Μπορεί να μην είναι τόσο πολύ!

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

Ας ρίξουμε μια ματιά σε αυτό:

#περιλαμβάνω

#περιλαμβάνω

int main (άκυρο)

{

DDRB | = 1<< PINB0

ενώ (1)

{

PORTB ^ = 1<< PINB0

_delay_ms (100)

}

}

Εάν αισθάνεστε αμηχανία με αυτά τα παράξενα σύμβολα (&, ^, | κ.λπ.) που χρησιμοποιούνται στην παραπάνω έκφραση (& δεν υπάρχει αλλά θα μπορούσαν να χρησιμοποιηθούν σε άλλους παρόμοιους κωδικούς), εδώ είναι οι σχετικές πληροφορίες που θα σας ενδιέφερε να μάθετε σχετικά με αυτά :

Περιλαμβάνει πολλούς τυπικούς λογικούς αλγόριθμους όπως AND, OR, NOT και XOR που χρησιμοποιούνται συνήθως με τον παραπάνω κώδικα.

Αυτές οι λογικές λειτουργίες συγκρίνουν συγκεκριμένα τα δύο bit '1' και '0' σύμφωνα με τους αντιστοιχισμένους πίνακες αλήθειας.

Θα λάβουμε μια ιδέα αναλύοντας την ακόλουθη ρύθμιση bit:

01001011 &
10001101
ισούται
00001001

Στον παραπάνω κωδικό & αναφέρεται στο AND όπως χρησιμοποιείται στον προγραμματισμό Γ.

Η ανάγνωση των σειρών κάθετα, υποδηλώνει ότι το 0 και το 1 ισούται με 0, 1 και 0 ισούται επίσης με 0, 0 και 0 ισούται με 0, 1 και 1 ισούται με 1. Η ανάγνωση είναι τόσο απλή. Αυτά είναι σύμφωνα με τον πίνακα αλήθειας ενός τελεστή AND.

Εάν αξιολογήσουμε τον παρακάτω πίνακα, υποδεικνύει το σύμβολο '|' δηλώνει τη χρήση της λειτουργίας «Ή», το «|» θα μπορούσε να βρεθεί ακριβώς στα αριστερά του 'backspace' στο πληκτρολόγιο του υπολογιστή σας:

01001011 |
10001101
ισούται
11001111

Ομοίως, αυτός ο πίνακας αλήθειας μιας λειτουργικής λογικής OR δείχνει ότι τα bits 0 ή 1 ισούται με 1, 1 ή 0 ισούται επίσης με 1, 0 ή 0 ισούται με 0, ενώ 1 ή 1 ισούται με 1.

Ο ακόλουθος συνδυασμός bit προορίζεται για τον τελεστή λογικής XOR που υποδηλώνεται με ^ και μπορεί να μελετηθεί όπως κάναμε με τους πίνακες αλήθειας AND, OR:

01001011 ^
10001101
ισούται
11000110

Ας συνεχίσουμε τώρα με το πρώτο πρόγραμμα και μάθετε τι σημαίνει η ακόλουθη γραμμή σε αυτό:

#περιλαμβάνω

Μέσα από τα προηγούμενα μαθήματά μας ξέρουμε πώς λειτουργεί η έκφραση, οπότε δεν θα το επαναλάβουμε, ωστόσο φαίνεται να είναι ένα νέο 'include' που εκφράζεται από το #include που πρέπει να διερευνηθεί.

Σε αυτό «συμπεριλάβετε» η καθυστέρηση.h μας επιτρέπει μερικές εύκολες μεθόδους υλοποίησης.

Όπως υποδηλώνει το όνομα η καθυστέρηση.h μας επιτρέπει να προκαλέσουμε καθυστέρηση στο συγκεκριμένο πρόγραμμα.

Η επόμενη έκφραση int main (void) θα μπορούσε να παραλειφθεί από τη συνεχιζόμενη συζήτηση, δεδομένου ότι το έχουμε ήδη καλύψει στις προηγούμενες δημοσιεύσεις μας.

Στη συνέχεια έρχεται το τροποποιημένο DDRB.

Το παρακάτω δείχνει την παλαιότερη φόρμα που δεν είναι καλύτερος τρόπος εκχώρησης των καρφιτσών, καθώς όλες οι ακίδες από 0 έως 7 άλλαξαν για να σχηματίσουν τις εισόδους. Αλλά φανταστείτε ποια θα ήταν η κατάσταση εάν θέλαμε να δημιουργήσουμε ένα πιο μακρύ πρόγραμμα που θα απαιτούσε αυτές τις ακίδες για κάποια άλλη λειτουργικότητα; Για παράδειγμα, το pin2 θα μπορούσε να χρειαστεί για την εφαρμογή απομακρυσμένης εναλλαγής μιας συσκευής. Σε αυτήν την περίπτωση δεν θα εκτιμούσαμε να εκχωρήσουμε το ίδιο ως εισαγωγή μόνο μέσω δοκιμής και σφάλματος. Αυτό θα μπορούσε να σημαίνει λανθασμένη απόκριση από τον απομακρυσμένο πομπό στον δέκτη της συσκευής.

DDRB = 0b00000001

Θέλουμε να επηρεάσουμε μόνο ένα bit, καπέλο pin0 bit, ρίχνοντας μια ματιά στη λειτουργία 'OR', αυτό θα μπορούσε να εκτελεστεί μέσω δυαδικής κάλυψης.

DDRB = DDRB | 0b00000001

Εδώ είναι καλυμμένο με μάσκα 'Ή': 0b00000001, αν και φαίνεται να είναι ένας αυθεντικός δυαδικός αριθμός, σε περίπτωση που το προηγούμενο DDRB για παράδειγμα: 0b01001010, τότε η εφαρμογή OR σε αυτό μέσω της κάλυψης θα μπορούσε να δώσει: 0b00000001 = 0b01001011.

Η προκύπτουσα διαφορά όπως φαίνεται, είναι μόνο με το pin0, του οποίου τα bit έχουν αλλάξει!

Η συμπίεση της παραπάνω δήλωσης ακόμη περισσότερο μέσω του C ++ δίνει:

DDRB | = 0b00000001

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

Έτσι, εάν 'DDRB | = 1<< PINBO, why it’s like that?

1<< PINBO is implemented for applying the masking effect. The “1” indicates what may be introduced inside the mask, while the < < is simply the left shift functionality. It executes exactly as it’s named, and PINBO is the number of locations that the “1” would sequence across the left hand side. To be precise PINBO may be equivalent of a 0.

Ξεκινάμε λοιπόν με ένα 0b00000000, και βάζουμε ένα «1» για να παράγουμε 0b0000001 και μετά το μεταφέρουμε στις αριστερές 0 θέσεις, κάτι που δίνει ακριβώς το ίδιο 0b00000001 όπως παραπάνω.

Τώρα, αν υποθέσουμε ότι ήταν PINB4, η δήλωση θα μπορούσε να εκφραστεί ως 1<< PINB4. I this case the “1” would be pushed to the left 4 locations producing: 0b00010000.

Προσοχή χρησιμοποιούμε μηδενικό ευρετήριο που σημαίνει ότι υπάρχουν τέσσερα μηδενικά μετά το '1'.

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

Σε περίπτωση που η εκτέλεση τοποθετηθεί πριν από το βρόχο, θα είχε εφαρμοστεί μόνο μία φορά.

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

Γνωρίζουμε τη διαδικασία ρύθμισης ενός συγκεκριμένου bit στον δυαδικό αριθμό, αλλά δεν είμαστε σίγουροι για τη μέθοδο εφαρμογής ενός συγκεκριμένου bit '0' σε περίπτωση που είναι '1' ακόμα.

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

Οι δύο αρχικές δηλώσεις αλλάζουν το bit σε '1' (5V, φώτα LED), και στη συνέχεια εισάγεται μια παύση για 100 ms.

Οι επόμενες δύο γραμμές μετατρέπουν το bit του PINB0 σε '0' (μηδενική τάση, απενεργοποιημένη η λυχνία LED), αλλά συγγνώμη το AND AND δεν θα είναι σε θέση να εκτελέσει ένα '0' από το bit, αλλά αν χρησιμοποιούμε ΔΕΝ '~' για τη δυαδική μάσκα θα μπορούσε να αλλάξει όλα τα 0s σε 1s και αντίστροφα.

Αυτό θα μας επιτρέψει να επηρεάσουμε μόνο το PINB0 bit και να το μετατρέψουμε στο '0'. Η παρένθεση συμπεριλήφθηκε προκειμένου να περιέχει την εκτέλεση κάλυψης έτσι ώστε η λειτουργία NOT να μπορεί να εφαρμοστεί για ολόκληρες τις μάσκες και όχι απλώς πάνω από το '1' πριν από την αριστερή μετατόπιση '<<”.

PORTB | = 1<< PINB0
_delay_ms (100)
PORTB & = ~ (1<< PINB0)
_delay_ms (100)

Προκειμένου να δημιουργήσουμε τις καθυστερήσεις ON OFF ή τις περιόδους ίσης διάρκειας, ενδέχεται να μειώσουμε τις προηγούμενες τέσσερις γραμμές σε δύο και να εφαρμόσουμε τη λειτουργικότητα XOR προς όφελός μας. Πρέπει να σημειωθεί κατά την εκτέλεση XOR μια αντιστοιχισμένη καρφίτσα στο 1 σε περίπτωση που είναι 0 και το αντίστροφο. Αυτή η εκτέλεση θα επηρεάσει μόνο το PINB0. Όπως πολλές φορές εφαρμόζεται η εντολή, απλώς θα μετατρέψει το bit στο αντίθετο της υπάρχουσας λογικής.

PORTB ^ = 1<< PINB0
_delay_ms (100)

ΕΓΙΝΕ! Η λυχνία LED σας θα αναβοσβήνει τώρα σύμφωνα με τον καθορισμένο ρυθμό…. Απλό, έτσι δεν ήταν;




Προηγούμενο: Κύκλωμα τηλεχειριστηρίου πολλαπλών συσκευών Επόμενο: AC Phase, Neutral, Earth Fault Indicator Circuit