Πίνακας περιεχομένων:
- Προμήθειες
- Βήμα 1: Circut
- Βήμα 2: Διάγραμμα χρονισμού
- Βήμα 3: Προγραμματισμός. Μακροεντολές και ορισμοί
- Βήμα 4: Προγραμματισμός. Κύριος βρόχος
- Βήμα 5: Προγραμματισμός. Βοηθητικές λειτουργίες
- Βήμα 6: Προγραμματισμός. Ρουτίνες Protothread
- Βήμα 7: Εσωτερικά
Βίντεο: Ταυτόχρονος προγραμματισμός Attiny85 ή κολοκύθα με πολύχρωμα μάτια: 7 βήματα
2024 Συγγραφέας: John Day | [email protected]. Τελευταία τροποποίηση: 2024-01-30 08:32
Ακολουθήστε περισσότερα από τον συγγραφέα:
Σχετικά: Εργάζομαι ως μηχανικός λογισμικού σε μία από τις εταιρείες Bay Area (Καλιφόρνια). Όποτε έχω χρόνο μου αρέσει να προγραμματίζω μικροελεγκτές, να κατασκευάζω μηχανικά παιχνίδια και να κάνω κάποια έργα βελτίωσης σπιτιού. Περισσότερα για το jumbleview »
Αυτό το έργο δείχνει πώς μπορείτε να ελέγξετε δύο κοινά LED ανόδων τριών χρωμάτων 10 mm (πολύχρωμα μάτια Pumpkin Halloween Glitter) με τσιπ Attiny85. Στόχος του έργου είναι να εισαγάγει τον αναγνώστη στην τέχνη του ταυτόχρονου προγραμματισμού και στη χρήση της βιβλιοθήκης προθεμάτων νημάτων Adam Dunkels. Αυτό το έργο υποθέτει ότι ο αναγνώστης γνωρίζει για τους ελεγκτές AVR 8-bit, μπορεί να γράψει κάποιο πρόγραμμα C και έχει κάποια εμπειρία με το Atmel studio.
Ο κώδικας έργου δημοσιεύτηκε στο GitHub:
Προμήθειες
Πριν από τον προγραμματισμό χρειάζεται ακόμα να κατασκευαστεί το κύκλωμα. Εδώ είναι τα συστατικά:
- Ελεγκτής Attiny85 (οποιοσδήποτε ηλεκτρονικός προμηθευτής).
- Δύο τριών χρωμάτων LED 10mm με κοινή άνοδο. LED Adafruit
- Αντίσταση 100 Ohm, 120 Ohm, 150 Ohm 0,125 ή 0,250 Wt (οποιοσδήποτε ηλεκτρονικός προμηθευτής).
- Επικεφαλίδα έξι ακίδων για διεπαφή AVR ISP. Μπορεί να κατασκευαστεί από αυτήν την κεφαλίδα Adafruit
- Λίγη σανίδα ψωμιού ή τυπωμένη πρότυπη σανίδα. Χρησιμοποίησα αυτό το
- Διεπαφή AVR ISP MKII και Atmel Studio 6.1 (θα πρέπει επίσης να λειτουργήσει και νεότερη έκδοση).
Βήμα 1: Circut
Ο σχεδιασμός χρησιμοποιεί πέντε καρφίτσες τσιπ:
- Δύο ακίδες που χρησιμοποιούνται για τον έλεγχο των ανόδων: κάθε άνοδος LED που συνδέεται με τον ειδικό πείρο.
- Τρεις ακίδες προσαρτημένες (μέσω αντιστάσεων) σε καθόδους LED (η ίδια κάθοδος χρώματος κάθε led προσαρτημένη στον ίδιο πείρο)
Κάποιος θα ρωτούσε: γιατί να μην χρησιμοποιηθούν και οι έξι ακίδες εισόδου/εξόδου του τσιπ, έτσι ώστε οι άνοδοι LED να συνδέονται απευθείας στο +5 v και κάθε κάθοδος να έχει τον ειδικό πείρο του; Αυτό θα κάνει τον προγραμματισμό απλό. Δυστυχώς, υπάρχει το πρόβλημα: ο πείρος PB5 (RESET) είναι ένας αδύναμος πείρος ικανός να παρέχει μόλις ~ 2 mA του ρεύματος, ενώ υπάρχει ανάγκη να έχει ~ 20 mA.
Φυσικά μπορεί κανείς να κατασκευάσει ενισχυτή τρανζίστορ για αυτόν τον αδύναμο πείρο, αλλά εγώ ο ίδιος όποτε είναι δυνατόν προτιμώ να λύσω το πρόβλημα μέσω του κώδικα.
Βήμα 2: Διάγραμμα χρονισμού
Το διάγραμμα χρονισμού μας βοηθά να κατανοήσουμε τι πρέπει να προγραμματίσουμε.
Οι δύο πρώτες σειρές στο διάγραμμα δείχνουν αλλαγή τάσης στις ανόδους LED. Η τάση στις ακίδες που συνδέονται με τις άνοδος LED ταλαντεύεται με συχνότητα ~ 250 Hz. Αυτή η ταλάντωση τάσης για το αριστερό LED είναι ένα αντίθετο από την ταλάντωση του δεξιού LED. Όταν η τάση στην άνοδο είναι υψηλή, το αντίστοιχο LED μπορεί να είναι φωτεινό. Όταν είναι χαμηλή, το αντίστοιχο LED είναι σκοτεινό. Αυτό σημαίνει ότι κάθε LED μπορεί να είναι φωτεινό για διάστημα 2 χιλιοστών του δευτερολέπτου και είναι σκοτεινό για άλλα 2 χιλιοστά του δευτερολέπτου. Επειδή το ανθρώπινο μάτι έχει κάποια αδράνεια, τα 250 Hz δεν αναβοσβήνουν από τον παρατηρητή. Κάτω από τρεις σειρές στο διάγραμμα φαίνεται η αλλαγή τάσης στις ακίδες που συνδέονται με τις καθόδους LED. Ας δούμε την πρώτη στήλη διαγράμματος. Εμφανίζει την περίπτωση όταν το αριστερό LED είναι σε κόκκινο χρώμα και το δεξί LED σε πράσινο χρώμα. Εδώ οι RED καθόδους παραμένουν χαμηλές ενώ η αριστερή άνοδος είναι υψηλή, η ΠΡΑΣΙΝΗ κάθοδος παραμένει χαμηλή ενώ η δεξιά άνοδος είναι υψηλή και η μπλε κάθοδος παραμένει χαμηλή όλη την ώρα. Άλλες στήλες στο διάγραμμα δείχνουν συνδυασμούς τάσης καθόδου και ανόδου για διάφορα χρώματα.
Όπως μπορούμε να δούμε, υπάρχει αλληλεξάρτηση από την κατάσταση των ακίδων. Χωρίς κάποιο πλαίσιο δεν θα ήταν εύκολο να επιλυθεί. Και εκεί είναι που βοηθάει η βιβλιοθήκη protothread.
Βήμα 3: Προγραμματισμός. Μακροεντολές και ορισμοί
Το παράδειγμα στα βήματα προγραμματισμού αντιπροσωπεύει ελαφρώς απλοποιημένη έκδοση. Το πρόγραμμα συντομεύεται και κάποιος συμβολικός ορισμός αντικαθίσταται με ρητές σταθερές.
Ας ξεκινήσουμε από την αρχή. Το πρόγραμμα περιλαμβάνει αρχεία που συνοδεύουν το Atmel Studio καθώς και κεφαλίδα βιβλιοθήκης protothread. Στη συνέχεια, υπάρχουν δύο μακροεντολές για τον χειρισμό των επιπέδων ακίδων και ορισμούς για να δώσουν λογικά ονόματα στα σήματα καρφιτσών. Μέχρι στιγμής τίποτα το ιδιαίτερο.
Βήμα 4: Προγραμματισμός. Κύριος βρόχος
Στη συνέχεια, ας δούμε στο τέλος για να δούμε τι περιέχει η κύρια διαδικασία.
Η συνάρτηση main μετά από κάποια προετοιμασία παραμένει σε βρόχο για πάντα. Σε αυτόν τον βρόχο κάνει τα επόμενα βήματα:
- Επικαλείται ρουτίνα protothread για το αριστερό LED. Αλλάζει κάποια τάση ακίδων.
- Κάντε καθυστέρηση δύο χιλιοστών του δευτερολέπτου. Δεν υπάρχει αλλαγή στην τάση του πείρου.
- Επικαλείται protothread για το σωστό LED. Αλλάζει κάποια τάση ακίδων.
- Κάντε καθυστέρηση 2 MS. Δεν υπάρχει αλλαγή στην τάση του πείρου.
Βήμα 5: Προγραμματισμός. Βοηθητικές λειτουργίες
Πριν ξεκινήσουμε να συζητάμε για πρωτόκολλα, πρέπει να δούμε μερικές βοηθητικές λειτουργίες. Πρώτα υπάρχουν λειτουργίες για τον καθορισμό συγκεκριμένου χρώματος. Είναι απλοί. Υπάρχουν τόσες πολλές λειτουργίες όπως αριθμός υποστηριζόμενων χρωμάτων (επτά) και μία ακόμη λειτουργία για ρύθμιση σκούρου LED (NoColor).
Και υπάρχει μια ακόμη λειτουργία που θα επικαλεστεί άμεσα η ρουτίνα protothread. Το όνομά του είναι DoAndCountdown ().
Από τεχνική άποψη, η χρήση μιας τέτοιας λειτουργίας δεν είναι υποχρεωτική, αλλά το βρήκα βολικό. Έχει τρία επιχειρήματα:
- Δείκτης για τη λειτουργία ρύθμισης χρώματος LED (όπως RedColor ή GreenColor κ.λπ.)
- Αρχική τιμή του αντίστροφου μετρητή: πόσες φορές πρέπει να γίνει επίκληση αυτής της συνάρτησης σε συγκεκριμένο στάδιο protothread.
- Δείκτης προς τον αντίστροφο μετρητή. Θεωρείται ότι όταν υπάρχει αλλαγή στο χρώμα, ο αντίστροφος μετρητής είναι 0, οπότε στην αρχή ο κωδικός επανάληψης θα εκχωρήσει στον αρχικό αυτόν μετρητή. Μετά από κάθε μετρητή επανάληψης μειώνεται.
Η συνάρτηση DoAndCountdown () επιστρέφει την τιμή του αντίστροφου μετρητή.
Βήμα 6: Προγραμματισμός. Ρουτίνες Protothread
Και εδώ είναι ο πυρήνας του πλαισίου: ρουτίνα protothread. Για λόγους απλότητας, το παράδειγμα περιορίζεται μόνο σε τρία βήματα: για αλλαγή χρώματος σε ΚΟΚΚΙΝΟ, σε ΠΡΑΣΙΝΟ και σε ΜΠΛΕ.
Η συνάρτηση επικαλείται με δύο ορίσματα:
- Δείκτης σε δομή protothread. Αυτή η δομή αρχικοποιήθηκε από το main πριν ξεκινήσει ο κύριος βρόχος.
- Δείκτης προς τον αντίστροφο μετρητή. Ρυθμίστηκε στο 0 κατά κύριο πριν ξεκινήσει ο κύριος βρόχος.
Η λειτουργία ρυθμίζει τις τάσεις για να κάνει το αριστερό LED ενεργό και στη συνέχεια ξεκινά το τμήμα πρωτονημάτων. Αυτό το τμήμα είναι μεταξύ μακροεντολών PT_BEGIN και PT_END. Στο εσωτερικό υπάρχει κάποιος κώδικας που στην περίπτωσή μας επαναλαμβάνει μόνο μακροεντολές PT_WAIT_UNTIL. Αυτή η μακροεντολή εκτελείται παρακάτω:
- Επίκληση της λειτουργίας DoAndCountdown. Αυτό θέτει τάση στις καθόδους LED για να εκπέμπουν συγκεκριμένο χρώμα.
- Επιστρεφόμενο αποτέλεσμα σε σύγκριση με το 0. Εάν η συνθήκη είναι "ψευδής" η συνάρτηση protothread επιστρέφει αμέσως και αποδίδει τον έλεγχο στον κύριο βρόχο.
- Όταν το protothread κληθεί την επόμενη φορά, εκτελεί ξανά τον κώδικα πριν από το PT_BEGIN και μετά πηδά απευθείας μέσα στις μακροεντολές PT_WAIT_UNTIL από τις οποίες επέστρεψε την προηγούμενη φορά.
- Τέτοιες ενέργειες επαναλαμβάνονται μέχρι το αποτέλεσμα του DoAndCountdown να είναι 0. Σε αυτή την περίπτωση δεν υπάρχει επιστροφή, το πρόγραμμα παραμένει στο protothread και εκτελεί την επόμενη γραμμή του κώδικα. Στην περίπτωσή μας είναι ο επόμενος PT_WAIT_UNTIL, αλλά γενικά θα μπορούσε να είναι σχεδόν οποιοσδήποτε κωδικός C.
- Κατά την αρχική εκτέλεση του δεύτερου αντίστροφου μετρητή PT_WAIT_UNTIL είναι 0, οπότε η διαδικασία DoAndCountdown () τον ορίζει στην αρχική τιμή. Οι δεύτερες μακροεντολές θα εκτελεστούν ξανά 250 φορές έως ότου ο μετρητής αντιστροφών φτάσει στο 0.
- Η κατάσταση της δομής pt επαναφέρεται μόλις ο έλεγχος φτάσει σε μακροεντολές PT_END. Όταν η λειτουργία protothread κληθεί την επόμενη φορά που ξεκινά το τμήμα protothread, εκτελέστε τη γραμμή του κώδικα αμέσως μετά το PT_BEGIN.
Υπάρχει παρόμοια ρουτίνα protothread για το σωστό LED. Στο παράδειγμά μας, απλώς επιβάλλει διαφορετική σειρά χρωμάτων, αλλά αν μπορούμε να το κάνουμε εντελώς διαφορετικά: δεν υπάρχει στενή σύζευξη μεταξύ ρουτίνας LED αριστερού και δεξιού.
Βήμα 7: Εσωτερικά
Το σύνολο του προγράμματος είναι λιγότερο από 200 γραμμές κώδικα (με σχόλια και κενές γραμμές) και καταλαμβάνει λιγότερο από το 20% της μνήμης κώδικα Attiny85. Εάν χρειαστεί, είναι δυνατόν να χρησιμοποιηθούν εδώ αρκετές ρουτίνες protothread και να τους αποδοθεί πολύ πιο περίπλοκη λογική.
Η βιβλιοθήκη Protothreads είναι η απλούστερη μορφή ταυτόχρονου προγραμματισμού με υπολογιστή. Ο ταυτόχρονος προγραμματισμός είναι μια προσέγγιση που επιτρέπει τη διαίρεση του προγράμματος σε λογικά μέρη: άλλοτε ονομάζονται κορουτίνες, άλλοτε νήματα, άλλοτε εργασίες. Η αρχή είναι ότι κάθε τέτοια εργασία μπορεί να μοιράζεται την ίδια ισχύ επεξεργαστή διατηρώντας τον κώδικα λίγο πολύ γραμμικό και ανεξάρτητο από άλλα μέρη. Οι εργασίες από λογική άποψη μπορεί να εκτελούνται ταυτόχρονα.
Για προηγμένα συστήματα, έλεγχοι τέτοιων εργασιών εκτελούνται είτε από πυρήνα λειτουργικού συστήματος είτε από χρόνο εκτέλεσης γλώσσας ενσωματωμένο σε εκτελέσιμο από τον μεταγλωττιστή. Αλλά σε περίπτωση protothreads, ο προγραμματιστής της εφαρμογής το ελέγχει χειροκίνητα χρησιμοποιώντας βιβλιοθήκη μακροεντολών protothreads σε ρουτίνες εργασιών και επικαλούμενη τέτοιες ρουτίνες (συνήθως εκτός κύριου βρόχου).
Μάλλον θέλετε να μάθετε πώς λειτουργεί πραγματικά το protothread; Πού κρύβεται η μαγεία; Τα Protothreads βασίζονται σε ειδική λειτουργία γλώσσας C: το γεγονός ότι η δήλωση περίπτωσης C switch μπορεί να ενσωματωθεί στο if ή σε κάποιο άλλο μπλοκ (όπως while ή for). Λεπτομέρειες που μπορείτε να βρείτε στον ιστότοπο Adam Dunkels
Τα εσωτερικά ηλεκτρονικά αυτού του έργου είναι πολύ απλά. Η παραπάνω φωτογραφία σας δίνει κάποια ιδέα. Είμαι σίγουρος ότι μπορείτε να κάνετε καλύτερα.
Συνιστάται:
Μια κολοκύθα αποκριών IoT - Έλεγχος LED με Arduino MKR1000 και εφαρμογή Blynk ???: 4 βήματα (με εικόνες)
Μια κολοκύθα αποκριών IoT | Έλεγχος LED με Arduino MKR1000 και Blynk App ???: Γεια σε όλους, Πριν από μερικές εβδομάδες ήταν το Halloween και ακολουθώντας την παράδοση έβγαλα μια ωραία κολοκύθα για το μπαλκόνι μου. Αλλά έχοντας την κολοκύθα μου έξω, συνειδητοποίησα ότι ήταν αρκετά ενοχλητικό να πρέπει να βγαίνω κάθε βράδυ για να ανάψω το κερί. Και εγώ
Κολοκύθα αποκριών με κινούμενο animatronic μάτι - Αυτή η κολοκύθα μπορεί να γυρίσει το μάτι της!: 10 βήματα (με εικόνες)
Απόκριες κολοκύθα με κινούμενο animatronic μάτι | Αυτή η κολοκύθα μπορεί να γυρίσει το μάτι της!: Σε αυτό το Instructable, θα μάθετε πώς να φτιάχνετε μια κολοκύθα αποκριών που τρομάζει τους πάντες όταν κινείται το μάτι της. Προσαρμόστε την απόσταση σκανδάλης του αισθητήρα υπερήχων στη σωστή τιμή (βήμα 9) και η κολοκύθα σας θα πετρώσει όποιον τολμήσει να πάρει λαμπάδα
Motion Sensing Arduino Απόκριες Κολοκύθα: 4 Βήματα
Motion Sensing Arduino Halloween Pumpkin: Ο στόχος πίσω από αυτό το Instructable ήταν να δημιουργήσει έναν φθηνό και εύκολο τρόπο για να φτιάξετε διακοσμήσεις αποκριών στο σπίτι χωρίς προηγούμενη δεξιότητα ή φανταχτερά εργαλεία. Χρησιμοποιώντας εύκολα στοιχεία για πηγή από το διαδίκτυο, μπορείτε επίσης να φτιάξετε το δικό σας απλό και εξατομικευμένο
Πολύχρωμα σκουλήκια για το Susi: 4 βήματα
Πολύχρωμα σκουλήκια για το Susi: Lasst farbige Würmer sausen! Ein farbiger Punkt läuft immer im Kreis herum, wobei er einen immer dunkler werdenden Lichtschweif hinter sich herzieht. Im Laufe der Zeit ändert dieses Würmchen langsam seine Farbe, sodass er den ganze Regenbogen durchm
Ολοκληρωμένα πολύχρωμα στένσιλ με μεταβλητή έξοδο: 12 βήματα (με εικόνες)
Ολοκληρωμένα πολύχρωμα στένσιλ με μεταβλητή έξοδο: Η ρεαλιστική διαμόρφωση χρώματος πολλαπλών στρωμάτων δεν είναι γρήγορη και εύκολη. Βεβαίως, μπορείτε να τραβήξετε ένα σε μια ώρα, αλλά χρειάζεται χρόνος και εξάσκηση για να μπορέσετε να επαναλάβετε τη διαδικασία και να ξέρετε πώς να το προσαρμόσετε για κάθε διαφορετικό στένσιλ. Σε αυτό το διδακτικό, θα