Μικροελεγκτές Atmega8. Atmega8 Προγραμματισμός για αρχάριους

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

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

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

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

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

Μικροελεγκτές AVR

Ας γνωρίσουμε έναν πιο κοινό και καθιερωμένο ελεγκτή στον σύγχρονο κόσμο της τεχνολογίας, όπως το AVR. Αποτελείται από έναν υψηλής ταχύτητας μικροεπεξεργαστή RISC, 2 τύπους μνήμης που καταναλώνει ενέργεια (cache έργου Flash και cache πληροφοριών EEPROM), μια λειτουργική κρυφή μνήμη τύπου RAM, θύρες I/O και μια ποικιλία δομών απομακρυσμένης διεπαφής.

  • η θερμοκρασία λειτουργίας κυμαίνεται από -55 έως +125 βαθμούς Κελσίου.
  • η θερμοκρασία αποθήκευσης είναι από -60 έως +150 μοίρες.
  • η υψηλότερη τάση στον ακροδέκτη RESET, σύμφωνα με το GND: μέγιστο 13 V;
  • μέγιστη τάση τροφοδοσίας: 6,0 V;
  • μέγιστο ηλεκτρικό ρεύμα της γραμμής εισόδου/εξόδου: 40 mA;
  • Μέγιστο ρεύμα στη γραμμή τροφοδοσίας VCC και GND: 200 mA.

Δυνατότητες μικροελεγκτή AVR

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

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

Η διαμόρφωση της δομής των θυρών εισόδου και εξόδου του AVR έχει ως εξής: ο σκοπός της φυσιολογικής εξόδου είναι τρία bit ρύθμισης, και όχι δύο, όπως σε γνωστούς ελεγκτές bit (Intel, Microchip, Motorola κ.λπ. ). Αυτή η ιδιότητα εξαλείφει την ανάγκη ύπαρξης μιας διπλής θύρας στη μνήμη για λόγους προστασίας και επίσης επιταχύνει την ενεργειακή απόδοση του μικροελεγκτή σε συνδυασμό με εξωτερικές συσκευές, συγκεκριμένα, σε περίπτωση συναφών ηλεκτρικών προβλημάτων έξω.

Όλοι οι μικροελεγκτές AVR διαθέτουν τεχνολογία καταστολής πολλαπλών επιπέδων. Φαίνεται να διακόπτει την τυπική ροή του Russifier για να πετύχει έναν στόχο που είναι προτεραιότητα και καθορίζεται από ορισμένα γεγονότα. Υπάρχει μια ρουτίνα για τη μετατροπή ενός αιτήματος αναστολής για μια συγκεκριμένη περίπτωση και βρίσκεται στη μνήμη του έργου.

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

Χειροτεχνίες βασισμένες στον μικροελεγκτή AVR

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

"Διευθυντής"

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

Το κύκλωμα είναι κατασκευασμένο με βάση έναν μικροελεγκτή AVR χρονισμένο από έναν εξωτερικό συντονιστή χαλαζία στα 11,0598 MHz. Η NEO-6M από την U-blox είναι υπεύθυνη για την εργασία με το GPS. Αυτή, αν και ξεπερασμένη, είναι μια πολύ γνωστή και οικονομική ενότητα με μια αρκετά σαφή ικανότητα προσδιορισμού τοποθεσίας. Οι πληροφορίες εστιάζονται στην οθόνη του Nokia 5670. Το μοντέλο περιέχει επίσης ένα μετρητή μαγνητικού κύματος HMC5883L και ένα επιταχυνσιόμετρο ADXL335.


Ασύρματο σύστημα συναγερμού με αισθητήρα κίνησης

Μια χρήσιμη συσκευή που περιλαμβάνει μια συσκευή κίνησης και τη δυνατότητα να δίνει, σύμφωνα με ένα ραδιοφωνικό κανάλι, ένα σημάδι ότι έχει πυροδοτηθεί. Το σχέδιο είναι κινητό και φορτίζεται με μπαταρία ή μπαταρίες. Για να το φτιάξετε, πρέπει να έχετε πολλές μονάδες ραδιοφώνου HC-12, καθώς και έναν αισθητήρα κίνησης HC-SR501.

Η συσκευή κίνησης HC-SR501 λειτουργεί με τάση τροφοδοσίας από 4,5 έως 20 βολτ. Και για βέλτιστη λειτουργία από μια μπαταρία ιόντων LI, θα πρέπει να περιηγηθείτε στο LED ασφαλείας στην είσοδο ισχύος και να κλείσετε την πρόσβαση και την έξοδο του γραμμικού σταθεροποιητή 7133 (2ο και 3ο σκέλος). Με την ολοκλήρωση αυτών των διαδικασιών, η συσκευή ξεκινά σταθερή λειτουργία σε τάση 3 έως 6 βολτ.


Προσοχή: όταν εργάζεστε σε συνδυασμό με τη μονάδα ραδιοφώνου HC-12, ο αισθητήρας μερικές φορές ενεργοποιείται εσφαλμένα. Για να αποφευχθεί αυτό, είναι απαραίτητο να μειωθεί η ισχύς του πομπού κατά 2 φορές (εντολή AT+P4). Ο αισθητήρας λειτουργεί με λάδι και μια φορτισμένη μπαταρία χωρητικότητας 700 mAh θα διαρκέσει για περισσότερο από ένα χρόνο.

Miniterminal

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


Θα πρέπει να πάρετε μια μονάδα μετατροπέα που βασίζεται στο LM2577 και η βάση μπορεί να είναι μια μπαταρία Li-Ion χωρητικότητας 2500 mAh. Θα υπάρχει ένα χρήσιμο πακέτο που θα παρέχει σταθερά 3,3 βολτ σε όλο το εύρος της τάσης λειτουργίας. Για σκοπούς φόρτισης, χρησιμοποιήστε μια μονάδα βασισμένη στο τσιπ TP4056, η οποία θεωρείται φιλική προς τον προϋπολογισμό και αρκετά υψηλής ποιότητας. Για να μπορέσετε να συνδέσετε το μίνι τερματικό σε μηχανισμούς 5 volt χωρίς κίνδυνο καύσης της οθόνης, πρέπει να χρησιμοποιήσετε θύρες UART.

Βασικές πτυχές του προγραμματισμού του μικροελεγκτή AVR

Η κωδικοποίηση μικροελεγκτή γίνεται συχνά σε στυλ συναρμολόγησης ή SI, ωστόσο, μπορείτε επίσης να χρησιμοποιήσετε άλλες γλώσσες Forth ή BASIC. Έτσι, για να ξεκινήσετε πραγματικά την έρευνα σχετικά με τον προγραμματισμό του ελεγκτή, θα πρέπει να είστε εξοπλισμένοι με το ακόλουθο σετ υλικών, που περιλαμβάνει: έναν μικροελεγκτή, σε ποσότητα τριών τεμαχίων - τα ATmega8A-PU, ATtiny2313A-PU και ATtiny13A-PU θεωρούνται ιδιαίτερα δημοφιλή και αποτελεσματική.

Για να εφαρμόσετε ένα πρόγραμμα σε έναν μικροελεγκτή, χρειάζεστε έναν προγραμματιστή: ο προγραμματιστής USBASP θεωρείται ο καλύτερος, ο οποίος παρέχει τάση 5 Volt, η οποία θα χρησιμοποιηθεί στο μέλλον. Για τους σκοπούς της οπτικής αξιολόγησης και των συμπερασμάτων των αποτελεσμάτων του έργου, χρειάζονται πόροι αντανάκλασης δεδομένων - πρόκειται για LED, επαγωγέα LED και οθόνη.


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

Για να εγκαταστήσετε τα συστήματα, θα χρειαστείτε ένα δείγμα πλακέτας στερέωσης. Για να δημιουργήσετε ένα σχέδιο σε έναν μικροελεγκτή, θα πρέπει να χρησιμοποιήσετε μια πλακέτα ψωμιού για συναρμολόγηση χωρίς συγκόλληση και ένα σετ βραχυκυκλωτικών για αυτό: μια πλακέτα δειγμάτων MB102 και συνδέσμους βραχυκυκλωτήρες με την πλακέτα ψησίματος διαφόρων τύπων - ελαστική και άκαμπτη, καθώς και σε σχήμα U. Οι μικροελεγκτές κωδικοποιούνται χρησιμοποιώντας τον προγραμματιστή USBASP.

Η απλούστερη συσκευή που βασίζεται στον μικροελεγκτή AVR. Παράδειγμα

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

Το μέγιστο δυνατό ηλεκτρικό ρεύμα με το οποίο μπορεί να φορτωθεί ένα πρόγραμμα είναι 2 A ανά κανάλι και η μέγιστη ισχύς των κινητήρων είναι 20 W. Στην πλακέτα υπάρχει ένα ζεύγος μπλοκ δύο ακροδεκτών για τη σύνδεση ηλεκτροκινητήρων και ένα μπλοκ τριών ακροδεκτών για την παροχή ενισχυμένης τάσης.

Η συσκευή μοιάζει με πλακέτα τυπωμένου κυκλώματος διαστάσεων 43 x 43 mm και πάνω της είναι χτισμένο ένα μίνι κύκλωμα καλοριφέρ, το ύψος του οποίου είναι 24 χιλιοστά και το βάρος είναι 25 γραμμάρια. Για τον χειρισμό του φορτίου, η πλακέτα οδηγού περιέχει περίπου έξι εισόδους.

συμπέρασμα

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

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

Ένα απλό στροφόμετρο στον μικροελεγκτή ATmega8

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

Διαβάστε πλήρως

Έγχρωμη μουσική στον μικροελεγκτή Attiny45 στο αυτοκίνητο

Αυτή η έγχρωμη μουσική, με μικρό μέγεθος και τροφοδοσία 12 V, μπορεί εναλλακτικά να χρησιμοποιηθεί σε αυτοκίνητο για οποιαδήποτε εκδήλωση. Η κύρια πηγή αυτού του διαγράμματος είναι το Radio No. 5, 2013 A. LAPTEV, Zyryanovsk, Καζακστάν. Σχέδιο…

Διαβάστε πλήρως

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

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

Διαβάστε πλήρως

Dimmer για λάμπα αυτοκινήτου

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

Διαβάστε πλήρως

Συναγερμός GSM με ειδοποίηση κινητού τηλεφώνου

Παρουσιάζω ένα πολύ δημοφιλές κύκλωμα συναγερμού αυτοκινήτου που βασίζεται στον μικροελεγκτή ATmega8. Ένας τέτοιος συναγερμός δίνει μια ειδοποίηση στο κινητό τηλέφωνο του διαχειριστή με τη μορφή κλήσεων ή SMS. Η συσκευή ενσωματώνεται με ένα κινητό τηλέφωνο χρησιμοποιώντας...

Διαβάστε πλήρως

Αναβοσβήνει στοπ στο μικροελεγκτή

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

Διαβάστε πλήρως

DRL συν στροβοσκοπικά

Αυτό το σκάφος σάς επιτρέπει να κάνετε στροβοσκοπικά LED DRL. Το σκάφος είναι μικρό σε μέγεθος, ελέγχεται με ένα μόνο κουμπί και έχει ευρείες επιλογές προσαρμογής. Το μέγεθος της σανίδας είναι 30 επί 19 χιλιοστά. Στην πίσω πλευρά υπάρχει ένα μπλοκ ακροδεκτών...

Διαβάστε πλήρως

Φτιάχνουμε και συνδέουμε την πόρτα πιο κοντά στο σύστημα συναγερμού

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

Διαβάστε πλήρως

Τα LED ανάβουν ανάλογα με την ταχύτητα

Αποδείχθηκε ότι ήταν ένα "παραπροϊόν": ήταν απαραίτητο να δοκιμάσετε τον τρόπο λειτουργίας του αισθητήρα ταχύτητας για το έργο της εμφάνισης ταχυτήτων σε μια μήτρα 5x7, γι 'αυτό συναρμολόγησα ένα μικρό κύκλωμα. Το κύκλωμα μπορεί να ανάψει LED ανάλογα...

Διαβάστε πλήρως

Ψηφιακό στροφόμετρο σε μικροελεγκτή AVR (ATtiny2313)

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

Διαβάστε πλήρως

Απλό ψηφιακό ταχύμετρο στον μικροελεγκτή ATmega8

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

Διαβάστε πλήρως

Ομαλή ανάφλεξη του τακτοποιημένου στον μικροελεγκτή

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

Έργα στο ATMega8.

Απλά έργα για τη μελέτη ενός από τους απλούστερους και δημοφιλέστερους μικροελεγκτές.

Για να εργαστείτε θα χρειαστείτε τουλάχιστον CodeVision AVR2.04.4a και Proteus 7.2 SP6. Αν θέλετε να δουλέψετε με υλικό, θα χρειαστείτε και προγραμματιστή. Συνιστώ αυτό - είναι εύκολο στη συναρμολόγηση και λειτουργεί καλά. Το μόνο πρόβλημα είναι με το αρχικό υλικολογισμικό ATMega8, αυτό μπορεί να γίνει είτε μέσω της θύρας LPT - 5-provodov-avr, είτε μπορείτε να αγοράσετε έναν "ενσύρματο" μικροελεγκτή, πήρα .


Φανάρι Νο 1.

Το πιο απλό φανάρι προς μία κατεύθυνση δεν απαιτεί πολλή προσπάθεια και επιδεξιότητα για να δημιουργηθεί. Το κύκλωμα συναρμολογείται σε λίγα λεπτά. Οι αντιστάσεις επιλέγονται με βάση τα LED που χρησιμοποιούνται (η βαθμολογία 470 Ohm υποδεικνύεται για το "Σοβιετικό" AL307), πρέπει να σημειωθεί ότι στο διάγραμμα ο ακροδέκτης AVCC συνδέεται στο τροφοδοτικό, εάν δεν είναι συνδεδεμένος σε πραγματικό μικροελεγκτή, ανεξάρτητα από τη χρήση του ενσωματωμένου ADC (μετατροπέας αναλογικού σε ψηφιακό), τότε μπορείτε να βλάψετε το μικροκύκλωμα (αληθεύει για κάθε ελεγκτή της σειράς Mega)!!!

Ο πηγαίος κώδικας είναι τόσο απλός που θα τον παρουσιάσω εδώ. Βρήκα αυτόν τον κωδικό για το C στο Διαδίκτυο και τον διόρθωσα λίγο, ωστόσο, οποιοσδήποτε προγραμματιστής θα σας πει ότι αυτός ο κώδικας είναι ανόητος (αργότερα θα περιγράψω ακριβώς πώς να γράψω τέτοια προγράμματα), αλλά είναι απλός, οπτικός και λειτουργεί.

Τύπος τσιπ: ATmega8
Τύπος προγράμματος: Εφαρμογή

Μοντέλο μνήμης: Μικρό
Μέγεθος στοίβας δεδομένων: 256


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

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

κενό κύριο (κενό)
{
// Αρχικοποίηση θύρας Β
PORTB=0x00;
DDRB=0x00;

// Αρχικοποίηση θύρας C
PORTC=0x00;
DDRC=0x00;

// Αρχικοποίηση θύρας D
PORTD=0x00;
DDRD=0x07;

// Αρχικοποίηση εξωτερικής διακοπής
// INT0: Απενεργοποίηση
// INT1: Απενεργοποίηση
MCUCR=0x00;


// Αναλογικός Συγκριτής: Απενεργοποίηση

ACSR=0x80;
SFIOR=0x00;

ενώ (1) (

PORTD.2=1; //πράσινα φώτα ανάβουν
καθυστέρηση_ms(8000); //ανάβει για 8 δευτερόλεπτα


καθυστέρηση_ms(500); //Περιμένετε μισό δευτερόλεπτο


PORTD.2=0; //Απενεργοποιήστε το πράσινο

PORTD.2=1; //Ενεργοποίηση πράσινου

/*delay_ms(500);//Περιμένετε μισό δευτερόλεπτο
PORTD.2=0; //Απενεργοποιήστε το πράσινο
καθυστέρηση_ms(500); //Περιμένετε μισό δευτερόλεπτο
PORTD.2=1; //Ενεργοποίηση πράσινου
καθυστέρηση_ms(500); //Περιμένετε μισό δευτερόλεπτο*/

PORTD.1=1; //Ενεργοποιήστε το κίτρινο
PORTD.2=0; //Απενεργοποιήστε το πράσινο
καθυστέρηση_ms(3000); //Περιμένετε 3 δευτερόλεπτα

PORTD.0=1; //Ενεργοποίηση κόκκινου
PORTD.1=0; //απενεργοποιήστε το κίτρινο
καθυστέρηση_ms(9000); //για 9 δευτερόλεπτα

PORTD.1=1; //γίνεται κίτρινο σε κόκκινο
καθυστέρηση_ms(3000); //περιμένετε 3 δευτερόλεπτα
PORTD.0=0; // Απενεργοποιήστε το κόκκινο
PORTD.1=0; //και κίτρινο
};
}

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

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

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

Αυτά είναι τα λεγόμενα αρχεία κεφαλίδας, σε αυτά είναι γραμμένες διαδικασίες που θα εφαρμόσουμε από άλλα αρχεία. Για παράδειγμα, η διαδικασία delay_ms(X), η οποία καθορίζει την καθυστέρηση σε χιλιοστά του δευτερολέπτου, γράφτηκε από άλλο άτομο και περιέχεται στο αρχείο delay.c (στην πραγματικότητα, όλα μπορεί να μην είναι ακριβώς έτσι ή καθόλου - η διαδικασία μπορεί να περιέχει ένα αρχείο αντικειμένου τύπου *. obj, *.asm) και οι κανόνες χρήσης του περιγράφονται στο αρχείο delay.h, το οποίο συμπεριλαμβάνουμε.

PORTB=0x00;
DDRB=0x00;

Δεσμευμένα ονόματα που δηλώνουν καταχωρητές θυρών ελεγκτή (οι ακίδες του ομαδοποιούνται κατά byte - 8 το καθένα, κάθε bit του καταχωρητή θύρας αντιστοιχεί στη δική του ακίδα) και καταχωρητές κατεύθυνσης ανταλλαγής θυρών (0-είσοδος, 1-έξοδος)

Για παράδειγμα, γράφοντας DDRB.5=1 σημαίνει ότι η ακίδα PB5 του ελεγκτή έχει ρυθμιστεί για έξοδο και όταν γράφουμε PORTB.5=0 ή =1, σε αυτήν την ακίδα παίρνουμε 0 (0...0,8 Volts) ή 1 (4...5 Volt). Φυσικά, μπορείτε να αντιστοιχίσετε αμέσως ολόκληρη την τιμή στη θύρα: PORTB=0xFF, δηλ. όλες οι ακίδες της θύρας PB είναι 1.

while(1) (έκφραση);

είναι ένας άπειρος βρόχος γιατί 1=TRUE.

Φανάρι Νο 2.


Για να λάβετε ένα φανάρι σε δύο κατευθύνσεις, πρέπει να τροποποιήσετε το διάγραμμα φαναριού Νο. 1:


και κωδικός φαναριού Νο. 1:

/*****************************************************
Τύπος τσιπ: ATmega8
Τύπος προγράμματος: Εφαρμογή
Συχνότητα ρολογιού πυρήνα AVR: 1.000000 MHz
Μοντέλο μνήμης: Μικρό
Μέγεθος εξωτερικής μνήμης RAM: 0
Μέγεθος στοίβας δεδομένων: 256
*****************************************************/

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

κενό κύριο (κενό)
{
// Αρχικοποίηση θύρας Β
PORTB=0x00;
DDRB=0x00;

// Αρχικοποίηση θύρας C
PORTC=0x00;
DDRC=0x00;

// Αρχικοποίηση θύρας D
PORTD=0x00;
DDRD=0b00111111;

ACSR=0x80;
SFIOR=0x00;

ενώ (1)
{
PORTD.2=1; //πράσινο1 ανάβει Z1
PORTD.3=1; //κόκκινο2 ανάβει το K2
καθυστέρηση_ms(8000); //πράσινο1 ανάβει για 8 δευτερόλεπτα

PORTD.2=0; //απενεργοποίηση πράσινου1 ZM1
καθυστέρηση_ms(500); //περιμένετε μισό δευτερόλεπτο

καθυστέρηση_ms(500); //περιμένετε μισό δευτερόλεπτο

καθυστέρηση_ms(500); //περιμένετε μισό δευτερόλεπτο
PORTD.2=1; //ενεργοποίηση πράσινου1
καθυστέρηση_ms(500); //περιμένετε μισό δευτερόλεπτο

PORTD.1=1; //ενεργοποίηση πορτοκαλί1 J1 K2+J2
PORTD.4=1; //ενεργοποίηση πορτοκαλί2
PORTD.2=0; //απενεργοποιήστε το πράσινο1


PORTD.0=1; //ενεργοποίηση κόκκινου1 K1
PORTD.5=1; //ενεργοποίηση πράσινου2 Z2
PORTD.1=0; //απενεργοποίηση πορτοκαλί1
PORTD.4=0; //απενεργοποίηση πορτοκαλί2
PORTD.3=0; //απενεργοποίηση κόκκινου2
καθυστέρηση_ms(8000); //περιμένετε 8 δευτερόλεπτα

PORTD.5=0; //απενεργοποίηση πράσινου2 ZM2
καθυστέρηση_ms(500); //περιμένετε μισό δευτερόλεπτο

καθυστέρηση_ms(500); //περιμένετε μισό δευτερόλεπτο

καθυστέρηση_ms(500); //περιμένετε μισό δευτερόλεπτο
PORTD.5=1; //ενεργοποίηση πράσινου2
καθυστέρηση_ms(500); //περιμένετε μισό δευτερόλεπτο

PORTD.1=1; //ενεργοποίηση πορτοκαλί1 σε κόκκινο1 K1+J1
PORTD.4=1; //ενεργοποίηση πορτοκαλί2 J2
PORTD.5=0; //απενεργοποιήστε το πράσινο2
delay_ms (2000); //περιμένετε 2 δευτερόλεπτα
PORTD.0=0; //Απενεργοποίηση κόκκινου1
PORTD.1=0; //και πορτοκαλί1
PORTD.4=0; //και πορτοκαλί2
};
}

σχόλια κώδικα:

DDRD=0b00111111; //0b(b7)(b6)(b5)(b4)(b3)(b2)(b1)(b0)

Στα δεξιά υπάρχει μια αναπαράσταση bit (δυαδική) ενός αριθμού στον οποίο το πιο σημαντικό ψηφίο βρίσκεται στα αριστερά· θα μπορούσε επίσης να γραφτεί σε δεκαδικό (DDRD=63;) ή δεκαεξαδικό (DDRD=0x3F;).

κενό κύριο (κενό)

Main είναι η κύρια διαδικασία, η εκτέλεση του προγράμματος ξεκινά με αυτό, void σημαίνει κυριολεκτικά τίποτα (μηδενικός τύπος), αντί για void μπορείτε να αντικαταστήσετε (υπογεγραμμένο ή ανυπόγραφο) το int, long? float, double και ούτω καθεξής (ακόμα και ένας δείκτης σε μια άλλη μεταβλητή, η οποία θα συζητηθεί αργότερα). Επιπλέον, η αντικατάσταση του void με κάποιο τύπο στην πρώτη θέση σημαίνει ότι αυτή η κατασκευή είναι μια συνάρτηση, όχι μια διαδικασία, και μπορεί να επιστρέψει μια τιμή, π.χ. πρέπει να συμπληρωθεί μέσα με τη λέξη ΕΠΙΣΤΡΟΦΗ.

int fun (κενό) (
int a=10;
επιστροφή(α)·
}

Όλες οι αλλαγές έγιναν σύμφωνα με το διάγραμμα εργασίας:


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



Φανάρι Νο 3.


Τα Παραδείγματα Νο. 1 και Νο. 2 επεσήμαναν μια κάπως «απλή» χρήση κώδικα, η οποία είναι αποδεκτή για μικρά προγράμματα, αλλά δεν μπορεί να χρησιμοποιηθεί λόγω σπατάλης πόρων σε μεγάλες εφαρμογές.
Για να απλοποιήσουν και να συντομεύσουν τον κώδικα σε τεχνολογικές εφαρμογές, οι προγραμματιστές συνήθως χρησιμοποιούν αυτόματα. Το αυτόματο είναι ένα απλοποιημένο και επαρκές μοντέλο της διαδικασίας. Για παράδειγμα, ολόκληρη η λειτουργία ενός φαναριού μπορεί να χωριστεί σε έναν ορισμένο πεπερασμένο αριθμό καταστάσεων που θα επαναληφθούν με μια ορισμένη περίοδο. Για να αναπαραστήσετε το αυτόματο, θα χρειαστείτε έναν μετρητή κατάστασης λογισμικού και έναν αποκωδικοποιητή κατάστασης. Το φανάρι Νο. 3, το οποίο αποτελείται από φανάρι μεταφοράς σε 4 κατευθύνσεις, 4 φανάρια πεζών, 1 φανάρι σιδηροδρομικής διασταύρωσης, 1 πεζό που αναβοσβήνει, θα ήταν προβληματικό να δημιουργηθεί χωρίς αυτόματη συσκευή.


Ο κωδικός χωρίς επεξεργασία φαναριών πεζών και σιδηροδρόμων φαίνεται παρακάτω. Είναι εύκολο να καταλάβει κανείς ότι διαδικασίες όπως
void SetRedT1(void) //Φανάρι μεταφοράς1 ανάβει το κόκκινο D3
{
ptc|=0x01;
}
ορίστε ή διαγράψτε μεμονωμένα bit.

Στον κύριο βρόχο, η τιμή του μετρητή i αυξάνεται συνεχώς μέχρι να φτάσει το 48.
i++;
Σε αυτήν την περίπτωση, ο μετρητής μηδενίζεται.
εάν (i==48) (i=0;); // 24c=0,5*48

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

φλας ανυπόγραφο char sw[N]=(
//G1Y1R1G2Y2R2 XX
0b10000100, //1 Χ περίοδοι Πράσινο1 και Κόκκινο2 είναι αναμμένα
0b10000100, //2
...
0b00000100, // X περίοδοι Πράσινο1 αναβοσβήνει,

0b10000100, //
...
0b01001100, //K-1 Πράσινο1 σβήνει, Κίτρινο1 και Κίτρινο2 ανάβουν
0b00110000, //K Το κόκκινο1 ανάβει, το πράσινο1 ανάβει, το κίτρινο2 και το κόκκινο2 σβήνουν

...
0b01101000 //Ν
};

ενώ (1)
{
i++;


PORTC=(sw[i]>>x) | μάσκα;
PORTD=(sw[i]>>x) | μάσκα;
καθυστέρηση_ms(500);
};
}

Φυσικά, οι εκφράσεις (sw[i]>>x) | μάσκα περιγράφονται υπό όρους, όλα εξαρτώνται από τη θέση των πληροφοριών σχετικά με τα σήματα στη σταθερά sw.

/*****************************************************
Τύπος τσιπ: ATmega8
Τύπος προγράμματος: Εφαρμογή
Συχνότητα ρολογιού πυρήνα AVR: 1.000000 MHz
Μοντέλο μνήμης: Μικρό
Μέγεθος εξωτερικής μνήμης RAM: 0
Μέγεθος στοίβας δεδομένων: 256
*****************************************************/

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

ανυπόγραφο char ptb=0;
ανυπόγραφο char ptc=0;
ανυπόγραφο char ptd=0;

void SetRedT1() //Φανάρι μεταφοράς1 ανάβει το κόκκινο D3
{
ptc|=0x01;
}

void ResetRedT1() //Φανάρι μεταφοράς1 απενεργοποιεί το κόκκινο D3
{
ptc&=~0x01;
}

void SetYelT1() //Φανάρι μεταφοράς1 ανάβει το κίτρινο D2
{
ptc|=0x02;
}

void ResetYelT1() //Φανάρι μεταφοράς1 απενεργοποιεί το κίτρινο D2
{
ptc&=~0x02;
}

void SetGrnT1() //Φανάρι μεταφοράς1 γίνεται πράσινο D1
{
ptc|=0x04;
}

void ResetGrnT1() //Φανάρι μεταφοράς1 απενεργοποιήστε το πράσινο D1
{
ptc&=~0x04;
}

void SetRedT2() //Φανάρι μεταφοράς2 ανάβει το κόκκινο D6
{
ptc|=0x08;
}

void ResetRedT2() //Φανάρι μεταφοράς2 απενεργοποιεί το κόκκινο D6
{
ptc&=~0x08;
}

void SetYelT2() //Φανάρι μεταφοράς2 ανάβει το κίτρινο D5
{
ptc|=0x10;
}

void ResetYelT2() //Φανάρι μεταφοράς2 απενεργοποιεί το κίτρινο D5
{
ptc&=~0x10;
}

void SetGrnT2() //Φανάρι μεταφοράς2 γίνεται πράσινο D4
{
ptc|=0x20;
}

void ResetGrnT2() //Φανάρι μεταφοράς2 απενεργοποιήστε το πράσινο D4
{
ptc&=~0x20;
}


void SetRedT3() //Φανάρι μεταφοράς3 ανάβει το κόκκινο D9
{
ptd|=0x01;
}

void ResetRedT3() //Φανάρι μεταφοράς3 απενεργοποιεί το κόκκινο D9
{
ptd&=~0x01;
}

void SetYelT3() //Φανάρι μεταφοράς3 ανάβει το κίτρινο D8
{
ptd|=0x02;
}

void ResetYelT3() //Φανάρι μεταφοράς3 απενεργοποιεί το κίτρινο D8
{
ptd&=~0x02;
}

void SetGrnT3() //Φανάρι μεταφοράς3 γίνεται πράσινο D7
{
ptd|=0x04;
}

void ResetGrnT3() //Φανάρι μεταφοράς3 απενεργοποιήστε το πράσινο D7
{
ptd&=~0x04;
}


void SetRedT4() //Φανάρι μεταφοράς2 ανάβει κόκκινο D12
{
ptd|=0x08;
}

void ResetRedT4() //Φανάρι μεταφοράς2 απενεργοποιεί το κόκκινο D12
{
ptd&=~0x08;
}

void SetYelT4() //Φανάρι μεταφοράς2 ανάβει το κίτρινο D11
{
ptd|=0x10;
}

void ResetYelT4() //Φανάρι μεταφοράς2 απενεργοποιεί το κίτρινο D11
{
ptd&=~0x10;
}

void SetGrnT4() //Φανάρι μεταφοράς2 γίνεται πράσινο D10
{
ptd|=0x20;
}

void ResetGrnT4() //Φανάρι μεταφοράς2 απενεργοποιεί το πράσινο D10
{
ptd&=~0x20;
}

// Δηλώστε τις καθολικές μεταβλητές σας εδώ

κενό κύριο (κενό)
{
ανυπόγραφο char i=0;

PORTB=0x00;
DDRB=0xFF;
PORTC=0x00;
DDRC=0xFF;
PORTD=0x00;
DDRD=0xFF;
ACSR=0x80;

ενώ (1)
{
if (i==0) (ResetYelT1();ResetRedT1();SetGrnT1();
ResetYelT2();SetRedT2();
ResetYelT3();ResetRedT3();SetGrnT3();
ResetYelT4();SetRedT4();

) //0s
if (i==16) (ResetGrnT1();
ResetGrnT3();

) //8s
if (i==17) (SetGrnT1();
SetGrnT3();

};
if (i==18) (ResetGrnT1();
ResetGrnT3();

};
if (i==19) (SetGrnT1();
SetGrnT3();

};
if (i==20) (ResetGrnT1();SetYelT1();
SetYelT2();
ResetGrnT3();SetYelT3();
SetYelT4();

) //10s
if (i==24) (ResetYelT1();SetRedT1();
ResetYelT2();ResetRedT2();SetGrnT2();
ResetYelT3();SetRedT3();
ResetYelT4();ResetRedT4();SetGrnT4();

) //12s
if (i==40) (ResetGrnT2();
ResetGrnT4();

) //20s
if (i==41) (SetGrnT2();
SetGrnT4();

};
if (i==42) (ResetGrnT2();
ResetGrnT4();

) //21 δευτ
if (i==43) (SetGrnT2();
SetGrnT4();

};
εάν (i==44) (SetYelT1();
ResetGrnT2();SetYelT2();
SetYelT3();
ResetGrnT4();SetYelT4();

) //22s
i++;
εάν (i==48) (i=0;); // 24c=0,5*48 - κύκλος

//PORTB=ptb;
PORTC=ptc;
PORTD=ptd;
καθυστέρηση_ms(500);
};
}

Ένδειξη στήλης.

Εάν τα προηγούμενα παραδείγματα χρησιμοποιούσαν ψηφιακούς πόρους του μικροελεγκτή, τότε αυτό το παράδειγμα χρησιμοποιεί αναλογικούς - ADC. Ένας μετατροπέας αναλογικού σε ψηφιακό έχει σχεδιαστεί για τη διακριτή μετατροπή ενός αναλογικού σήματος σε ψηφιακό κωδικό με μια συγκεκριμένη συχνότητα δειγματοληψίας. Για αρχάριους, μπορώ μόνο να πω ότι η μέγιστη ταχύτητα ψηφιοποίησης είναι περιορισμένη.

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

Η τάση εισόδου δεν πρέπει να υπερβαίνει την τάση τροφοδοσίας και το τροφοδοτικό 5 volt του μικροελεγκτή χρησιμοποιείται ως τάση αναφοράς και ένας εξωτερικός πυκνωτής στον ακροδέκτη AREF χρησιμοποιείται ως φίλτρο.

Ο κωδικός του προγράμματος δίνεται παρακάτω:

/*****************************************************
Τύπος τσιπ: ATmega8
Τύπος προγράμματος: Εφαρμογή
Συχνότητα ρολογιού πυρήνα AVR: 4.000000 MHz
Μοντέλο μνήμης: Μικρό
Μέγεθος εξωτερικής μνήμης RAM: 0
Μέγεθος στοίβας δεδομένων: 256
*****************************************************/

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

#define ADC_VREF_TYPE 0x40 //5V Vcc + C 4,7uF AREF

//PD0 LED1
//PD1 LED2
//PD2 LED3
//PD3 LED4
//PD4 LED5
//PD5 LED6
//PD6 LED7
//PD7 LED8
//PB0 LED9
//PB1 LED10
//PB2 LED11
//PB3 LED12
//PB4 LED13
//PB5 LED14

//PC4 LED15
//PC5 LED16

συνθ
ανυπόγραφο char PD=
{
0b00000000, //0
0b00000001, //1
0b00000011, //2
0b00000111, //3
0b00001111, //4
0b00011111, //5
0b00111111, //6
0b01111111, //7
0b11111111, //8
//_____________
0b11111111, //9
0b11111111, //10
0b11111111, //11
0b11111111, //12
0b11111111, //13
0b11111111, //14
0b11111111, //15
0b11111111 //16
};
ανυπόγραφο char PB=
{
0b00000000, //0
0b00000000, //1
0b00000000, //2
0b00000000, //3
0b00000000, //4
0b00000000, //5
0b00000000, //6
0b00000000, //7
0b00000000, //8
//_____________
0b00000001, //9
0b00000011, //10
0b00000111, //11
0b00001111, //12
0b00011111, //13
0b00111111, //14
//_____________
0b00111111, //15
0b00111111 //16
};

// Διαβάστε το αποτέλεσμα μετατροπής AD
unsigned int read_adc(unsigned char adc_input)
{
ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
// Χρειάζεται καθυστέρηση για τη σταθεροποίηση της τάσης εισόδου ADC
delay_us(10);
// Ξεκινήστε τη μετατροπή AD
ADCSRA|=0x40;
// Περιμένετε να ολοκληρωθεί η μετατροπή AD
ενώ ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
επιστροφή ADCW?
}

void ADC_init()
{
//Αρχικοποίηση ADC
//Συχνότητα ρολογιού ADC: 125.000 kHz
// Αναφορά τάσης ADC: Vcc, καπ. επί ΑΡΕΦ
ADMUX=ADC_VREF_TYPE & 0xff;
ADCSRA=0x85;
}

Void Decode (σήμα int)
{
PORTD=PD;
PORTB=PB;

εάν (σήμα==15) (PORTC |= 0b00010000;PORTC &= 0b11011111;)
αλλιώς εάν (σήμα==16) (PORTC |= 0b00110000;)
αλλιώς (PORTC &= 0b11001111;)
}

void SetupIO()
{
// Αρχικοποίηση θυρών εισόδου/εξόδου
PORTB=0b00000000;
DDRB= 0b00111111;

PORTC=0b00001100;
DDRC= 0b00110000; //PC0,PC1 = ADC0,ADC1, PC2,PC3 pins εγκατάστασης με PUP

PORTD=0x00;
DDRD=0xFF;
}

κενό κύριο (κενό)
{
// Αρχικοποίηση αναλογικού συγκριτή
// Αναλογικός Συγκριτής: Απενεργοποίηση
// Λήψη εισόδου αναλογικής σύγκρισης με χρονοδιακόπτη/μετρητή 1: Απενεργοποίηση
ACSR=0x80;
SFIOR=0x00;

SetupIO();
ADC_init();

ενώ (1)
{
Decode(read_adc(0)*0.049*0.32);
καθυστέρηση_ms(100);
};
}

Σχεδόν όλες οι τεχνικές που χρησιμοποιούνται σε αυτόν τον κώδικα συζητήθηκαν παραπάνω. Το μόνο πράγμα που θα ήθελα να σημειώσω είναι η εκτεταμένη κατασκευή με τη δήλωση if:
εάν () () //αν (η προϋπόθεση πληρούται) τότε ( )
αλλιώς εάν () () //αλλιώς εάν (η προϋπόθεση πληρούται) τότε ( )
αλλιώς () //αλλιώς ( )

Και έκφραση read_adc(0)*0.049*0.32
το γεγονός είναι ότι το ADC παράγει τις τιμές του σε κλίμακα 0-1023 (2^10), που αντιστοιχεί σε κλίμακα 0-5 βολτ (καθώς η τάση αναφοράς είναι 5 βολτ) και πρέπει πρώτα να λάβουμε βολτ και στη συνέχεια τα μετατρέπουν σε τμήματα ποσοτήτων. 1024*0,049*0,32=16 δηλ. Ολόκληρη η κλίμακα ADC είναι 16 τμήματα.
Ο αριθμός 0,049 λαμβάνεται ως πολλαπλάσιο των 5 βολτ / 1024 μετρήσεις = 0,0048828 (~10 μετρήσεις ADC) και στη συνέχεια πολλαπλασιάζεται με 0,32 πειραματικά για να ληφθεί η ανάφλεξη του τελευταίου τμήματος στην επιθυμητή τάση εισόδου.



Σειριακή θύρα.

Και τώρα προτείνω να βουτήξουμε στον κόσμο των διεπαφών. Το απλούστερο και πιο ευρέως χρησιμοποιούμενο σειριακό πρωτόκολλο, το RS232, μέχρι πρόσφατα, αν και θεωρούνταν απαρχαιωμένο, εξακολουθεί να περιλαμβάνεται στην παραγωγή σύγχρονων μικροελεγκτών - και όχι μόνο ένας, κατά κανόνα, υπάρχουν τώρα τουλάχιστον 4 από αυτούς. Επίσης, πολλές συσκευές εξακολουθούν να χρησιμοποιούν αυτή τη διεπαφή (για παράδειγμα, ορισμένες οθόνες NoritakeItron VFD, συσκευές αργής παραγωγής κ.λπ.). Αυτό το παράδειγμα σάς επιτρέπει να αξιολογήσετε πόσο εύκολο είναι να διαμορφώσετε και να χρησιμοποιήσετε το RS232 (USART) σε μικροελεγκτές.


Παρακάτω είναι ο κωδικός που μεταδίδει τον χαρακτήρα 0.

/*****************************************************
Τύπος τσιπ: ATmega8
Τύπος προγράμματος: Εφαρμογή
Συχνότητα ρολογιού πυρήνα AVR: 1.000000 MHz
Μοντέλο μνήμης: Μικρό
Μέγεθος εξωτερικής μνήμης RAM: 0
Μέγεθος στοίβας δεδομένων: 256
*****************************************************/

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

// Τυπικές συναρτήσεις εισόδου/εξόδου
//#περιλαμβάνω

#define BAUDRATE 57600
#define BaudValue ((11059200UL/(BAUDRATE*16UL))-1)

void USART_Transmit (μη υπογεγραμμένα δεδομένα χαρακτήρων)
{
//(ενώ (!(UCSRA & (1<
UDR = δεδομένα;
ενώ(!(UCSRA & (1<
//UDR = δεδομένα; //Έναρξη μεταφοράς δεδομένων
}

void USART_init(void)
{
UBRRH = BaudValue >> 8;
UBRRL = BaudValue & 0xFF;
//
UCSRB=(1<
DDRD=0x02;
UCSRC = (1<
//UCSRA = (1<
}

κενό κύριο (κενό)
{
ACSR=0x80;
SFIOR=0x00;
USART_init();
ενώ (1){ USART_Transmit(0x30);};
}


Σημειώστε ότι το Proteus δεν υποστηρίζει εξομοίωση UCSRC (ρύθμιση παραμέτρων επικοινωνίας θύρας), επομένως ορίστε τη συχνότητα ταλαντωτή στο 3500000 και στο τερματικό ορίστε τις ακόλουθες παραμέτρους:




Γεια σας, Datagorians!

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

Για να καταλάβετε πώς λειτουργεί αυτό το μαύρο κουτί, θα σας πω για τον μικροελεγκτή (εφεξής MK) ATmega8. Κατ 'αρχήν, η Atmel παράγει μια ολόκληρη σειρά MK της οικογένειας AVR - αυτές είναι οι υποοικογένειες Tiny και Mega. Δεν θα περιγράψω τα πλεονεκτήματα ορισμένων MKs, είναι στο χέρι σας να αποφασίσετε τι σας ταιριάζει καλύτερα. Μερικοί εκπρόσωποι της ευρύτερης οικογένειας:

Λοιπόν, το ATmega8, το απλούστερο MK από όλα τα ATmega:

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

Αυτό είναι ένα γενικευμένο διάγραμμα όλων των ATmega.

Όλοι οι μικροελεγκτές AVR είναι κατασκευασμένοι σύμφωνα με τη λεγόμενη αρχιτεκτονική του Χάρβαρντ, δηλαδή χρησιμοποιείται ξεχωριστή διευθυνσιοδότηση της μνήμης προγράμματος και της μνήμης δεδομένων. Τα πλεονεκτήματα αυτής της αρχιτεκτονικής είναι η αυξημένη ταχύτητα, για παράδειγμα το ATmega εκτελεί μία εντολή ανά παλμό ρολογιού, δηλαδή σε συχνότητα 16 MHz το MK εκτελεί 16 εκατομμύρια λειτουργίες ανά δευτερόλεπτο.

Και τώρα για τον πατσά με τη σειρά.
1. Η γεννήτρια ρολογιού συγχρονίζει όλες τις εσωτερικές συσκευές.
2. Η ROM είναι μια συσκευή μνήμης μόνο για ανάγνωση που χρησιμοποιείται για την αποθήκευση προγραμμάτων και αμετάβλητων δεδομένων (σταθερές).
3. Αποκωδικοποιητής εντολών - είναι ο πιο σημαντικός εδώ, ελέγχει ό,τι του έρθει στο χέρι.
4. Το ALU είναι μια αριθμητική-λογική συσκευή που εκτελεί αριθμητικές (πρόσθεση, αφαίρεση κ.λπ.) και λογικές (AND, OR, NOT, XOR) πράξεις σε αριθμούς.
5. RON – καταχωρητές γενικής χρήσης, η ALU λειτουργεί μαζί τους και χρησιμοποιούνται επίσης για προσωρινή αποθήκευση δεδομένων. Οι καταχωρητές RON μπορούν να συνδυαστούν σε ζεύγη καταχωρητών:
r26: r27 – X;
r28: r29 – Y;
r30: r31 – Z.

Τα ζεύγη καταχωρητών χρησιμοποιούνται για την έμμεση διεύθυνση δεδομένων στη μνήμη RAM.
6. Η RAM είναι μια συσκευή μνήμης τυχαίας πρόσβασης που χρησιμοποιείται για την αποθήκευση δεδομένων, συστοιχιών και στοίβων.
7. PORTA-PORTn – επικοινωνία με τον έξω κόσμο, θύρες εισόδου/εξόδου, λοιπόν, είναι ξεκάθαρο γιατί...
8. Ειδικό Τα UVV είναι ειδικές συσκευές εισόδου/εξόδου, ελεγκτές διαφόρων περιφερειακών, για παράδειγμα USART (γνωστή και ως θύρα COM), μερικές φορές USB, ADC, DAC, I2C, εν ολίγοις, ό,τι υπάρχει...

Λοιπόν, όλα αυτά είναι θεωρία, αλλά ανυπομονείτε να συνδυάσετε κάτι, να το δοκιμάσετε και να το κάνετε να λειτουργήσει! Στη συνέχεια, ας απαριθμήσουμε τι χρειαζόμαστε:

1. Προγραμματιστής με το κατάλληλο λογισμικό, έγραψα για αυτό στο τελευταίο άρθρο.
2. Ο μεταγλωττιστής γλώσσας C, Code Vision AVR, έχει καλά εργαλεία για την ανάπτυξη προγραμμάτων για το MK.

Πριν ξεκινήσετε τον προγραμματισμό σε C, θα ήταν ωραίο να εξοικειωθείτε με κάποια βιβλιογραφία για αυτήν τη γλώσσα, για παράδειγμα, υπάρχει ένα υπέροχο βιβλίο των Kernighan και Ritchie "The C Language".

Εντάξει, ας ξεκινήσουμε...

Δοκιμαστικό κύκλωμα.

Ας συνθέσουμε αυτό το διάγραμμα:

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

Ας ανάψουμε το ρεύμα... ΜΗΔΕΝ!!! Τι ήθελες χωρίς το πρόγραμμα;
Που σημαίνει…

Ας γράψουμε ένα πρόγραμμα!

Λοιπόν, ξεκινήσατε το CVAVR, ποιο είναι το πρώτο πράγμα που πρέπει να κάνετε; Εκκινήστε το Code Wizard AVR κάνοντας κλικ στο κουμπί με το γρανάζι στη γραμμή εργαλείων, θα εμφανιστεί ένα παράθυρο οδηγού:

Εδώ επιλέγουμε τον τύπο MK και τη συχνότητα ρολογιού. Στη συνέχεια, μεταβείτε στην καρτέλα Ports:

Και διαμορφώνουμε ποιο bit από ποια θύρα θα ρυθμιστεί για είσοδο ή έξοδο, η θύρα B bit 0 θα εξάγει ένα σήμα και το υπόλοιπο θα λάβει.
Για να αποθηκεύσετε τις ρυθμίσεις, επιλέξτε το μενού Αρχείο / Δημιουργία Αποθήκευση και Έξοδος, εισαγάγετε τα ονόματα αρχείων για όλα τα επόμενα αιτήματα, είναι επιθυμητό να είναι τα ίδια, για παράδειγμα "prj". Αυτό είναι όλο, δημιουργήσαμε το κείμενο πηγής του προγράμματος με τις ρυθμίσεις που καθορίζονται στον οδηγό.

Ας δούμε τι έχουμε. Οι πρώτες 22 γραμμές είναι ένα σχόλιο, δηλαδή, δεν έχει καμία επιρροή στις ενέργειες του προγράμματος, επομένως ό,τι βρίσκεται μεταξύ "/*" και "*/" είναι ένα σχόλιο και ο μεταγλωττιστής αγνοεί όλο αυτό το θέμα. Στον 24ο όρο, συμπεριλαμβάνουμε ένα αρχείο κεφαλίδας, περιγράφει τι ονομάζονται καταχωρητές και σε ποια διεύθυνση βρίσκονται. Για τον προγραμματισμό C, οι λεπτομέρειες είναι περιττές εδώ.
Από τη γραμμή 28 ξεκινάμε το κύριο πρόγραμμα με τον ορισμό της συνάρτησης κύριος(),

Ας κάνουμε κύλιση παρακάτω. Δώστε προσοχή στις γραμμές 36 και 37, εδώ εκχωρείται μια τιμή στη θύρα Β και επιλέγεται η κατεύθυνση μετάδοσης. Σε γενικές γραμμές μοιάζει με αυτό:

Δηλαδή, εάν ένα ένα γραφτεί σε οποιοδήποτε bit του καταχωρητή DDRB, τότε το αντίστοιχο bit της θύρας Β θα λειτουργήσει ως έξοδος. Στην περίπτωσή μας αυτό είναι bit 0.
Παρεμπιπτόντως, οι θύρες στο ATmega έχουν ένα ωραίο χαρακτηριστικό: ακόμα κι αν η θύρα έχει ρυθμιστεί για είσοδο και ο καταχωρητής PORTx είναι γραμμένος σε αυτές, οι εσωτερικές αντιστάσεις έλξης θα συνδεθούν στο θετικό τροφοδοτικό, γεγονός που εξαλείφει τη χρήση εξωτερικών κρεμαστό αντιστάσεων. Αυτό είναι βολικό όταν συνδέετε οποιουσδήποτε αισθητήρες και κουμπιά.

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

Ας ανοίξουμε το φάκελο C:\cvavr\bin\, βρούμε το αρχείο prj.hex εκεί. Αυτό είναι το πρόγραμμα που συντάξαμε για το MK. Ας συνδέσουμε τον προγραμματιστή με τον υπολογιστή και το MK. Ας ξεκινήσουμε το πρόγραμμα Pony Prog και σύρουμε το αρχείο prj.hex στο παράθυρό του. Ανοίξτε το ρεύμα στο MK και φορτώστε το πρόγραμμά μας σε αυτό... Πάλι τίποτα; Αλλά το πρόβλημα είναι ότι δεν εξάγαμε τίποτα στο μηδενικό bit της θύρας Β, ή μάλλον, το βγάλαμε, μόνο είναι μηδέν. Και για να ανάψει το LED μας, πρέπει να βγάλουμε ένα. Ας κάνουμε ακριβώς αυτό, αντικαταστήστε το "PORTB=0x00;" στη γραμμή 36 σε "PORTB=0x01;". Ας μεταγλωττίσουμε ξανά το πρόγραμμα. Και στο πρόγραμμα Pony Prog θα φορτώσουμε ξανά το αρχείο χρησιμοποιώντας τη συντόμευση πληκτρολογίου Ctrl+L ή το μενού File / Reload Files. Ας σβήσουμε το MK και ας ανεβάσουμε ξανά το firmware σε αυτό. ΖΗΤΩ!!! ΔΟΥΛΕΥΕΙ!!!

Παρεμπιπτόντως, το Pony Prog υποστηρίζει σενάρια και για να μην ανησυχείτε για επανεκκίνηση, διαγραφή και εγγραφή, μπορείτε απλά να γράψετε ένα σενάριο με την επέκταση .e2s και να το ονομάσετε, για παράδειγμα, prog.e2s. Μπορείτε να το κάνετε αυτό χρησιμοποιώντας ένα σημειωματάριο. Το περιεχόμενό του θα είναι ως εξής:

ΕΠΙΛΟΓΗ ΣΥΣΚΕΥΗΣ ATMEGA8
CLEARBUFFER
LOAD-ALL prj.hex
ΔΙΑΓΡΑΦΗ ΟΛΩΝ
ΓΡΑΨΤΕ-ΟΛΑ

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

Συνεχίζεται…

Γενικές πληροφορίες

Αυτή η έκδοση του ελεγκτή Arduino, αν όχι η πιο απλή, είναι σίγουρα η πιο προσιτή για αυτοπαραγωγή. Βασίζεται στο ήδη κλασικό κύκλωμα Arduino στον ελεγκτή ATMega8.

Συνολικά, έχουν αναπτυχθεί δύο επιλογές:

  • Modular
  • Μονή σανίδα

Αρθρωτή επιλογή

Αυτή η επιλογή ελεγκτή αποτελείται από τρεις πλακέτες:

Επιλογή μονής σανίδας

Όλα είναι ίδια, μόνο σε ένα ταμπλό:

Η πλακέτα είναι κατασκευασμένη από φύλλο αλουμινίου PCB μονής όψης και μπορεί να αναπαραχθεί στο σπίτι χρησιμοποιώντας, για παράδειγμα, τεχνολογία LUT. Διαστάσεις σανίδας: 95x62

Προγραμματισμός μικροελεγκτή

Μετά τη συναρμολόγηση της πλακέτας, πρέπει να "φλασάρετε" τον ελεγκτή, να φορτώσετε το "bootloader" σε αυτό. Για αυτό θα χρειαστείτε έναν προγραμματιστή. Παίρνουμε έναν καθαρό ελεγκτή τύπου ATMega8, τον εγκαθιστούμε στον προγραμματιστή και τον συνδέουμε στον υπολογιστή. Χρησιμοποίησα τον προγραμματιστή AVR ISP mkII με τον προσαρμογέα ATMega8-48-88-168. Προγραμματίζουμε χρησιμοποιώντας το Arduino IDE, θα ρυθμίσει αυτόματα τα απαραίτητα bit ασφαλειών. Η σειρά είναι:

1. Επιλέξτε έναν προγραμματιστή (Υπηρεσία > Προγραμματιστής > AVRISP mkII). Εάν αυτός ο προγραμματιστής χρησιμοποιείται για πρώτη φορά, πρέπει να εγκαταστήσετε το πρόγραμμα οδήγησης AVRISP-MKII-libusb-drv.zip. Εάν χρησιμοποιείτε άλλον προγραμματιστή εκτός του AVRISP mkII, τότε πρέπει να επιλέξετε αυτόν που χρειάζεστε από τη λίστα.

2. Επιλογή πλακέτας για τον μικροελεγκτή (Εργαλεία > Πίνακας > Arduino NG ή παλαιότερο με ATmega8). Εάν χρησιμοποιείτε άλλο μικροελεγκτή εκτός του ATmega8, τότε πρέπει να επιλέξετε την πλακέτα που ταιριάζει με αυτόν.

3. Εγγραφή bootloader (Εργαλεία > Record bootloader).

4. Εγκαταστήστε το χειριστήριο στην πλακέτα, και αυτό είναι όλο, το Arduino είναι έτοιμο.