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

Ταυτόχρονος προγραμματισμός Attiny85 ή κολοκύθα με πολύχρωμα μάτια: 7 βήματα
Ταυτόχρονος προγραμματισμός Attiny85 ή κολοκύθα με πολύχρωμα μάτια: 7 βήματα

Βίντεο: Ταυτόχρονος προγραμματισμός Attiny85 ή κολοκύθα με πολύχρωμα μάτια: 7 βήματα

Βίντεο: Ταυτόχρονος προγραμματισμός Attiny85 ή κολοκύθα με πολύχρωμα μάτια: 7 βήματα
Βίντεο: M#1: Ρύθμιση Outseal PLC Mega με το ATmega128 Development Board | Outseal Dev. PLC Mega 2024, Νοέμβριος
Anonim

Ακολουθήστε περισσότερα από τον συγγραφέα:

Η κραυγή
Η κραυγή
Η κραυγή
Η κραυγή
Αντικατάσταση μπαταρίας NiCd με εξωτερικό τροφοδοτικό
Αντικατάσταση μπαταρίας NiCd με εξωτερικό τροφοδοτικό
Αντικατάσταση μπαταρίας NiCd με εξωτερικό τροφοδοτικό
Αντικατάσταση μπαταρίας NiCd με εξωτερικό τροφοδοτικό
Λαβή ψηφιακής φωτογραφικής μηχανής
Λαβή ψηφιακής φωτογραφικής μηχανής
Λαβή ψηφιακής φωτογραφικής μηχανής
Λαβή ψηφιακής φωτογραφικής μηχανής

Σχετικά: Εργάζομαι ως μηχανικός λογισμικού σε μία από τις εταιρείες 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

Circut
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

Και εδώ είναι ο πυρήνας του πλαισίου: ρουτίνα 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

Τα εσωτερικά ηλεκτρονικά αυτού του έργου είναι πολύ απλά. Η παραπάνω φωτογραφία σας δίνει κάποια ιδέα. Είμαι σίγουρος ότι μπορείτε να κάνετε καλύτερα.

Συνιστάται: