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

Διακόπτες ανάγνωσης με βήματα ATtiny2313: 9
Διακόπτες ανάγνωσης με βήματα ATtiny2313: 9

Βίντεο: Διακόπτες ανάγνωσης με βήματα ATtiny2313: 9

Βίντεο: Διακόπτες ανάγνωσης με βήματα ATtiny2313: 9
Βίντεο: Διαχείριση Αποθήκευσης 2024, Ιούλιος
Anonim
Διακόπτες ανάγνωσης με ATtiny2313
Διακόπτες ανάγνωσης με ATtiny2313

Υπήρξαν αρκετά Instructables που ασχολούνται με εξόδους από το ATtiny2313 και παρόμοιες συσκευές AVR. Για παράδειγμα, https://www.instructables.com/id/Ghetto-Programming%3a-Getting-started-with-AVR-micro/, https://www.instructables.com/id/Drive-a-Stepper- Μοτέρ-με-AVR-Μικροεπεξεργαστής/. Εργάζοντας το τελευταίο από το The Real Elliot, το οποίο έδειξε πώς να ελέγχετε τα βηματικά μοτέρ, διαπίστωσα ότι θα ήταν πραγματικά χρήσιμο να μπορείτε να εκτελέσετε εναλλακτικά τμήματα κώδικα στο ίδιο πρόγραμμα, ώστε να μην χρειάζεται να επαναπρογραμματίσω το ATtiny2313 το καθένα ώρα ήθελα να δοκιμάσω μια μικρή παραλλαγή κώδικα (όπως το μισό βήμα ή το αντίστροφο τρέξιμο). Ενώ είναι εύκολο να γράψετε κώδικα χρησιμοποιώντας μια εντολή switch/case για να επιτρέψετε την επιλογή εναλλακτικών παραλλαγών, απαιτείται κάποιος τρόπος επιλογής της περίπτωσης. Αυτό σημαίνει ότι πρέπει να διαβαστεί κάποιο είδος συσκευής εισόδου για τον έλεγχο της θήκης. Ευτυχώς, το ATtiny2313 έχει πολλές ακίδες εισόδου/εξόδου και είναι καλά σχεδιασμένο για ανάγνωση εισόδων από διακόπτες. Αυτό το Instructable θα δείξει πώς να διαβάζετε εισόδους και να λαμβάνετε αποφάσεις με βάση την κατάστασή τους. Δεδομένου ότι αυτό από μόνο του θα έκανε ένα αρκετά βαρετό Instructable, θα εξηγήσω έναν απλό τρόπο χρήσης της δυνατότητας χρονοδιακόπτη/μετρητή του ATtiny2313 για οδήγηση ενός μικρού ηχείου ως βομβητή. Θα γίνει επίσης μια μικρή παρέκκλιση σχετικά με απλές τεχνικές εντοπισμού σφαλμάτων.

Βήμα 1: Η συσκευή εισαγωγής

Η συσκευή εισαγωγής
Η συσκευή εισαγωγής
Η συσκευή εισαγωγής
Η συσκευή εισαγωγής

Αυτό το Instructable βασίζεται στο εξαιρετικό έργο του The Real Elliot και χρησιμοποιεί το σύστημα ανάπτυξης ATtiny2313 Ghetto που περιγράφει. Το φύλλο δεδομένων ATtiny2313 από το Atmel είναι η απόλυτη αναφορά για όλες τις λειτουργίες, αλλά δεν είναι απαραίτητα εύκολο να διαβαστεί. https://www.atmel.com/dyn/products/datasheets.asp?family_id=607 (Ο σύνδεσμος έχει όλα τα φύλλα δεδομένων AVR, εντοπίστε το 2313.) Το σχήμα δείχνει ένα απλό σύνολο διακοπτών εισόδου. Αυτό είναι απλά ένα πακέτο τεσσάρων διακοπτών ενεργοποίησης/απενεργοποίησης. επίσης γνωστός ως διακόπτες μονόπολου, μονής ρίψης (SPST). Τυπικά, μία σύνδεση ή πόλος κάθε διακόπτη είναι συνδεδεμένη με τη γείωση, ενώ η άλλη σύνδεση τραβιέται ψηλά μέσω μιας αντίστασης περιορισμού ρεύματος (περίπου 10K). Μια είσοδος μικροελεγκτή συνδέεται στον πόλο με την αντίσταση. Εάν ο διακόπτης είναι ανοιχτός, ο μικροελεγκτής θα διαβάσει την είσοδο ως HI. Εάν ο διακόπτης είναι κλειστός, ο μικροελεγκτής θα διαβάσει την είσοδο LO. Ανατρέξτε στο σχήμα για λεπτομέρειες. Το ATtiny2313 απλοποιεί τα πράγματα παρέχοντας προγραμματιζόμενες αντιστάσεις έλξης σε ακίδες εισόδου/εξόδου όταν έχουν διαμορφωθεί ως είσοδοι. Αυτό σημαίνει ότι οι διακόπτες μπορούν απλά να έχουν έναν πόλο δεμένο στη γείωση (LO) και τον άλλο πόλο συνδεδεμένο σε είσοδο επεξεργαστή. Το πρώτο παράδειγμα δείχνει μόνο δύο διακόπτες. Οι διακόπτες διαβάζονται και διαμορφώνονται με τον ακόλουθο κώδικα. Διαμορφώστε τους διακόπτες ως εισόδους: (Δεν απαιτείται κωδικός, αυτή είναι η προεπιλογή.) Ενεργοποιήστε τις αντιστάσεις έλξης: PORTB = _BV (PB0) | _BV (PB1); Διαβάστε τις εισόδους: but1 = ~ PINB & 0x03; Σημειώστε τη χρήση αντιστροφής και κάλυψης για να λάβετε τη σωστή τιμή.

Βήμα 2: Φλας για σήμα

Θα χρησιμοποιήσουμε αυτούς τους δύο διακόπτες για να αναβοσβήνει μια λυχνία LED με δυνατότητα προγραμματισμού πολλές φορές. Τα LED που θα χρησιμοποιήσουμε θα είναι τα φλας που έκανε διάσημο το The Real Elliot. Οι διακόπτες 1 και 2 θα αντιμετωπίζονται ως δύο δυαδικά ψηφία, οπότε ο συνδυασμός μπορεί να αντιπροσωπεύει τους αριθμούς 0, 1, 2 και 3. Το πρόγραμμά μας θα διαβάσει τους δύο διακόπτες και θα αναβοσβήνει το LED τον κατάλληλο αριθμό φορών, αλλά μόνο εάν ο διακόπτης οι ρυθμίσεις έχουν αλλάξει. Οι διακόπτες καταργούνται για 500 χιλιοστά του δευτερολέπτου (δεν έχουν βελτιστοποιηθεί). Ο αλγόριθμος αποσύνδεσης είναι αρκετά απλός. Οι διακόπτες διαβάζονται και η ανάγνωση σημειώνεται. Εάν είναι διαφορετική από την τιμή oldBut (η τελευταία αποθηκευμένη τιμή), τότε το πρόγραμμα καθυστερεί για 500 χιλιοστά του δευτερολέπτου και οι διακόπτες διαβάζονται ξανά. Εάν η τιμή είναι η ίδια με την προηγούμενη ανάγνωση, η τιμή του παλιού Αλλά θα ενημερωθεί και η λυχνία LED θα αναβοσβήνει τον αριθμό των φορών που υπονοείται από τη δυαδική τιμή των δύο διακοπτών. Σημειώστε την αντιστροφή της τιμής αφού ένας διακόπτης που είναι "ενεργοποιημένος" διαβάζει LO. Οι διακόπτες θα σαρώνονται συνεχώς για περαιτέρω αλλαγές. Ανατρέξτε στις προηγούμενες οδηγίες του The Real Elliot για να μάθετε περισσότερα σχετικά με τα φλας. Ρίξτε μια ματιά σε αυτό το https://www.ganssle.com/debouncing.pdf για να μάθετε περισσότερα σχετικά με την κατάργηση διακοπτών. Ακολουθεί ο κωδικός ATtiny2313 για αυτό το παράδειγμα. Σε λειτουργία, αυτό το πρόγραμμα αναβοσβήνει δύο φορές τη λυχνία LED στο PB4 (φυσικός ακροδέκτης 8) για να δείξει ότι έχει ξεκινήσει. Στη συνέχεια, θα διαβάζει τους διακόπτες ένα και δύο και θα αναβοσβήνει μία έως τρεις φορές, ανάλογα με τη ρύθμιση του διακόπτη κάθε φορά που αλλάζουν. Όταν οι διακόπτες δεν αλλάζουν, η λυχνία LED θα αναβοσβήνει αργά. Για να εκτελέσετε αυτόν τον κώδικα, δημιουργήστε έναν νέο κατάλογο (καλέστε τον "Βασικό" αν θέλετε) και κατεβάστε το ακόλουθο αρχείο κώδικα C και κάντε αρχείο σε αυτό. Μετονομάστε το Makefile1.txt σε απλώς Makefile. Χρησιμοποιώντας το WinAVR, μεταγλωττίστε το πρόγραμμα και φορτώστε το στο ATtiny2313.

Βήμα 3: Μια μικρή παρέκκλιση σχετικά με τον εντοπισμό σφαλμάτων

Αν είστε σαν εμένα (και κάθε άλλος προγραμματιστής στον κόσμο) πιθανότατα έχετε βιώσει στιγμές που ο κώδικας "χωρίς σφάλματα" που πληκτρολογήσατε και καταρτίσατε προσεκτικά δεν κάνει αυτό που περιμένετε. Maybeσως απλά δεν κάνει τίποτα! Ποιο ειναι το πρόβλημα? Πώς θα το μάθετε; Ευτυχώς, υπάρχουν αρκετές προσεγγίσεις για να λειτουργήσουν τα πράγματα. (Αποκτήστε αυτό το βιβλίο για μια εξαιρετική αντιμετώπιση του θέματος του εντοπισμού σφαλμάτων. Http://www.debuggingrules.com/) Θα ήθελα να προσφέρω μερικές απλές προτάσεις που σχετίζονται με το θέμα της εντοπισμού σφαλμάτων εφαρμογών μικροελεγκτών. Το πρώτο βήμα είναι να βασιστείτε τι ξέρετε. Εάν έχετε πάρει ένα φλας για να εργαστείτε μία φορά, χρησιμοποιήστε το ξανά για να δείτε πού βρίσκεστε στο πρόγραμμά σας. Μου αρέσει να αναβοσβήνει το LED δύο φορές για να σηματοδοτήσει την έναρξη του προγράμματος. Μπορείτε να βάλετε τον κώδικα για να το κάνετε αυτό στην αρχή του προγράμματος σας. Αφού καταλάβετε ότι τίποτα δεν πάει καλά με το υλικό σας, δημιουργήστε μια λειτουργία για να κάνετε το αναβοσβήσιμο. Εδώ είναι η συνάρτηση που χρησιμοποιώ./************ ------------------------------ ** blinkEm-η λειτουργία για να αναβοσβήνει το LED χρησιμοποιώντας PD4 ** Το PD4 πρέπει να διαμορφωθεί ως έξοδος. ** ---------------------------------------------------- ---------------------*/void blinkEm (uint8_t count) {while (count> 0) {PORTD = _BV (PD4); _delay_ms (1000); PORTD = ~ _BV (PD4); _delay_ms (1000); μετρώ--; }} Είναι πλέον δυνατή η χρήση αυτής της λειτουργίας σε διάφορα σημεία του κώδικα ως σήμα ότι ο κώδικας έχει εκτελεστεί μέχρι τώρα. Η γνώση του κώδικα σημαίνει ότι μπορείτε να εξετάσετε προσεκτικά κάθε ενότητα που έχει εκτελεστεί, αλλά δεν έχει κάνει αυτό που περιμένατε, για να βρείτε σφάλματα. Η αλλαγή ενός πράγματος κάθε φορά είναι επίσης μια βασική τεχνική για τον εντοπισμό σφαλμάτων (περιγράφεται στην παραπάνω αναφορά). Αυτή η κλασική μέθοδος λειτουργεί μαζί με το "διαίρει και κατέκτησε": κάνοντας βήματα για να προσθέσετε λειτουργικότητα σταδιακά. Αυτό μπορεί να φαίνεται σαν μια αργή προσέγγιση, αλλά δεν είναι τόσο αργή όσο η προσπάθεια εντοπισμού σφαλμάτων σε ένα μεγάλο τμήμα κώδικα που δεν λειτουργεί ταυτόχρονα.

Βήμα 4: Περισσότερες εντοπισμός σφαλμάτων

Υπάρχουν πολλές φορές που θέλουμε να ελέγξουμε ένα τμήμα κώδικα παρακάμπτοντας τις περισσότερες γραμμές σε αυτό και, στη συνέχεια, επιτρέποντάς τους ένα κάθε φορά καθώς επαληθεύουμε ότι κάθε μία λειτουργεί. Συνήθως, το κάνουμε αυτό "σχολιάζοντας" γραμμές που θέλουμε να παραλείψουμε. Μια επέκταση αυτής της τεχνικής είναι να κόψετε και να επικολλήσετε ένα μπλοκ κώδικα, να σχολιάσετε το πρωτότυπο (για να μην το χάσουμε) και να χαλάσετε το αντίγραφο. Το C έχει τέσσερις εύκολους τρόπους για να σχολιάσετε γραμμές. Η τοποθέτηση του "//" μπροστά από μια γραμμή σχολιάζει αυτήν τη γραμμή. Το να κλείσετε μία ή περισσότερες γραμμές στα "/*" και "*/" θα σχολιάσει μια ολόκληρη ενότητα. Για να λειτουργήσει αποτελεσματικά αυτή η μέθοδος, δεν πρέπει να υπάρχει άλλο "*/" στο μπλοκ κώδικα (εκτός από το τελικό). Επομένως, μια αποτελεσματική πειθαρχία είναι η χρήση // για σχόλια εντός μπλοκ κώδικα και η κράτηση της κατασκευής / * * / για μπλοκ σχολίων και για σχολιασμό τμημάτων κώδικα. Τοποθέτηση "#if 0" στην αρχή ενός μπλοκ για σχολιασμό και τερματισμός της ενότητας με "#endif". Πιο επιλεκτικός έλεγχος είναι δυνατός χρησιμοποιώντας το "#ifdef (αναγνωριστικό)" στην αρχή ενός μπλοκ και το "#endif" στο τέλος. Εάν θέλετε να καταρτιστεί το μπλοκ, χρησιμοποιήστε το "#define (αναγνωριστικό)" νωρίτερα στο πρόγραμμα. Σημειώστε ότι τα εισαγωγικά είναι μόνο για έμφαση και δεν πρέπει να περιλαμβάνονται. Ο συνδυασμός αυτών των τεχνικών θα πρέπει να παρέχει μια χρήσιμη προσέγγιση για τον εντοπισμό σφαλμάτων στα προγράμματα ATtiny2313. Μπορείτε να βρείτε αυτά τα εργαλεία χρήσιμα καθώς προχωράμε σε αυτό το Instructable.

Βήμα 5: Χρήση χρονοδιακόπτη/μετρητή 0 για μπιπ

Χρήση χρονοδιακόπτη/μετρητή 0 για μπιπ
Χρήση χρονοδιακόπτη/μετρητή 0 για μπιπ

Το ATtiny2313 διαθέτει δύο ισχυρούς πόρους χρονοδιακόπτη/μετρητή: έναν 8-bit και έναν 16-bit. Αυτά μπορούν να διαμορφωθούν ως γεννήτριες συχνοτήτων, ελεγκτές διαμόρφωσης μεταβλητού πλάτους παλμού και καταχωρητές σύγκρισης εξόδου. Η πλήρης λειτουργικότητά τους περιγράφεται σε 49 σελίδες του φύλλου δεδομένων. Ωστόσο, θα χρησιμοποιήσουμε μια απλή θήκη. Θα χρησιμοποιηθεί μόνο χρονόμετρο/μετρητής 0 (το 8-bit) και θα χρησιμοποιηθεί απλώς ως γεννήτρια συχνοτήτων. Η συχνότητα θα κατευθυνθεί σε ένα μικρό ηχείο για να παράγει ένα μπιπ. Ο χρονοδιακόπτης/ο μετρητής 0 περιγράφεται πλήρως στις σελίδες 66 έως 83 του φύλλου δεδομένων ATtiny2313. Μια προσεκτική ανάγνωση αυτού του υλικού θα προσφέρει πλήρη κατανόηση του Χρόνου/του Μετρητή 0. Ευτυχώς, μια αρκετά απλή λειτουργία, Clear Timer on Compare (CTC), είναι το μόνο που απαιτείται για τη δημιουργία του ήχου μπιπ που θέλουμε.

Για τη λειτουργία που θα χρησιμοποιήσουμε, η λειτουργία του Χρονοδιακόπτη/Μετρητή είναι απλή. Όταν επιλέγεται ένα σήμα ρολογιού, ο μετρητής ξεκινά από το μηδέν και αυξάνει κάθε παλμό ρολογιού. Όταν η τιμή του μετρητή φτάσει στην τιμή του Καταχωρητή σύγκρισης εξόδων (ΚΟΡΥΦΗ), ο μετρητής επαναφέρεται στο μηδέν και η καταμέτρηση ξεκινά ξανά. Το bit εξόδου που σχετίζεται με το χρονόμετρο/τον μετρητή εναλλάσσεται για να παράγει έξοδο τετραγωνικού κύματος. Αυτό οδηγεί απευθείας έναν μετατροπέα ήχου να κάνει έναν ήχο μπιπ. Ένας μικρός μετατροπέας ήχου TDK παράγει το μπιπ. Μια κατάλληλη μονάδα είναι το Digikey 445-2530-ND, TDK SD1209T3-A1 (χρησιμοποίησα μια παλαιότερη έκδοση αυτού). Αυτή είναι μια έκδοση 3 volt? η έκδοση 5 volt θα λειτουργήσει επίσης περιμένω. Το οδηγώ απευθείας από τη θύρα εξόδου του Attiny2313 και φαίνεται να λειτουργεί καλά. Το Sparkfun διαθέτει παρόμοια συσκευή.

Βήμα 6: Διαμόρφωση χρονοδιακόπτη/μετρητή 0

Η λειτουργία CTC μπορεί να χρησιμοποιηθεί για την εναλλαγή της εξόδου OC0A στο Pin 2, Port B (φυσικός πείρος 14). Για να ενεργοποιήσετε την έξοδο σε αυτόν τον πείρο, το DDRB πρέπει να ρυθμιστεί κατάλληλα. Ο κωδικός C για αυτό είναι ακριβώς όπως η ρύθμιση μιας εξόδου για ένα φως αναλαμπής. DDRB = _BV (PB2); // Η θύρα B2 είναι μια έξοδος. Το επόμενο βήμα είναι η παροχή ενός σήματος ρολογιού και η φόρτωση του καταχωρητή σύγκρισης εξόδου για την παραγωγή μιας κυματομορφής ως συχνότητας. Η εξίσωση για τη συχνότητα που προκύπτει δίνεται στο φύλλο δεδομένων (σελίδα 72). Οι όροι της εξίσωσης θα περιγραφούν παρακάτω. Εδώ είναι η εξίσωση: fOC0A = fclk_I/O/2*N*(1+OCR0A) Όπου fOC0A: = συχνότητα εξόδου fclk_I/O: = συχνότητα πηγής ρολογιού N: = συντελεστής προεπιλογής ρολογιού OCR0A: = τιμή στην έξοδο καταχωρητή καταγραφής για χρονοδιακόπτη/ Μετρητής 0Α. Συχνότητα πηγής ρολογιού, fclk_I/O Αυτή είναι η συχνότητα του ρολογιού του συστήματος. Η προεπιλεγμένη τιμή είναι 1MHz. Τα bit CS00, CS01 και CS02 του TCCR0B ελέγχουν αυτήν την επιλογή. Δεδομένου ότι αυτά τα δυαδικά ψηφία επιλέγουν επίσης την τιμή του Ν, περιγράφεται στη συνέχεια. Precaler Value, NN είναι η τιμή που χρησιμοποιείται για τη διαίρεση ή την προεπιλογή του ρολογιού του συστήματος. Τα bit CS00, CS01 και CS02 του TCCR0B ελέγχουν αυτήν την επιλογή. Ο πίνακας 41 στη σελίδα 81 του φύλλου δεδομένων ATtiny2313 περιγράφει τους συνδυασμούς. Δεδομένου ότι είναι επιθυμητή μια συχνότητα κοντά στο 1kHz, θα ρυθμιστούν τα bit CS00 και CS01 του TCCR0B. Σημειώστε ότι η ρύθμιση και των τριών bit σε 0, επιλέγοντας έτσι καμία πηγή ρολογιού, σταματά αποτελεσματικά την έξοδο. Αυτή είναι η μέθοδος που θα χρησιμοποιηθεί για την εκκίνηση και τη διακοπή του ηχητικού σήματος. Τιμή ΚΟΡ, OCR0Αυτή η τιμή είναι η τιμή ΚΟΡΥΦΑΙΑ για τον μετρητή που φορτώνεται στο Μητρώο σύγκρισης εξόδου για χρονοδιακόπτη/μετρητή 0Α. Όταν επιτευχθεί αυτή η τιμή, ο μετρητής θα μηδενιστεί και η καταμέτρηση θα ξεκινήσει ξανά έως ότου επιτευχθεί το TOP και ο κύκλος επαναλαμβάνεται. Το TOP τροποποιείται εύκολα, οπότε η συχνότητα του ηχητικού σήματος είναι εύκολο να αλλάξει. Δεδομένου ότι είναι επιθυμητή μια συχνότητα κοντά στο 1kHz, το TOP έχει οριστεί στο 7. (Σημειώστε ότι ο προωθητής προώθησης θα μπορούσε να έχει οριστεί σε 8 και το TOP σε 63. ameδιο αποτέλεσμα - δική σας επιλογή.) Συχνότητα εξόδου, fOC0A Χρησιμοποιώντας την εξίσωση για τον υπολογισμό των αποτελεσμάτων συχνότητας εξόδου σε: fOC0A = 1, 000, 000 /2 * 64 * (1+7) fOC0A = 977Hz Αρκετά κοντά! Ακολουθεί ο κώδικας για τη φόρτωση του Μητρώου σύγκρισης εξόδου και του Μητρώου μετρητή χρονομέτρου 0Β. Ανατρέξτε στον πραγματικό κωδικό προγράμματος για να καταλάβετε πώς χρησιμοποιούνται. OCR0A = 7; // Χρονική αξία TCCR0B = _BV (CS01) | _BV (CS00); // Επιλογή εσωτερικού ρολογιού & prescale = 8 TCCR0B = 0; // καμία πηγή ρολογιού δεν απενεργοποιεί τον τόνο Ρύθμιση της λειτουργίας ώρας/μετρητήΣε τελευταία λεπτομέρεια, θα καθορίσουμε τη λειτουργία χρονομέτρου/μετρητή που επιθυμούμε, ορίζοντας τα κατάλληλα bits στο χρονοδιακόπτη/μετρητή ελέγχου μετρητή 0Α. Η λειτουργία CTC επιλέγεται με τη ρύθμιση του bit WGM01 όπως περιγράφεται στον πίνακα 40, σελίδα 79 του φύλλου δεδομένων. Δεδομένου ότι θέλουμε την έξοδο να εναλλάσσει κάθε κύκλο, το bit COM0A0 πρέπει επίσης να ρυθμιστεί όπως περιγράφεται στον πίνακα 34 στη σελίδα 77. Ακολουθεί ο κωδικός: TCCR0A = _BV (COM0A0) | _BV (WGM01); // Λειτουργία εναλλαγής CTC

Βήμα 7: Χρήση τεσσάρων διακοπτών

Καθώς υλοποιούμε το ηχητικό σήμα, ας επεκτείνουμε το υλικό και το λογισμικό μας ώστε να χειρίζεται τέσσερις διακόπτες. Δεδομένου ότι η έξοδος του μετρητή χρονομέτρου 0A βρίσκεται στη θύρα Β, τον ακροδέκτη 2, δεν μπορούμε απλά να συνδέσουμε διαδοχικά περισσότερους διακόπτες στη θύρα Β. Μια εύκολη λύση θα ήταν η χρήση της θύρας D, αλλά ας διατηρήσουμε τη θύρα αυτή διαθέσιμη για άλλες λειτουργίες (ίσως βηματικό μοτέρ). Ας συνδέσουμε λοιπόν τους επιπλέον διακόπτες σε PB3 και PB4. Η ανάγνωση των διακοπτών είναι ως επί το πλείστον αμετάβλητη. Η τιμή μάσκας αλλάζει σε 0x1B (00011011 δυαδικό) σε μάσκα bit 2 μαζί με 5, 6 και 7. Ένα ακόμη κόλπο χρησιμοποιείται για τη δημιουργία ενός δυαδικού αριθμού 4-bit. Μετατοπίστε τα bit 3 και 4 δεξιά ένα bit και συνδυάστε τα με τα bits 0 και 1 σε έναν δυαδικό αριθμό 4 bit. Αυτή είναι η τυπική σύνταξη C για μετατόπιση και συνδυασμό δυαδικών ψηφίων, αλλά μπορεί να μην είναι πολύ γνωστή στον αρχάριο. but1a = (but1 & 0x03) | ((but1 & 0x18) >> 1); // but1 έχει ανάγνωση διακόπτη Σε λειτουργία, το πρόγραμμα θα αναβοσβήνει δύο φορές και θα ηχεί δύο φορές για να ξεκινήσει το σήμα. Κάθε φορά που αλλάζουν οι διακόπτες, ο αριθμός που αντιπροσωπεύουν θα ηχεί. Όταν οι διακόπτες δεν αλλάζουν, η λυχνία LED θα αναβοσβήνει. Για να εκτελέσετε αυτόν τον κώδικα, δημιουργήστε έναν νέο κατάλογο (ονομάστε τον Beep αν θέλετε) και κατεβάστε το ακόλουθο αρχείο κώδικα C και κάντε αρχείο σε αυτό. Μετονομάστε το Makefile2.txt σε απλώς Makefile. Χρησιμοποιώντας το WinAVR, μεταγλωττίστε το πρόγραμμα και φορτώστε το στο Attiny2313 σας.

Βήμα 8: Χρησιμοποιώντας το Switch/case Construct

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

Για να εκτελέσετε αυτόν τον κώδικα, δημιουργήστε έναν νέο κατάλογο (καλέστε το Switch, αν θέλετε) και κατεβάστε το ακόλουθο αρχείο κώδικα C και κάντε αρχείο σε αυτό. Μετονομάστε το Makefile3.txt σε απλώς Makefile. Χρησιμοποιώντας το WinAVR, μεταγλωττίστε το πρόγραμμα και φορτώστε το στο Attiny2313.

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

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

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

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

Συνιστάται: