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

Arduino Tone Generator Χωρίς βιβλιοθήκη ή σειριακές λειτουργίες (με διακοπές): 10 βήματα
Arduino Tone Generator Χωρίς βιβλιοθήκη ή σειριακές λειτουργίες (με διακοπές): 10 βήματα

Βίντεο: Arduino Tone Generator Χωρίς βιβλιοθήκη ή σειριακές λειτουργίες (με διακοπές): 10 βήματα

Βίντεο: Arduino Tone Generator Χωρίς βιβλιοθήκη ή σειριακές λειτουργίες (με διακοπές): 10 βήματα
Βίντεο: Using Digispark Attiny85 Mini Arduino boards: Lesson 108 2024, Νοέμβριος
Anonim
Arduino Tone Generator Χωρίς βιβλιοθήκη ή σειριακές λειτουργίες (με διακοπές)
Arduino Tone Generator Χωρίς βιβλιοθήκη ή σειριακές λειτουργίες (με διακοπές)

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

Αυτός ο κωδικός έχει σχεδιαστεί για τον μικροελεγκτή Atmega 2560, οπότε αν θέλετε να τον εφαρμόσετε σε άλλη πλακέτα θα πρέπει να αλλάξετε τους καταχωρητές διευθύνσεων στον κώδικα με βάση το εγχειρίδιο χρήστη των χειριστηρίων σας. Η βασική ιδέα πίσω από τον κώδικα είναι ότι κάθε φορά που εισάγετε ένα κλειδί στο πληκτρολόγιο στη σειριακή οθόνη, το arduino mega θα βγάζει μια συγκεκριμένη συχνότητα με βάση το πλήκτρο που πατάτε, με το "q" να το επαναφέρει. Το έκανα έτσι ώστε το "a" να βγάζει την επίπεδη συχνότητα A και το "A" να βγάζει την απότομη συχνότητα A, το "b" να βγαίνει B επίπεδο, "c" για το C επίπεδο, το "C" για το C ευκρινές, και ούτω καθεξής. Ο πλήρης κώδικας μεταφορτώνεται στο τέλος, αλλά κάθε βήμα θα διασπάσει τον κώδικα σε κομμάτια, ώστε να είναι πιο εύκολο να εξηγηθεί.

Βήμα 1: Καθορισμός διευθύνσεων μητρώου

Καθορισμός διευθύνσεων μητρώου
Καθορισμός διευθύνσεων μητρώου

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

Βήμα 2: Πίνακες και καθολικές μεταβλητές

Πίνακες και καθολικές μεταβλητές
Πίνακες και καθολικές μεταβλητές
Πίνακες και καθολικές μεταβλητές
Πίνακες και καθολικές μεταβλητές
Πίνακες και καθολικές μεταβλητές
Πίνακες και καθολικές μεταβλητές

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

Βήμα 3: Η συνάρτηση "serial.begin"

ο
ο

Θα καλέσουμε την προσαρμοσμένη συνάρτηση που επαναλαμβάνει τη συνάρτηση "serial.begin" U0init (). Παίρνει το επιθυμητό baudrate ως είσοδο και ξεκινά τη σειριακή θύρα σε αυτό το baudrate.

Βήμα 4: Η συνάρτηση "serial.available"

ο
ο

Θα καλέσουμε τη συνάρτηση που μιμείται "serial.available" U0kbhit (). Δεν απαιτεί είσοδο, αλλά ανιχνεύει αν υπάρχει αλλαγή στο πληκτρολόγιο χρησιμοποιώντας το bit κατάστασης RDA και επιστρέφει true όταν εντοπιστεί μια αλλαγή.

Βήμα 5: Η συνάρτηση "serial.read"

ο
ο

Θα καλέσουμε τη συνάρτηση που μιμείται τη συνάρτηση "serial.read" U0getchar (), η οποία δεν λαμβάνει καμία είσοδο και εξάγει οποιαδήποτε αλλαγή γίνει στο πληκτρολόγιο, το οποίο είναι αποθηκευμένο στο μητρώο UDR0.

Βήμα 6: Η συνάρτηση "serial.write"

ο
ο

Θα καλέσουμε τη συνάρτηση που μιμείται το "serial.write" U0putchar (), το οποίο λαμβάνει τα δεδομένα από το μητρώο UDR0 ενώ ανιχνεύεται και αποθηκεύεται μια αλλαγή και εξάγονται ξανά στη σειριακή οθόνη.

Βήμα 7: Η λειτουργία ρύθμισης

Η λειτουργία ρύθμισης
Η λειτουργία ρύθμισης

Αυτή είναι η βασική λειτουργία ρύθμισης που θα χρησιμοποιήσει τη μίμηση "serial.begin" για την προετοιμασία της σειριακής θύρας και θα αρχικοποιήσει τις ρυθμίσεις bit μας για τους καταχωρητές χρονοδιακόπτη και θα ρυθμίσει το PB6 να εξάγει τους τόνους μας.

Βήμα 8: Οι λειτουργίες βρόχου και ISR

Οι λειτουργίες Loop και ISR
Οι λειτουργίες Loop και ISR

Ο βρόχος λειτουργεί ως εξής: εάν εντοπιστεί αλλαγή με τη συνάρτηση "serial.available", η συνάρτηση "serial.read" αποθηκεύει αυτές τις αλλαγές και η συνάρτηση "serial.write" τοποθετεί αυτήν την αλλαγή στη σειριακή οθόνη. Όσο μια μεταβλητή i είναι μικρότερη από το μέγεθος της συστοιχίας συχνοτήτων, θα ορίσει την έξοδο να είναι η θέση του i σε αυτόν τον πίνακα, εξάγοντας τη συχνότητα σε αυτήν τη θέση. Το ISR λειτουργεί ως επαναφορά, όπου εάν η θέση συστοιχίας συχνότητας δεν είναι ίση με 0 (με άλλα λόγια αν δεν πατηθεί το "q"), θα εξάγει τη συχνότητα, αλλά όταν πατηθεί το "q" θα επαναρυθμιστεί. Σημειώστε: Αυτός ο κώδικας χρησιμοποιεί διακοπές, αλλά μπορεί να γίνει με απενεργοποιημένες διακοπές. Θα δημοσιεύσω τον κώδικα χωρίς διακοπή εάν λάβω οποιαδήποτε αίτηση γι 'αυτόν, απλώς πιστεύω ότι η έκδοση διακοπής είναι πιο διασκεδαστική.

Βήμα 9: Καλωδίωση

Καλωδίωση
Καλωδίωση

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

Βήμα 10: Το βάζουμε όλα μαζί

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

Επίσης, ψηφίστε το στο διαγωνισμό Microcontroller: D

Συνιστάται: