Μικροελεγκτές Atmega8. Προγραμματισμός Atmega8 για αρχάριους. Μικροελεγκτές AVR. Προγραμματισμός για αρχάριους Εκπαίδευση μικροελεγκτή atmega8

Δεκέμβριος 2015

1. Πλεονεκτήματα της προτεινόμενης μεθόδου

Τα κυκλώματα συσκευών που βασίζονται σε μικροελεγκτές (MCU) διακρίνονται συνήθως από έναν συνδυασμό δύο δύσκολα συνδυαστικών ιδιοτήτων: μέγιστη απλότητα και υψηλή λειτουργικότητα. Επιπλέον, η λειτουργικότητα μπορεί να αλλάξει και να επεκταθεί στο μέλλον χωρίς να γίνουν αλλαγές στο κύκλωμα - απλώς αντικαθιστώντας το πρόγραμμα (αναβοσβήνει). Αυτά τα χαρακτηριστικά εξηγούνται από το γεγονός ότι οι δημιουργοί των σύγχρονων MK προσπάθησαν να τοποθετήσουν σε ένα τσιπ όλα όσα μπορεί να χρειαστεί ένας προγραμματιστής ηλεκτρονική συσκευή- τουλάχιστον όσο το δυνατόν περισσότερο. Ως αποτέλεσμα, υπήρξε μια μετατόπιση της έμφασης από το κύκλωμα και την εγκατάσταση στο λογισμικό. Με τη χρήση του MK, υπάρχει πλέον λιγότερη ανάγκη να «φορτωθεί» το κύκλωμα με εξαρτήματα και υπάρχουν λιγότερες συνδέσεις μεταξύ των εξαρτημάτων. Αυτό, φυσικά, κάνει το κύκλωμα πιο ελκυστικό για επανάληψη τόσο από έμπειρους όσο και από αρχάριους μηχανικούς ηλεκτρονικών. Αλλά, ως συνήθως, πρέπει να πληρώσετε για τα πάντα. Και αυτό δεν ήταν χωρίς δυσκολίες. Εάν αγοράσετε ένα νέο MK, το εγκαταστήσετε σε ένα κύκλωμα σωστά συναρμολογημένο από επισκευάσιμα εξαρτήματα και εφαρμόστε ισχύ, τότε τίποτα δεν θα λειτουργήσει - η συσκευή δεν θα λειτουργήσει. Ο μικροελεγκτής χρειάζεται πρόγραμμα.

Φαίνεται ότι όλα είναι απλά και με αυτό - στο Διαδίκτυο μπορείτε να βρείτε πολλά σχήματα με δωρεάν υλικολογισμικό. Αλλά εδώ υπάρχει ένα πιάσιμο: το υλικολογισμικό πρέπει με κάποιο τρόπο να "ανεβαστεί" στον μικροελεγκτή. Για κάποιον που δεν το έχει κάνει ποτέ πριν, μια τέτοια εργασία συχνά γίνεται πρόβλημα και ο κύριος απωθητικός παράγοντας, αναγκάζοντάς τον συχνά να εγκαταλείψει τις απολαύσεις της χρήσης του MK και να αναζητήσει σχέδια που βασίζονται σε «χαλαρή» και άκαμπτη λογική. Αλλά όλα δεν είναι τόσο περίπλοκα όσο μπορεί να φαίνονται με την πρώτη ματιά.

Αφού αναλύσετε δημοσιεύσεις στο Διαδίκτυο, μπορείτε να δείτε ότι αυτό το πρόβλημα επιλύεται συνήθως με έναν από τους δύο τρόπους: αγορά ενός έτοιμου προγραμματιστή ή κατασκευή ενός σπιτικού. Ταυτόχρονα, τα δημοσιευμένα κυκλώματα των αυτοσχέδιων προγραμματιστών είναι πολύ συχνά αδικαιολόγητα πολύπλοκα - πολύ πιο περίπλοκα από ό,τι είναι πραγματικά απαραίτητο. Φυσικά, αν σκοπεύετε να αναβοσβήνει το MK κάθε μέρα, είναι καλύτερο να έχετε έναν "cool" προγραμματιστή. Αλλά αν η ανάγκη για μια τέτοια διαδικασία προκύπτει σπάνια, από καιρό σε καιρό, τότε μπορείτε να κάνετε χωρίς προγραμματιστή εντελώς. Όχι, φυσικά, δεν μιλάμε να μάθουμε να το κάνουμε αυτό με τη δύναμη της σκέψης. Αυτό σημαίνει ότι κατανοώντας πώς ο προγραμματιστής αλληλεπιδρά με τον μικροελεγκτή όταν γράφει και διαβάζει πληροφορίες στη λειτουργία προγραμματισμού του, μπορούμε να αρκεστούμε στα διαθέσιμα εργαλεία για έναν ευρύτερο σκοπό. Αυτά τα εργαλεία θα πρέπει να αντικαταστήσουν τόσο το λογισμικό όσο και το υλικό του προγραμματιστή. Το υλικό πρέπει να παρέχει φυσική σύνδεση με το μικροκύκλωμα MK, τη δυνατότητα εφαρμογής λογικών επιπέδων στις εισόδους του και ανάγνωσης δεδομένων από τις εξόδους του. Το τμήμα λογισμικού πρέπει να διασφαλίζει τη λειτουργία του αλγορίθμου που ελέγχει όλες τις απαραίτητες διαδικασίες. Σημειώνουμε επίσης ότι η ποιότητα της εγγραφής πληροφοριών στο MK δεν εξαρτάται από το πόσο «cool» είναι ο προγραμματιστής σας. Δεν υπάρχει «καλύτερα ηχογραφημένο» ή «χειρότερο». Υπάρχουν μόνο δύο επιλογές: "εγγεγραμμένο" και "μη εγγεγραμμένο". Αυτό εξηγείται από το γεγονός ότι η διαδικασία εγγραφής μέσα στον κρύσταλλο ελέγχεται άμεσα από το ίδιο το MK. Απλά πρέπει να του παρέχετε ισχύ υψηλής ποιότητας (χωρίς παρεμβολές ή κυματισμούς) και να οργανώσετε σωστά τη διεπαφή. Εάν τα αποτελέσματα της ανάγνωσης της δοκιμής δεν αποκαλύπτουν σφάλματα, τότε όλα είναι εντάξει - μπορείτε να χρησιμοποιήσετε τον ελεγκτή για τον προορισμό του.

Για να γράψουμε ένα πρόγραμμα στο MK χωρίς να έχουμε προγραμματιστή, χρειαζόμαστε έναν μετατροπέα θύρας USB-RS232TTL και επίσης. Ο μετατροπέας USB-RS232TTL σάς επιτρέπει να χρησιμοποιήσετε μια θύρα USB για να δημιουργήσετε μια θύρα COM που διαφέρει από την "πραγματική" μόνο στο ότι οι είσοδοι και οι έξοδοι της χρησιμοποιούν λογικά επίπεδα TTL, δηλαδή τάση στην περιοχή από 0 έως 5 βολτ ( μπορείτε να διαβάσετε περισσότερα στο άρθρο " "). Σε κάθε περίπτωση, ένας τέτοιος μετατροπέας είναι χρήσιμο να υπάρχει στο «οικιακό» σας, οπότε αν δεν το έχετε ήδη, αξίζει σίγουρα να το αγοράσετε. Όσον αφορά τα λογικά επίπεδα, στην περίπτωσή μας το TTL είναι ακόμη ένα πλεονέκτημα σε σχέση με μια κανονική θύρα COM, επειδή οι είσοδοι και οι έξοδοι μιας τέτοιας θύρας μπορούν να συνδεθούν απευθείας με οποιονδήποτε μικροελεγκτή που τροφοδοτείται από 5 V, συμπεριλαμβανομένων των ATtiny και ATmega. Αλλά μην προσπαθήσετε να χρησιμοποιήσετε μια κανονική θύρα COM - χρησιμοποιούν τάσεις στην περιοχή από -12 έως +12 V (ή -15 ... + 15 V). Σε αυτή την περίπτωση η απευθείας σύνδεση με τον μικροελεγκτή είναι απαράδεκτη!!!

Η ιδέα της δημιουργίας ενός σεναρίου για το πρόγραμμα Perpetuum M, το οποίο υλοποιεί τις λειτουργίες του προγραμματιστή, προέκυψε μετά την ανάγνωση ορισμένων δημοσιεύσεων στο Διαδίκτυο που προσφέρουν ορισμένες λύσεις για το υλικολογισμικό MK. Σε κάθε περίπτωση ανακαλύφθηκαν σοβαρές ελλείψεις ή υπερβολικές δυσκολίες. Συχνά συνάντησα κυκλώματα προγραμματιστή που περιείχαν έναν μικροελεγκτή, και ταυτόχρονα, δόθηκαν πολύ σοβαρές συμβουλές όπως: "... και για να προγραμματίσουμε τον μικροελεγκτή για αυτόν τον προγραμματιστή θα χρειαστούμε... έτσι είναι - άλλος προγραμματιστής!" Στη συνέχεια, προτάθηκε να πάτε σε έναν φίλο και να αναζητήσετε πληρωμένη υπηρεσίακαι ούτω καθεξής. Η ποιότητα του λογισμικού που διανεμήθηκε στο δίκτυο για αυτούς τους σκοπούς δεν ήταν επίσης εντυπωσιακή - παρατηρήθηκαν πολλά προβλήματα τόσο με τη λειτουργικότητα όσο και με τη "θολότητα" της διεπαφής χρήστη. Συχνά χρειάζεται πολύς χρόνος για να κατανοήσετε πώς να χρησιμοποιήσετε ένα πρόγραμμα - πρέπει να μελετηθεί ακόμη και για να εκτελέσετε τις πιο απλές ενέργειες. Ένα άλλο πρόγραμμα μπορεί να κάνει κάτι για μεγάλο χρονικό διάστημα και επιμελώς, αλλά ο χρήστης μαθαίνει ότι τίποτα δεν γράφεται στο MK μόνο αφού ολοκληρωθεί πλήρως ολόκληρο το υλικολογισμικό και η επακόλουθη δοκιμαστική ανάγνωση. Παρουσιάζεται επίσης το ακόλουθο πρόβλημα: ο χρήστης προσπαθεί να επιλέξει το MK του από τη λίστα των υποστηριζόμενων κρυστάλλων, αλλά δεν βρίσκεται στη λίστα. Σε αυτήν την περίπτωση, δεν θα μπορείτε να χρησιμοποιήσετε το πρόγραμμα - η συμπερίληψη στη λίστα των MK που λείπουν, κατά κανόνα, δεν παρέχεται. Επιπλέον, η χειροκίνητη επιλογή ενός ελεγκτή από τη λίστα φαίνεται περίεργη, δεδομένου ότι ο προγραμματιστής σε πολλές περιπτώσεις μπορεί να καθορίσει ο ίδιος τον τύπο του MK. Όλα αυτά λέγονται όχι για να ρίξουν λάσπη στα υπάρχοντα προϊόντα, αλλά για να εξηγήσουν τον λόγο εμφάνισης του σεναρίου για το πρόγραμμα Perpetuum M, που περιγράφεται σε αυτό το άρθρο. Το πρόβλημα υπάρχει πραγματικά και αφορά πρωτίστως τους αρχάριους που δεν καταφέρνουν πάντα να ξεπεράσουν αυτόν τον «τοίχο» για να κάνουν το πρώτο τους βήμα στον κόσμο των μικροελεγκτών. Το προτεινόμενο σενάριο λαμβάνει υπόψη τις ελλείψεις που βρέθηκαν σε άλλα προγράμματα. Έχει εφαρμοστεί η μέγιστη «διαφάνεια» της λειτουργίας του αλγορίθμου, μια εξαιρετικά απλή διεπαφή χρήστη που δεν απαιτεί εκμάθηση και δεν αφήνει καμία πιθανότητα να μπερδευτείτε και να «κάνετε κλικ στο λάθος πράγμα». Εάν το απαιτούμενο MK δεν είναι μεταξύ των υποστηριζόμενων, μπορείτε να προσθέσετε την περιγραφή του μόνοι σας, λαμβάνοντας τα απαραίτητα δεδομένα από την τεκμηρίωση που κατεβάσατε από τον ιστότοπο του προγραμματιστή MK. Και, το πιο σημαντικό, το σενάριο είναι ανοιχτό για μελέτη και τροποποίηση. Οποιοσδήποτε μπορεί, ανοίγοντας μέσα επεξεργαστής κειμένου, μελετήστε και επεξεργαστείτε το κατά την κρίση σας, αλλάζοντας τις υπάρχουσες λειτουργίες σύμφωνα με το γούστο σας και προσθέτοντας εκείνες που λείπουν.

Η πρώτη έκδοση του σεναρίου δημιουργήθηκε τον Ιούνιο του 2015. Αυτή η έκδοση παρέχει υποστήριξη μόνο για τους μικροελεγκτές της σειράς ATtiny και ATmega της Atmel με λειτουργίες εγγραφής/ανάγνωσης μνήμης flash, ρύθμιση bits διαμόρφωσης και αυτόματη ανίχνευση του τύπου ελεγκτή. Η εγγραφή και η ανάγνωση EEPROM δεν υλοποιούνται. Υπήρχαν σχέδια για τη συμπλήρωση της λειτουργικότητας του σεναρίου : προσθήκη γραφής και ανάγνωσης EEPROM, υλοποίηση υποστήριξης για ελεγκτές PIC κ.λπ. Για το λόγο αυτό, το σενάριο δεν έχει δημοσιευτεί ακόμα. Αλλά λόγω έλλειψης χρόνου, η υλοποίηση του σχεδίου καθυστέρησε και για να μην γίνει το καλύτερο ο εχθρός του καλού, αποφασίστηκε να δημοσιευτεί η υπάρχουσα έκδοση. Εάν οι λειτουργίες που έχουν ήδη υλοποιηθεί δεν είναι αρκετές, μην στεναχωριέστε. Σε αυτήν την περίπτωση, μπορείτε να προσπαθήσετε να προσθέσετε μόνοι σας την επιθυμητή συνάρτηση. Δεν θα κρύψω: η ιδέα της δημιουργίας αυτού του σεναρίου έχει αρχικά και εκπαιδευτικό νόημα. Έχοντας κατανοήσει τον αλγόριθμο και προσθέτοντας κάτι δικό σας σε αυτόν, θα μπορείτε να κατανοήσετε καλύτερα τη λειτουργία του MK σε λειτουργία προγραμματισμού, έτσι ώστε σε στο μέλλον δεν θα βρεθείτε στη θέση ενός κοριτσιού μπροστά σε ένα χαλασμένο αυτοκίνητο, κοιτάζοντας στοχαστικά το εσωτερικό του και μην καταλαβαίνετε γιατί «δεν λειτουργεί».

2. Διασύνδεση MK σε λειτουργία προγραμματισμού

Υπάρχουν διάφοροι τρόποι για να θέσετε τον ελεγκτή σε λειτουργία προγραμματισμού και να εργαστείτε μαζί του σε αυτήν τη λειτουργία. Το πιο εύκολο στην εφαρμογή για ελεγκτές της σειράς ATtiny και ATmega είναι, ίσως, το SPI. Θα το χρησιμοποιήσουμε.

Όμως, προτού αρχίσουμε να εξετάζουμε τα σήματα που είναι απαραίτητα για τη δημιουργία SPI, θα κάνουμε μια σειρά από κρατήσεις. Ο μικροελεγκτής έχει bits διαμόρφωσης. Αυτοί είναι κάτι σαν διακόπτες εναλλαγής, εναλλαγή που σας επιτρέπει να αλλάξετε ορισμένες ιδιότητες του μικροκυκλώματος σύμφωνα με τις ανάγκες του έργου. Φυσικά, αυτά είναι μη πτητικά κελιά μνήμης, όπως αυτά στα οποία είναι γραμμένο ένα πρόγραμμα. Η διαφορά είναι ότι υπάρχουν πολύ λίγα από αυτά (έως και τρία byte για το ATmega) και δεν αποτελούν μέρος του χώρου διευθύνσεων οποιασδήποτε μνήμης. Η εγγραφή και η ανάγνωση δεδομένων διαμόρφωσης εκτελούνται με ξεχωριστές εντολές στη λειτουργία προγραμματισμού MK. Τώρα είναι σημαντικό να σημειωθεί ότι ορισμένα bit διαμόρφωσης επηρεάζουν την ίδια τη δυνατότητα χρήσης του SPI. Με ορισμένες από τις τιμές τους, μπορεί να αποδειχθεί ότι το SPI δεν μπορεί να χρησιμοποιηθεί. Εάν συναντήσετε έναν τέτοιο μικροελεγκτή, η μέθοδος που προτείνεται σε αυτό το άρθρο δεν θα σας βοηθήσει. Σε αυτήν την περίπτωση, θα πρέπει είτε να αλλάξετε τις ρυθμίσεις των bit διαμόρφωσης στον προγραμματιστή, ο οποίος υποστηρίζει διαφορετική λειτουργία προγραμματισμού, είτε να χρησιμοποιήσετε διαφορετικό μικροελεγκτή. Αλλά αυτό το πρόβλημα ισχύει μόνο για τα χρησιμοποιημένα MK ή εκείνα με τα οποία κάποιος έχει ήδη «παίξει» ανεπιτυχώς. Το γεγονός είναι ότι τα νέα MCU διαθέτουν ρυθμίσεις bit διαμόρφωσης που δεν εμποδίζουν τη χρήση του SPI. Αυτό επιβεβαιώνεται από τα αποτελέσματα δοκιμών του σεναρίου προγραμματιστή για το πρόγραμμα Perpetuum M, κατά τη διάρκεια του οποίου αναβλήθηκαν με επιτυχία τέσσερα διαφορετικά MK (ATmega8, ATmega128, ATtiny13, ATtiny44). Ήταν όλα καινούργια. Η αρχική ρύθμιση των bit διαμόρφωσης ήταν σύμφωνη με την τεκμηρίωση και δεν παρενέβαινε στη χρήση του SPI.

Λαμβάνοντας υπόψη τα παραπάνω, θα πρέπει να δώσετε προσοχή στα παρακάτω bits. Το bit SPIEN επιτρέπει ή απενεργοποιεί ρητά τη χρήση του SPI, επομένως στην περίπτωσή μας η τιμή του πρέπει να είναι ενεργοποιημένη. Το bit RSTDISBL είναι ικανό να μετατρέψει μία από τις εξόδους του μικροκυκλώματος (προκαθορισμένη) στην είσοδο του σήματος "επαναφοράς" ή να μην τη μετατρέψει (ανάλογα με την τιμή που γράφεται σε αυτό το bit). Στην περίπτωσή μας, η είσοδος "επαναφορά" είναι απαραίτητη (εάν απουσιάζει, δεν θα είναι δυνατή η εναλλαγή του MK σε λειτουργία προγραμματισμού μέσω SPI). Υπάρχουν επίσης bits της ομάδας CKSEL που καθορίζουν την πηγή του σήματος ρολογιού. Δεν εμποδίζουν τη χρήση του SPI, αλλά πρέπει επίσης να τα έχουμε κατά νου, γιατί εάν δεν υπάρχουν καθόλου παλμοί ρολογιού ή εάν η συχνότητά τους είναι χαμηλότερη από την αποδεκτή για μια δεδομένη ταχύτητα SPI, δεν θα συμβεί τίποτα καλό. Συνήθως, τα νέα MCU που διαθέτουν εσωτερικό ταλαντωτή RC έχουν τα bit της ομάδας CKSEL ρυθμισμένα για να τον χρησιμοποιούν. Αυτό μας ταιριάζει αρκετά - το ρολόι παρέχεται χωρίς καμία επιπλέον προσπάθεια από μέρους μας. Δεν χρειάζεται να συγκολλήσετε το αντηχείο χαλαζία ή να συνδέσετε μια εξωτερική γεννήτρια. Εάν τα καθορισμένα bit περιέχουν διαφορετική ρύθμιση, θα πρέπει να φροντίσετε για το ρολόι σύμφωνα με τη ρύθμιση. Σε αυτή την περίπτωση, μπορεί να χρειαστεί να συνδέσετε έναν συντονιστή χαλαζία ή μια εξωτερική γεννήτρια ρολογιού στο MCU. Αλλά σε αυτό το άρθρο δεν θα εξετάσουμε πώς γίνεται αυτό. Τα παραδείγματα σύνδεσης ενός MK για προγραμματισμό που περιέχονται σε αυτό το άρθρο έχουν σχεδιαστεί για την απλούστερη περίπτωση.

Ρύζι. 1. Ανταλλαγή δεδομένων μέσω SPI σε λειτουργία προγραμματισμού

Τώρα ας στραφούμε στο Σχήμα 1, που λαμβάνεται από την τεκμηρίωση για το ATmega128A MK. Δείχνει τη διαδικασία μετάδοσης ενός byte στο MK και ταυτόχρονα λήψης ενός byte από το MK. Και οι δύο αυτές διαδικασίες, όπως βλέπουμε, χρησιμοποιούν τους ίδιους παλμούς ρολογιού που παρέχονται από τον προγραμματιστή στον μικροελεγκτή στην είσοδο SCK - μία από τις ακίδες του μικροκυκλώματος, για την οποία έχει εκχωρηθεί ένας τέτοιος ρόλος στη λειτουργία προγραμματισμού SPI. Δύο ακόμη γραμμές σήματος παρέχουν λήψη και μετάδοση δεδομένων ένα bit ανά κύκλο ρολογιού. Μέσω της εισόδου MOSI, τα δεδομένα εισέρχονται στον μικροελεγκτή και τα δεδομένα ανάγνωσης λαμβάνονται από την έξοδο MISO. Παρατηρήστε τις δύο διακεκομμένες γραμμές που σχεδιάζονται από το SCK στο MISO και το MOSI. Δείχνουν σε ποια στιγμή ο μικροελεγκτής «καταπίνει» το σύνολο bit δεδομένων στην είσοδο MOSI και ποια στιγμή ο ίδιος ορίζει το δικό του bit δεδομένων στην έξοδο MISO. Όλα είναι αρκετά απλά. Αλλά για να μπούμε το MK σε λειτουργία προγραμματισμού, χρειαζόμαστε ακόμα ένα σήμα RESET. Ας μην ξεχνάμε επίσης το κοινό καλώδιο GND και το τροφοδοτικό VCC. Συνολικά, αποδεικνύεται ότι μόνο 6 καλώδια χρειάζονται να συνδεθούν στον μικροελεγκτή για να αναβοσβήνει το υλικολογισμικό του μέσω SPI. Παρακάτω θα το αναλύσουμε λεπτομερέστερα, αλλά προς το παρόν θα προσθέσουμε ότι η ανταλλαγή δεδομένων με το MK σε λειτουργία προγραμματισμού μέσω SPI πραγματοποιείται σε πακέτα των 4 byte. Το πρώτο byte κάθε πακέτου είναι βασικά αποκλειστικά αφιερωμένο στην κωδικοποίηση εντολών. Το δεύτερο byte, ανάλογα με το πρώτο, μπορεί να είναι συνέχεια του κώδικα εντολής ή μέρος της διεύθυνσης ή μπορεί να έχει αυθαίρετη τιμή. Το τρίτο byte χρησιμοποιείται κυρίως για τη μετάδοση διευθύνσεων, αλλά μπορεί να έχει αυθαίρετη τιμή σε πολλές εντολές. Το τέταρτο byte συνήθως μεταδίδει δεδομένα ή έχει μια αυθαίρετη τιμή. Ταυτόχρονα με τη μετάδοση του τέταρτου byte, ορισμένες εντολές λαμβάνουν δεδομένα που προέρχονται από τον μικροελεγκτή. Λεπτομέρειες για κάθε εντολή μπορούν να βρεθούν στην τεκμηρίωση του ελεγκτή στον πίνακα που ονομάζεται "SPI Serial Programming Instruction Set". Προς το παρόν, σημειώνουμε μόνο ότι ολόκληρη η ανταλλαγή με τον ελεγκτή δημιουργείται από μια ακολουθία πακέτων 32-bit, σε καθένα από τα οποία δεν μεταδίδονται περισσότερα από ένα byte χρήσιμων πληροφοριών. Αυτό δεν είναι πολύ βέλτιστο, αλλά συνολικά λειτουργεί καλά.

3. Σύνδεση του MK για προγραμματισμό

Για να διασφαλιστεί ότι παρέχονται όλα τα απαραίτητα σήματα στις εισόδους του μικροελεγκτή για την οργάνωση της διεπαφής SPI και την ανάγνωση δεδομένων από την έξοδο MISO του, δεν είναι απαραίτητο να δημιουργηθεί ένας προγραμματιστής. Αυτό μπορεί να γίνει εύκολα χρησιμοποιώντας τον πιο συνηθισμένο μετατροπέα USB-RS232TTL.

Στο Διαδίκτυο μπορείτε συχνά να βρείτε πληροφορίες ότι τέτοιοι μετατροπείς είναι κατώτεροι και ότι τίποτα σοβαρό δεν μπορεί να γίνει με αυτούς. Αλλά όσον αφορά τα περισσότερα μοντέλα μετατροπέων, αυτή η άποψη είναι λανθασμένη. Ναι, υπάρχουν μετατροπείς προς πώληση που δεν έχουν όλες τις εισόδους και τις εξόδους διαθέσιμες σε σύγκριση με μια τυπική θύρα COM (για παράδειγμα, μόνο TXD και RXD), ενώ έχουν μη διαχωρίσιμο σχεδιασμό (το μικροκύκλωμα είναι γεμάτο με πλαστικό - είναι αδύνατο να φτάσει στις καρφίτσες του). Αλλά αυτά δεν αξίζει να τα αγοράσετε. Σε ορισμένες περιπτώσεις, μπορείτε να λάβετε τις εισόδους και τις εξόδους της θύρας που λείπουν κολλώντας την καλωδίωση απευθείας στο τσιπ. Ένα παράδειγμα τέτοιου "βελτιωμένου" μετατροπέα φαίνεται στο Σχήμα 2 (τσιπ PL-2303 - περισσότερες λεπτομέρειες σχετικά με τον σκοπό των ακίδων του στο άρθρο ""). Αυτό είναι ένα από τα φθηνότερα μοντέλα, αλλά έχει τα δικά του πλεονεκτήματα όταν χρησιμοποιείται σε σπιτικά σχέδια. Τα καλώδια προσαρμογέα πλήρους δυνατοτήτων με μια τυπική υποδοχή εννέα ακίδων στο τέλος, όπως μια θύρα COM, είναι επίσης ευρέως διαδεδομένα. Διαφέρουν από μια κανονική θύρα COM μόνο σε επίπεδα TTL και ασυμβατότητα με παλαιού τύπου λογισμικόκαι λίγο παλιό εξοπλισμό. Μπορεί επίσης να σημειωθεί ότι τα καλώδια στο τσιπ CH34x δείχνουν ότι είναι πολύ πιο αξιόπιστα και σταθερά σε διάφορες ακραίες δοκιμές σε σύγκριση με τους μετατροπείς στο PL-2303. Ωστόσο, κατά την κανονική χρήση η διαφορά δεν είναι αισθητή.

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

Ας ρίξουμε μια πιο προσεκτική ματιά στην αρχή της σύνδεσης ενός μικροελεγκτή και ενός μετατροπέα USB-RS232TTL χρησιμοποιώντας το παράδειγμα τεσσάρων διαφορετικά μοντέλα MK: ATtiny13, ATtiny44, ATmega8 και ATmega128. Το σχήμα 3 δείχνει το γενικό διάγραμμα μιας τέτοιας σύνδεσης. Μπορεί να σας εκπλήξει αν γνωρίζετε ότι τα σήματα RS232 (RTS, TXD, DTR και CTS) χρησιμοποιούνται ακατάλληλα. Αλλά μην ανησυχείτε για αυτό: το πρόγραμμα Perpetuum M μπορεί να συνεργαστεί απευθείας μαζί τους - ορίστε τιμές εξόδου και διαβάστε καταστάσεις εισόδου. Σε κάθε περίπτωση, οι ευρέως χρησιμοποιούμενοι μετατροπείς USB-RS232TTL σε τσιπ CH34x και PL-2303 παρέχουν αυτή τη δυνατότητα - αυτό έχει επαληθευτεί. Δεν θα πρέπει επίσης να υπάρχουν προβλήματα με άλλους δημοφιλείς μετατροπείς, καθώς χρησιμοποιούνται τυπικές λειτουργίες των Windows για πρόσβαση στη θύρα.

Οι αντιστάσεις που φαίνονται στο γενικό διάγραμμα δεν μπορούν, καταρχήν, να εγκατασταθούν, αλλά είναι ακόμα καλύτερο να τις εγκαταστήσετε. Ποιος είναι ο σκοπός τους; Χρησιμοποιώντας τις εισόδους και εξόδους TTL του μετατροπέα και την τροφοδοσία πέντε βολτ του μικροελεγκτή, απαλλαγούμε από την ανάγκη συντονισμού των λογικών επιπέδων - όλα είναι ήδη αρκετά σωστά. Αυτό σημαίνει ότι οι συνδέσεις μπορούν να είναι άμεσες. Αλλά κατά τη διάρκεια πειραμάτων , όλα μπορούν να συμβούν. Για παράδειγμα, σύμφωνα με το νόμο της κακίας, ένα κατσαβίδι μπορεί να πέσει ακριβώς στο σημείο που δεν θα μπορούσε να πέσει και να βραχυκυκλώσει κάτι που σε καμία περίπτωση δεν πρέπει να βραχυκυκλωθεί. Φυσικά, όλα μπορούν αποδεικνύεται "κατσαβίδι". Οι αντιστάσεις σε αυτήν την περίπτωση μερικές φορές μειώνουν τις συνέπειες. ένας από τους σκοπούς τους είναι να εξαλείψουν μια πιθανή σύγκρουση εξόδου. Το γεγονός είναι ότι μετά την ολοκλήρωση του προγραμματισμού, ο μικροελεγκτής μπαίνει σε κανονική λειτουργία και μπορεί να να γίνει έξοδος και ο ακροδέκτης του που είναι συνδεδεμένος στην έξοδο του μετατροπέα (RTS, TXD ή DTR), σύμφωνα με το πρόγραμμα που μόλις εγγράφηκε στο MK. Σε αυτήν την περίπτωση, θα είναι πολύ κακό αν δύο άμεσα συνδεδεμένες έξοδοι «τσακωθούν». - προσπαθήστε να ορίσετε διαφορετικά λογικά επίπεδα. Σε έναν τέτοιο «αγώνα», κάποιος μπορεί να «χάσει», αλλά δεν το θέλουμε αυτό.

Οι τιμές των τριών αντιστάσεων επιλέγονται στο επίπεδο των 4,3 KOhm. Αυτό ισχύει για συνδέσεις μεταξύ της εξόδου του μετατροπέα και της εισόδου του μικροελεγκτή. Η ακρίβεια των αντιστάσεων δεν έχει σημασία: μπορείτε να μειώσετε την αντίστασή τους σε 1 KOhm ή να την αυξήσετε σε 10 KOhm (αλλά στη δεύτερη περίπτωση, ο κίνδυνος παρεμβολής αυξάνεται όταν χρησιμοποιείτε μακριά καλώδια στο δρόμο προς το MK). Όσον αφορά τη σύνδεση μεταξύ της εισόδου του μετατροπέα (CTS) και της εξόδου του μικροελεγκτή (MISO), εδώ χρησιμοποιείται μια αντίσταση 100 Ohm. Αυτό εξηγείται από τις ιδιαιτερότητες της εισόδου του μετατροπέα που χρησιμοποιείται. Κατά τη διάρκεια των δοκιμών, χρησιμοποιήθηκε ένας μετατροπέας στο μικροκύκλωμα PL-2303, οι είσοδοι του οποίου, προφανώς, συνδέονται με το θετικό τροφοδοτικό με σχετικά χαμηλή αντίσταση (της τάξης των εκατοντάδων Ohms). Για να "σπάσω το pull-up" έπρεπε να εγκαταστήσω μια αντίσταση με τόσο μικρή αντίσταση. Ωστόσο, δεν χρειάζεται να το εγκαταστήσετε καθόλου. Στον μετατροπέα αυτή είναι πάντα η είσοδος. Δεν μπορεί να γίνει διέξοδος, πράγμα που σημαίνει ότι δεν θα υπάρξει σύγκρουση εξόδων σε οποιαδήποτε εξέλιξη των γεγονότων.

Εάν το τσιπ διαθέτει ξεχωριστή ακίδα AVCC για την τροφοδοσία του μετατροπέα αναλογικού σε ψηφιακό (για παράδειγμα, ATmega8 ή ATmega128), θα πρέπει να συνδεθεί στον κοινό ακροδέκτη τροφοδοσίας VCC. Ορισμένα IC διαθέτουν περισσότερες από μία ακίδες τροφοδοσίας VCC ή περισσότερα από ένα GND. Για παράδειγμα, το ATmega128 έχει 3 ακίδες GND και 2 ακίδες VCC. Σε ένα μόνιμο σχέδιο, είναι καλύτερο να συνδέσετε καρφίτσες με το ίδιο όνομα μεταξύ τους. Στην περίπτωσή μας, κατά τον προγραμματισμό, μπορείτε να χρησιμοποιήσετε ένα VCC και GND pin το καθένα.

Και εδώ είναι πώς φαίνεται η σύνδεση ATtiny13. Το σχήμα δείχνει τις εκχωρήσεις ακίδων που χρησιμοποιούνται κατά τον προγραμματισμό μέσω SPI. Δίπλα στη φωτογραφία είναι πώς μοιάζει στην πραγματικότητα μια προσωρινή σύνδεση.


Κάποιοι μπορεί να πουν ότι αυτό δεν είναι σοβαρό - συνδέσεις στην καλωδίωση. Αλλά εσείς και εγώ είμαστε λογικοί άνθρωποι. Στόχος μας είναι να προγραμματίσουμε τον μικροελεγκτή, ξοδεύοντας ελάχιστο χρόνο και άλλους πόρους σε αυτόν, και όχι να κάνουμε επίδειξη μπροστά σε κάποιον. Η ποιότητα δεν υποφέρει. Η μέθοδος "στα καλώδια" σε αυτή την περίπτωση είναι αρκετά αποτελεσματική και δικαιολογημένη. Το να αναβοσβήνει το υλικολογισμικό του ελεγκτή είναι μια διαδικασία που γίνεται μία φορά, επομένως δεν έχει νόημα να το καλύψετε με στρας. Εάν πρόκειται να αλλάξετε το υλικολογισμικό στο μέλλον χωρίς να αφαιρέσετε τον ελεγκτή από το κύκλωμα (στο τελικό προϊόν), τότε αυτό λαμβάνεται υπόψη κατά την εγκατάσταση κατά την κατασκευή της συσκευής. Συνήθως για το σκοπό αυτό εγκαθίσταται ένας σύνδεσμος (RESET, SCK, MOSI, MISO, GND) και το MK μπορεί να αναβοσβήσει ακόμα και μετά την εγκατάσταση στην πλακέτα. Αλλά αυτές είναι δημιουργικές απολαύσεις. Εξετάζουμε την απλούστερη περίπτωση.

Τώρα ας περάσουμε στο ATtiny44 MK. Όλα είναι σχεδόν ίδια εδώ. Με βάση το σχέδιο και τη φωτογραφία, ακόμη και ένας αρχάριος δεν θα δυσκολευτεί να καταλάβει τη σύνδεση. Όπως το ATtiny44, μπορείτε να συνδέσετε τους μικροελεγκτές ATtiny24 και ATtiny84 - οι εκχωρήσεις ακίδων για αυτούς τους τρεις είναι οι ίδιες.


Ένα άλλο παράδειγμα προσωρινής σύνδεσης ενός ελεγκτή για τον προγραμματισμό του είναι το ATmega8. Υπάρχουν περισσότερες ακίδες εδώ, αλλά η αρχή είναι η ίδια - μερικά καλώδια και τώρα ο ελεγκτής είναι έτοιμος να "γεμίσει" πληροφορίες σε αυτό. Το επιπλέον μαύρο καλώδιο της φωτογραφίας που προέρχεται από τον ακροδέκτη 13 δεν συμμετέχει στον προγραμματισμό. Έχει σχεδιαστεί για να αφαιρεί ένα ηχητικό σήμα από αυτό μετά την έξοδο του MK από τη λειτουργία προγραμματισμού. Αυτό οφείλεται στο γεγονός ότι κατά τον εντοπισμό σφαλμάτων του σεναρίου για το "Perpetuum M" έγινε λήψη του προγράμματος στο MK μουσικό κουτί.


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

Για να ολοκληρώσουμε την εικόνα, ας δούμε τη σύνδεση ενός μικροκυκλώματος MK με μεγάλο αριθμό "ποδιών". Ο σκοπός του έξτρα μαύρου σύρματος της φωτογραφίας που προέρχεται από τον ακροδέκτη 15 είναι ακριβώς ο ίδιος όπως στην περίπτωση του ATmega8.


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

Πριν προχωρήσετε στο τμήμα λογισμικού, βεβαιωθείτε ότι το πρόγραμμα οδήγησης μετατροπέα USB-RS232TTL έχει εγκατασταθεί σωστά (ελέγξτε τη Διαχείριση Συσκευών των Windows). Θυμηθείτε ή σημειώστε τον αριθμό της εικονικής θύρας COM που εμφανίζεται όταν συνδέετε τον μετατροπέα. Αυτός ο αριθμός θα πρέπει να εισαχθεί στο κείμενο του σεναρίου, για το οποίο μπορείτε να διαβάσετε παρακάτω.

4. Σενάριο - προγραμματιστής για το "Perpetuum M"

Καταλάβαμε το τμήμα υλικού του "προγραμματιστή". Αυτό είναι ήδη η μισή μάχη. Τώρα μένει να ασχοληθούμε με το κομμάτι του λογισμικού. Ο ρόλος του θα εκτελείται από το πρόγραμμα Perpetuum M υπό τον έλεγχο ενός σεναρίου, το οποίο υλοποιεί όλες τις απαραίτητες λειτουργίες για την αλληλεπίδραση με τον μικροελεγκτή.

Το αρχείο με το σενάριο θα πρέπει να αποσυμπιεστεί στον ίδιο φάκελο όπου βρίσκεται το πρόγραμμα perpetuum.exe. Σε αυτήν την περίπτωση, όταν εκτελείτε το αρχείο perpetuum.exe, θα εμφανιστεί στην οθόνη ένα μενού με μια λίστα εγκατεστημένων σεναρίων, μεταξύ των οποίων θα υπάρχει η γραμμή "AVR MK Programmer" (μπορεί να είναι το μόνο). Αυτή είναι η γραμμή που χρειαζόμαστε.

Το σενάριο βρίσκεται στο φάκελο PMS στο αρχείο "MK Programmer AVR.pms". Αυτό το αρχείο μπορεί να προβληθεί, να μελετηθεί και να επεξεργαστεί εάν είναι απαραίτητο σε ένα κανονικό πρόγραμμα επεξεργασίας κειμένου όπως το Σημειωματάριο των Windows. Πριν χρησιμοποιήσετε το σενάριο, πιθανότατα θα χρειαστεί να κάνετε αλλαγές στο κείμενο που σχετίζεται με τις ρυθμίσεις θύρας. Για να το κάνετε αυτό, ελέγξτε το όνομα της θύρας που χρησιμοποιείται στη Διαχείριση Συσκευών των Windows και, εάν είναι απαραίτητο, κάντε την κατάλληλη τροποποίηση στη γραμμή "PortName="COM4";" - αντί για τον αριθμό 4 μπορεί να υπάρχει άλλος αριθμός. Επίσης, όταν χρησιμοποιείτε διαφορετικό μοντέλο μετατροπέα USB-RS232TTL, μπορεί να χρειαστεί να αλλάξετε τις ρυθμίσεις αντιστροφής σήματος (γραμμές σεναρίου που ξεκινούν με τη λέξη "Υψηλό"). Μπορείτε να ελέγξετε την αντιστροφή των σημάτων από τον μετατροπέα USB-RS232TTL χρησιμοποιώντας ένα από τα παραδείγματα που περιέχονται στις οδηγίες για το πρόγραμμα Perpetuum M (ενότητα λειτουργιών για εργασία με τη θύρα).

Ο υποφάκελος MK_AVR περιέχει αρχεία με περιγραφές των υποστηριζόμενων ελεγκτών. Εάν ο ελεγκτής που χρειάζεστε δεν είναι μεταξύ αυτών, μπορείτε να προσθέσετε αυτόν που χρειάζεστε, ακολουθώντας μια αναλογία. Πάρτε ένα από τα αρχεία ως δείγμα και χρησιμοποιώντας ένα πρόγραμμα επεξεργασίας κειμένου, εισαγάγετε τα απαραίτητα δεδομένα, λαμβάνοντας τα από την τεκμηρίωση του μικροελεγκτή σας. Το κύριο πράγμα είναι να είστε προσεκτικοί, να εισάγετε τα δεδομένα χωρίς σφάλματα, διαφορετικά το MK δεν θα προγραμματιστεί ή θα προγραμματιστεί εσφαλμένα. Η αρχική έκδοση υποστηρίζει 6 μικροελεγκτές: ATtiny13, ATtiny24, ATtiny44, ATtiny84, ATmega8 και ATmega128. Το σενάριο υλοποιεί την αυτόματη αναγνώριση του συνδεδεμένου ελεγκτή - δεν χρειάζεται να τον προσδιορίσετε με μη αυτόματο τρόπο. Εάν το αναγνωριστικό που διαβάζεται από το MK δεν περιλαμβάνεται στις διαθέσιμες περιγραφές, εμφανίζεται ένα μήνυμα ότι ο ελεγκτής δεν μπορεί να αναγνωριστεί.

Το αρχείο με το σενάριο περιέχει επίσης Επιπλέον πληροφορίες. Ο φάκελος αρχείων AVR controller inc περιέχει μια πολύ χρήσιμη και εκτενή συλλογή αρχείων ορισμού ελεγκτή. Αυτά τα αρχεία χρησιμοποιούνται όταν γράφετε τα δικά σας προγράμματα για το MK. Τέσσερις ακόμη φάκελοι "MusicBox_..." περιέχουν αρχεία με πρόγραμμα σε γλώσσα Assembly και υλικολογισμικό έτοιμο για λήψη στο MK ξεχωριστά για τα ATtiny13, ATtiny44, ATmega8 και ATmega128. Εάν έχετε ήδη συνδέσει ένα από αυτά τα MK για προγραμματισμό, όπως προτείνεται σε αυτό το άρθρο, τότε μπορείτε να το αναβοσβήσετε αμέσως - θα λάβετε ένα μουσικό κουτί. Περισσότερα για αυτό παρακάτω.

Όταν επιλέγετε τη γραμμή "MK AVR Programmer" στο μενού script, το σενάριο αρχίζει να εκτελείται. Ταυτόχρονα, ανοίγει τη θύρα, στέλνει μια εντολή στο MK για μετάβαση σε λειτουργία προγραμματισμού, λαμβάνει επιβεβαίωση από το MK για την επιτυχή μετάβαση, ζητά το αναγνωριστικό MK και αναζητά μια περιγραφή αυτού του MK από το αναγνωριστικό του μεταξύ των διαθέσιμων αρχεία με περιγραφές. Εάν δεν βρει την απαιτούμενη περιγραφή, εμφανίζει ένα αντίστοιχο μήνυμα. Εάν βρεθεί μια περιγραφή, τότε ανοίγει το κύριο μενού του προγραμματιστή. Μπορείτε να δείτε το στιγμιότυπο οθόνης του στην Εικόνα 8. Η περαιτέρω κατανόηση δεν είναι δύσκολη - το μενού είναι πολύ απλό.

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

Ορισμένοι περιορισμοί λειτουργικότητας περιγράφονται απευθείας στο κείμενο του σεναρίου:
//υλοποιήθηκε η εγγραφή μόνο από τη μηδενική διεύθυνση (Η εγγραφή εκτεταμένης διεύθυνσης τμήματος αγνοείται, LOAD OFFSET - επίσης)
//Η σειρά και η συνέχεια των εγγραφών στο αρχείο HEX δεν ελέγχονται
//το άθροισμα ελέγχου δεν ελέγχεται
Αυτό ισχύει για την εργασία με ένα αρχείο HEX, από το οποίο λαμβάνεται ο κωδικός υλικολογισμικού για το MK. Εάν αυτό το αρχείο δεν είναι κατεστραμμένο, ο έλεγχος του αθροίσματος ελέγχου δεν θα έχει κανένα αποτέλεσμα. Εάν είναι παραμορφωμένο, δεν θα είναι δυνατός ο εντοπισμός του χρησιμοποιώντας το σενάριο. Στις περισσότερες περιπτώσεις, οι υπόλοιποι περιορισμοί δεν θα βλάψουν, αλλά πρέπει να τους έχετε υπόψη σας.

5. Μουσικό κουτί - μια απλή χειροτεχνία για αρχάριους

Εάν διαθέτετε έναν από αυτούς τους μικροελεγκτές: ATtiny13, ATtiny44, ATmega8 ή ATmega128, μπορείτε εύκολα να τον μετατρέψετε σε μουσικό κουτί ή κάρτα μουσικής. Για να γίνει αυτό, αρκεί να γράψετε το αντίστοιχο υλικολογισμικό στο MK - ένα από αυτά τα τέσσερα που βρίσκονται στους φακέλους "MusicBox_..." στο ίδιο αρχείο με το σενάριο. Οι κωδικοί υλικολογισμικού αποθηκεύονται σε αρχεία με την επέκταση ".hex". Η χρήση του ATmega128 για ένα τέτοιο σκάφος, φυσικά, είναι "λιπαρό", όπως και το ATmega8. Αλλά αυτό μπορεί να είναι χρήσιμο για δοκιμές ή πειραματισμούς, με άλλα λόγια, για εκπαιδευτικούς σκοπούς. Επισυνάπτονται και τα κείμενα των προγραμμάτων στο Assembler. Τα προγράμματα δεν δημιουργήθηκαν από το μηδέν - το πρόγραμμα μουσικού κουτιού από το βιβλίο του A.V. Belov ελήφθη ως βάση. Μικροελεγκτές AVRστην πρακτική του ραδιοερασιτέχνη." Το αρχικό πρόγραμμα έχει υποστεί μια σειρά από σημαντικές αλλαγές:
1. προσαρμοσμένο για καθένα από τα τέσσερα MK: ATtiny13, ATtiny44, ATmega8 και ATmega128
2. Τα κουμπιά έχουν εξαλειφθεί - τίποτα δεν χρειάζεται να συνδεθεί στο χειριστήριο εκτός από την τροφοδοσία και έναν πομπό ήχου (οι μελωδίες παίζονται η μία μετά την άλλη σε έναν ατελείωτο βρόχο)
3. η διάρκεια κάθε νότας μειώνεται κατά τη διάρκεια της παύσης μεταξύ των νότων για την εξάλειψη των διαταραχών στο μουσικό ρυθμό
4. η όγδοη μελωδία είναι συνδεδεμένη, δεν χρησιμοποιείται στην έκδοση του βιβλίου
5. από το υποκειμενικό: μερικές «βελτιώσεις» για τη βελτιστοποίηση και την ευκολότερη κατανόηση του αλγόριθμου

Σε ορισμένες μελωδίες μπορεί κανείς να ακούσει ψέματα και ακόμη και χονδροειδείς λάθη, ειδικά στο "Smile" - στη μέση. Οι κωδικοί ήχου κλήσης ελήφθησαν από το βιβλίο (ή μάλλον, λήφθηκαν από τον ιστότοπο του συγγραφέα του βιβλίου μαζί με το αρχικό αρχείο asm) και δεν έχουν τροποποιηθεί. Προφανώς, υπάρχουν λάθη στην κωδικοποίηση των μελωδιών. Αλλά αυτό δεν είναι πρόβλημα - όποιος είναι «φιλικός» με τη μουσική μπορεί εύκολα να το καταλάβει και να διορθώσει τα πάντα.

Στο ATtiny13, λόγω της έλλειψης μετρητή 16 bit, χρειάστηκε να χρησιμοποιηθεί ένας μετρητής 8 bit για την αναπαραγωγή των σημειώσεων, γεγονός που οδήγησε σε ελαφρά μείωση της ακρίβειας των σημειώσεων. Αλλά αυτό είναι ελάχιστα αντιληπτό από το αυτί.

Σχετικά με τα bit διαμόρφωσης. Οι ρυθμίσεις τους πρέπει να αντιστοιχούν στην κατάσταση του νέου μικροελεγκτή. Εάν το MK σας έχει χρησιμοποιηθεί κάπου στο παρελθόν, πρέπει να ελέγξετε την κατάσταση των bit διαμόρφωσής του και, εάν χρειάζεται, να τα φέρετε σε ευθυγράμμιση με τις ρυθμίσεις του νέου μικροελεγκτή. Μπορείτε να μάθετε την κατάσταση των bit διαμόρφωσης του νέου μικροελεγκτή από την τεκμηρίωση για αυτό το MK (ενότητα "Fuse Bits"). Η εξαίρεση είναι το ATmega128. Αυτό το MCU διαθέτει το bit M103C, το οποίο επιτρέπει τη λειτουργία συμβατότητας με το παλαιότερο ATmega103. Η ενεργοποίηση του bit M103C μειώνει σημαντικά τις δυνατότητες του ATmega128 και αυτό το bit είναι ενεργό στο νέο MK. Πρέπει να επαναφέρετε το M103C σε ανενεργή κατάσταση. Για να χειριστείτε τα bit διαμόρφωσης, χρησιμοποιήστε την αντίστοιχη ενότητα του μενού σεναρίου προγραμματιστή.

Δεν έχει νόημα να δώσετε ένα διάγραμμα του μουσικού κουτιού: περιέχει μόνο έναν μικροελεγκτή, τροφοδοτικό και έναν πομπό πιεζοηχητικού ήχου. Η τροφοδοσία παρέχεται με τον ίδιο ακριβώς τρόπο που κάναμε κατά τον προγραμματισμό του MK. Ο εκπομπός ήχου συνδέεται μεταξύ του κοινού καλωδίου (ακίδα GND του ελεγκτή) και ενός από τους ακροδέκτες MK, ο αριθμός των οποίων βρίσκεται στο αρχείο με τον κωδικό διάταξης προγράμματος (*.asm). Στην αρχή του κειμένου του προγράμματος για κάθε MK στα σχόλια υπάρχει μια γραμμή: " ηχητικό σήμασχηματίζεται στο pin XX." Όταν το σενάριο προγραμματιστή ολοκληρώσει την εργασία του, ο μικροελεγκτής βγαίνει από τη λειτουργία προγραμματισμού και μεταβαίνει σε λειτουργία κανονικής λειτουργίας. Η αναπαραγωγή μελωδιών ξεκινά αμέσως. Συνδέοντας τον πομπό ήχου, μπορείτε να το ελέγξετε. Μπορείτε να αφήσετε τον εκπομπό ήχου συνδέεται κατά τον προγραμματισμό του κρυστάλλου μόνο εάν ο ήχος προέρχεται από μια ακίδα που δεν χρησιμοποιείται από το SPI, διαφορετικά η επιπλέον χωρητικότητα στον ακροδέκτη μπορεί να επηρεάσει τον προγραμματισμό.

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

Αρχικά, ας αναπτύξουμε ένα σχηματικό διάγραμμα της συσκευής. Οι θύρες I/O χρησιμοποιούνται για τη σύνδεση οποιωνδήποτε εξωτερικών συσκευών στον μικροελεγκτή. Κάθε μία από τις θύρες μπορεί να λειτουργεί τόσο ως είσοδος όσο και ως έξοδος. Ας συνδέσουμε το LED σε μία από τις θύρες και το κουμπί στην άλλη. Για αυτό το πείραμα θα χρησιμοποιήσουμε έναν ελεγκτή Atmega8. Αυτό το τσιπ περιέχει 3 θύρες I/O, έχει 2 οκτώ bit και 1 χρονόμετρο/μετρητή δεκαέξι bit. Επίσης, στο σκάφος υπάρχει PWM 3 καναλιών, μετατροπέας αναλογικού σε ψηφιακό 10-bit 6 καναλιών και πολλά άλλα. Κατά τη γνώμη μου, ένας μικροελεγκτής είναι εξαιρετικός για να μάθεις τα βασικά του προγραμματισμού.

Για να συνδέσουμε το LED θα χρησιμοποιήσουμε τη γραμμή PB0 και για να διαβάσουμε πληροφορίες από το κουμπί θα χρησιμοποιήσουμε τη γραμμή PD0. Το διάγραμμα φαίνεται στο Σχ. 1.

Ρύζι. 1

Μέσω της αντίστασης R2, συν η τάση τροφοδοσίας παρέχεται στην είσοδο PD0, η οποία αντιστοιχεί σε ένα λογικό σήμα. Όταν το κουμπί είναι κλειστό, η τάση πέφτει στο μηδέν, που αντιστοιχεί σε ένα λογικό μηδέν. Στο μέλλον, το R2 μπορεί να αποκλειστεί από το κύκλωμα, αντικαθιστώντας το με μια εσωτερική αντίσταση φορτίου, εισάγοντας τις απαραίτητες ρυθμίσεις στο πρόγραμμα. Το LED συνδέεται στην έξοδο της θύρας PB0 μέσω της αντίστασης περιορισμού ρεύματος R3. Για να ανάψετε το LED, πρέπει να εφαρμόσετε ένα λογικό σήμα στη γραμμή PB0. Θα χρησιμοποιήσουμε μια εσωτερική γεννήτρια κύριου ρολογιού στα 4 MHz, καθώς η συσκευή δεν έχει υψηλές απαιτήσεις για σταθερότητα συχνότητας.

Τώρα γράφουμε το πρόγραμμα. Χρησιμοποιώ το περιβάλλον προγραμματισμού για να γράφω προγράμματα AVR StudioΚαι WinAvr.Ανοίξτε το AVR Studio, εμφανίζεται ένα παράθυρο καλωσορίσματος, κάντε κλικ στο κουμπί "Δημιουργία νέου έργου" και, στη συνέχεια, επιλέξτε τον τύπο έργου - AVR GCC, γράψτε το όνομα του έργου για παράδειγμα "cod1", ελέγξτε και το "Δημιουργία φακέλου έργου" και "Δημιουργία αρχικοποίηση αρχείου" , κάντε κλικ στο κουμπί "Επόμενο", επιλέξτε "AVR Simulator" στο αριστερό παράθυρο και πληκτρολογήστε τον μικροελεγκτή "Atmega8" στο δεξί παράθυρο, κάντε κλικ στο κουμπί "Τέλος", ανοίγει ο επεξεργαστής και το δέντρο κατηγορίας έργου - το έχουν ολοκληρωθεί οι αρχικές ρυθμίσεις.

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

συντακτικό της οδηγίας #περιλαμβάνω

#περιλαμβάνω<имя_файла.h>
#include "filename.h"

Γωνιακά στηρίγματα< и >υποδείξτε στον μεταγλωττιστή ότι τα περιλαμβανόμενα αρχεία πρέπει πρώτα να αναζητηθούν στον τυπικό φάκελο WinAvr με το όνομα include. Τα διπλά εισαγωγικά “ και “ λένε στον μεταγλωττιστή να ξεκινήσει την αναζήτηση στον κατάλογο όπου είναι αποθηκευμένο το έργο.

Κάθε τύπος μικροελεγκτή έχει το δικό του αρχείο κεφαλίδας. Για το ATMega8 αυτό το αρχείο ονομάζεται iom8.h, για το ATtiny2313 - iotn2313.h. Στην αρχή κάθε προγράμματος, πρέπει να συμπεριλάβουμε το αρχείο κεφαλίδας του μικροελεγκτή που χρησιμοποιούμε. Αλλά υπάρχει επίσης ένα κοινό αρχείο κεφαλίδας io.h. Ο προεπεξεργαστής επεξεργάζεται αυτό το αρχείο και, ανάλογα με τις ρυθμίσεις του έργου, περιλαμβάνει το απαιτούμενο αρχείο κεφαλίδας στο πρόγραμμά μας.

Για εμάς, η πρώτη γραμμή του προγράμματος θα μοιάζει με αυτό:

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

Κάθε πρόγραμμα C πρέπει να περιέχει μία κύρια συνάρτηση. Ονομάζεται κύριος. Η εκτέλεση του προγράμματος ξεκινά πάντα με την εκτέλεση της κύριας συνάρτησης. Μια συνάρτηση έχει μια κεφαλίδα - int main(void) και ένα σώμα - είναι περιορισμένη άγκιστρα {}.

int main (κενό)
{
σώμα λειτουργίας
}

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

ενθ- αυτός είναι ένας ακέραιος αριθμός 2 byte, το εύρος τιμών είναι από - 32768 έως 32767

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

Στη συνέχεια διαμορφώνουμε τη θύρα ρεστην είσοδο. Ο τρόπος λειτουργίας της θύρας καθορίζεται από τα περιεχόμενα του μητρώου DDRD(μητρώο κατεύθυνσης μεταφοράς πληροφοριών). Γράφουμε τον αριθμό "0x00" (0b0000000 - σε δυαδική μορφή) σε αυτόν τον καταχωρητή· τίποτα δεν είναι συνδεδεμένο σε αυτήν τη θύρα εκτός από το κουμπί, επομένως διαμορφώνουμε ολόκληρη τη θύρα D ως είσοδο. Μπορείτε να διαμορφώσετε τη θύρα bit-bit γράφοντας τους αριθμούς 0 ή 1 σε κάθε bit του καταχωρητή (0-input, 1-output), για παράδειγμα DDRD = 0x81 (0b10000001) - η πρώτη και η τελευταία γραμμή της θύρας D λειτουργούν ως έξοδος, τα υπόλοιπα ως είσοδος. Η εσωτερική αντίσταση φορτίου πρέπει επίσης να συνδεθεί. Ο καταχωρητής PORTx ελέγχει εάν οι εσωτερικές αντιστάσεις είναι ενεργοποιημένες ή απενεργοποιημένες όταν η θύρα είναι σε λειτουργία εισόδου. Ας γράψουμε μονάδες εκεί.

Ρύθμιση της θύρας σιπρος την έξοδο. Ο τρόπος λειτουργίας της θύρας καθορίζεται από τα περιεχόμενα του μητρώου DDRB. Τίποτα άλλο παρά ένα LED στη θύρα σιδεν είναι συνδεδεμένο, επομένως ολόκληρη η θύρα μπορεί να διαμορφωθεί ως έξοδος. Αυτό γίνεται με εγγραφή στο μητρώο DDRBαριθμοί "0xFF". Για να μην ανάψει η λυχνία LED όταν την ανάβετε για πρώτη φορά, γράψτε στη θύρα σιλογικά μηδενικά. Αυτό γίνεται με ηχογράφηση PORTB= 0x00;

Για την εκχώρηση τιμών, χρησιμοποιείται το σύμβολο "=" και ονομάζεται τελεστής εκχώρησης, για να μην συγχέεται με το σύμβολο "ίσο".

Η διαμόρφωση της θύρας θα μοιάζει με αυτό:

DDRD = 0x00;
PORTD = 0xFF;
DDRB = 0xFF;
PORTB = 0x00;

Γράφουμε τον κύριο βρόχο του προγράμματος. ενώ("while" από τα αγγλικά) - αυτή η εντολή οργανώνει έναν βρόχο, επαναλαμβάνοντας το σώμα του βρόχου πολλές φορές μέχρι να εκπληρωθεί η συνθήκη, δηλαδή, ενώ η έκφραση σε αγκύλες είναι αληθής. Στο C, μια έκφραση θεωρείται αληθής αν δεν είναι ίση με μηδέν και ψευδής αν είναι.

Η εντολή μοιάζει με αυτό:

ενώ (κατάσταση)
{
σώμα βρόχου
}

Στην περίπτωσή μας, ο κύριος βρόχος θα αποτελείται από μία μόνο εντολή. Αυτή η εντολή εκχωρεί καταχωρητή PORTBτιμή καταχωρητή που πρέπει να αντιστραφεί PORTD.

PORTB = ~PIND; //πάρτε την τιμή από τη θύρα D, αντιστρέψτε την και αντιστοιχίστε την στο PORTB (εγγραφή στο PORTB)

// Οι εκφράσεις C διαβάζονται από δεξιά προς τα αριστερά

PINDμητρώο εισαγωγής πληροφοριών. Για να διαβάσετε πληροφορίες από την εξωτερική έξοδο του ελεγκτή, πρέπει πρώτα να αλλάξετε το επιθυμητό bit της θύρας σε λειτουργία εισόδου. Δηλαδή, γράψτε στο αντίστοιχο bit του καταχωρητή DDRxμηδέν. Μόνο μετά από αυτό μπορεί να τροφοδοτηθεί ψηφιακό σήμα από μια εξωτερική συσκευή σε αυτόν τον ακροδέκτη. Στη συνέχεια, ο μικροελεγκτής θα διαβάσει το byte από τον καταχωρητή PINx. Τα περιεχόμενα του αντίστοιχου bit αντιστοιχούν στο σήμα στην εξωτερική ακίδα της θύρας. Το πρόγραμμά μας είναι έτοιμο και μοιάζει με αυτό:

#περιλαμβάνω int main (κενό) ( DDRD = 0x00; //θύρα D - είσοδος PORTD = 0xFF; //Σύνδεση της αντίστασης φορτίου DDRB = 0xFF; //θύρα B - έξοδος PORTB = 0x00; //ρυθμίστε την έξοδο στο 0 ενώ(1 ) ( PORTB = ~PIND; //~ bitwise sign inversion ) )

Τα σχόλια χρησιμοποιούνται ευρέως στη γλώσσα C. Υπάρχουν δύο τρόποι γραφής.

/*Ενα σχόλιο*/
//Ενα σχόλιο

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

Εάν χρησιμοποιήσετε το ίδιο πρόγραμμα και συνδέσετε 8 κουμπιά και 8 LED στον μικροελεγκτή, όπως φαίνεται στο σχήμα 2, τότε θα είναι σαφές ότι κάθε bit της θύρας ρεταιριάζει με το bit θύρας του σι. Πατώντας το κουμπί SB1, το HL1 ανάβει, πατώντας το κουμπί SB2, το HL2 ανάβει κ.λπ.

Σχήμα 2

Το άρθρο χρησιμοποίησε υλικά από το βιβλίο του A.V. Belov. "Οδηγός για προγραμματιστές συσκευών AVR"

Έχω πει περισσότερες από μία ή δύο φορές ότι η μελέτη MK πρέπει να ξεκινά με assembler. Ένα ολόκληρο μάθημα στον ιστότοπο αφιερώθηκε σε αυτό (αν και δεν είναι πολύ συνεπές, αλλά σταδιακά το χτενίζω σε μια επαρκή εμφάνιση). Ναι, είναι δύσκολο, το αποτέλεσμα δεν θα είναι την πρώτη μέρα, αλλά θα μάθετε να καταλαβαίνετε τι συμβαίνει στο χειριστήριό σας. Θα ξέρετε πώς λειτουργεί και δεν θα αντιγράψετε τις πηγές άλλων ανθρώπων σαν μαϊμού και θα προσπαθήσετε να καταλάβετε γιατί σταμάτησε ξαφνικά να λειτουργεί. Επιπλέον, είναι πολύ πιο εύκολο για το C να δημιουργήσει κώδικα redneck που θα βγει με pitchfork την πιο ακατάλληλη στιγμή.

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

Από την άλλη, το δυνατό σημείο του C είναι η φορητότητα του κώδικα. Αν φυσικά τα γράψεις όλα σωστά. Διαχωρισμός των αλγορίθμων εργασίας και των υλοποιήσεων υλικού τους σε διαφορετικά μέρη του έργου. Στη συνέχεια, για να μεταφέρετε τον αλγόριθμο σε άλλο μικροελεγκτή, θα αρκεί να ξαναγράψετε μόνο το επίπεδο διασύνδεσης, όπου είναι γραμμένες όλες οι κλήσεις προς το υλικό και να αφήσετε όλο τον κώδικα εργασίας ως έχει. Και, φυσικά, αναγνωσιμότητα. Ο πηγαίος κώδικας C είναι πιο κατανοητός με την πρώτη ματιά (αν και... για παράδειγμα, δεν με νοιάζει τι να δείξω - είτε είναι C είτε ASM :)), αλλά, και πάλι, αν όλα είναι γραμμένα σωστά. Θα προσέξω επίσης αυτά τα σημεία.

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

Το πρώτο πρόγραμμα C για AVR

Επιλογή μεταγλωττιστή και ρύθμιση του περιβάλλοντος
Υπάρχουν πολλοί διαφορετικοί μεταγλωττιστές C για AVR:
Πρώτα από όλα αυτά IAR AVR C- αναγνωρίζεται σχεδόν σίγουρα ως ο καλύτερος μεταγλωττιστής για AVR, γιατί ο ίδιος ο ελεγκτής δημιουργήθηκε σε στενή συνεργασία μεταξύ της Atmel και ειδικών της IAR. Αλλά πρέπει να πληρώσετε για όλα. Και αυτός ο μεταγλωττιστής δεν είναι μόνο ένα ακριβό εμπορικό λογισμικό, αλλά έχει επίσης τόσο μεγάλο αριθμό ρυθμίσεων που χρειάζεται πολλή προσπάθεια για να το μεταγλωττίσετε απλά σε αυτόν. Πραγματικά δεν ανέπτυξα φιλία μαζί του· το έργο σάπιζε λόγω περίεργων σφαλμάτων στο στάδιο της σύνδεσης (αργότερα ανακάλυψα ότι ήταν μια στραβά ρωγμή).

Έρχεται το δεύτερο WinAVR GCC- ένας ισχυρός μεταγλωττιστής βελτιστοποίησης. Πλήρως ανοιχτού κώδικα, cross-platform, γενικά, όλες οι χαρές της ζωής. Επίσης, ενσωματώνεται τέλεια στο AVR Studio, επιτρέποντάς σας να κάνετε εντοπισμό σφαλμάτων ακριβώς εκεί, κάτι που είναι βολικό. Γενικά το επέλεξα.

Υπάρχει επίσης CodeVision AVR Cείναι ένας πολύ δημοφιλής μεταγλωττιστής. Έγινε δημοφιλές λόγω της απλότητάς του. Μπορείτε να λάβετε ένα πρόγραμμα εργασίας σε αυτό μέσα σε λίγα μόνο λεπτά - ο οδηγός κώδικα έναρξης το διευκολύνει πολύ, εξαλείφοντας πρότυπα για την προετοιμασία όλων των ειδών. Για να είμαι ειλικρινής, το έχω κάπως καχύποπτο - μόλις χρειάστηκε να αποσυναρμολογήσω ένα πρόγραμμα που είχε γραφτεί από αυτόν τον μεταγλωττιστή, αποδείχθηκε ότι ήταν κάποιο χάλι και όχι κώδικας. Ένας τρομερός αριθμός περιττών κινήσεων και λειτουργιών, που οδήγησαν σε σημαντικό αριθμό κώδικα και αργή απόδοση. Ωστόσο, ίσως υπήρχε σφάλμα στο DNA του ατόμου που έγραψε το αρχικό υλικολογισμικό. Επιπλέον θέλει λεφτά. Όχι τόσο όσο το IAR, αλλά αισθητό. Και σε λειτουργία επίδειξης σας επιτρέπει να γράψετε όχι περισσότερο από 2 kb κώδικα.
Φυσικά υπάρχει μια ρωγμή, αλλά αν πρόκειται να κλέψεις, είναι ένα εκατομμύριο, με την έννοια του IAR :)

Υπάρχει επίσης Image Craft AVR CΚαι MicroCαπό τη μικροηλεκτρονική. Δεν χρειάστηκε να χρησιμοποιήσω κανένα από τα δύο, αλλά S.W.G.πολύ επαινετικό MicroPascal, λένε, ένα τρομερά βολικό περιβάλλον προγραμματισμού και βιβλιοθήκες. Νομίζω ότι το MicroC δεν θα είναι χειρότερο, αλλά είναι επίσης πληρωμένο.

Όπως είπα, επέλεξα WinAVRγια τρεις λόγους: είναι δωρεάν, ενσωματώνεται στο AVR Studio και υπάρχει μόνο ένας τόνος έτοιμου κώδικα γραμμένο για αυτό για όλες τις περιπτώσεις.

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

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

Ανοίγει ένα πεδίο εργασίας με ένα κενό αρχείο *.c.

Τώρα δεν θα σας βλάψει να διαμορφώσετε την εμφάνιση των διαδρομών στους σελιδοδείκτες του στούντιο. Για να το κάνετε αυτό, μεταβείτε στη διεύθυνση:
Εργαλεία μενού - Επιλογές - Γενικά - Καρτέλες αρχείου και επιλέξτε "Μόνο όνομα αρχείου" από την αναπτυσσόμενη λίστα. Διαφορετικά, θα είναι αδύνατο να λειτουργήσει - η καρτέλα θα περιέχει την πλήρη διαδρομή του αρχείου και δεν θα υπάρχουν περισσότερες από δύο ή τρεις καρτέλες στην οθόνη.

Ρύθμιση έργου
Γενικά, θεωρείται κλασική η δημιουργία ενός αρχείου make στο οποίο περιγράφονται όλες οι εξαρτήσεις. Και μάλλον αυτό είναι σωστό. Αλλά για μένα, που μεγάλωσα με πλήρως ενσωματωμένα IDE όπως uVisionή AVR Studioαυτή η προσέγγιση είναι βαθιά ξένη. Ως εκ τούτου, θα το κάνω με τον τρόπο μου, τα πάντα χρησιμοποιώντας στούντιο σημαίνει.

Πιέστε το κουμπί με το γρανάζι.


Αυτές είναι οι ρυθμίσεις του έργου σας και πιο ακριβείς ρυθμίσειςαυτόματη δημιουργία του makefile. Στην πρώτη σελίδα πρέπει απλώς να εισαγάγετε τη συχνότητα με την οποία θα λειτουργεί το MK σας. Αυτό εξαρτάται από τα bit της ασφάλειας, οπότε υποθέτουμε ότι η συχνότητά μας είναι 8000000Hz.
Προσοχή επίσης στη γραμμή βελτιστοποίησης. Τώρα υπάρχει -Os - αυτό είναι βελτιστοποίηση μεγέθους. Αφήστε το ως έχει προς το παρόν, τότε μπορείτε να δοκιμάσετε να παίξετε με αυτήν την παράμετρο. -Το O0 δεν είναι καθόλου βελτιστοποίηση.

Το επόμενο βήμα είναι να διαμορφώσετε τις διαδρομές. Πρώτα απ 'όλα, προσθέστε τον κατάλογο του έργου σας εκεί - θα προσθέσετε βιβλιοθήκες τρίτων εκεί. Η διαδρομή ".\" θα εμφανιστεί στη λίστα.

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


Αυτα για τωρα. Κάντε κλικ στο OK παντού και μεταβείτε στην πηγή.

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

Θα λειτουργήσει ως εξής:
Όταν φτάσει ένα ένα (κωδικός 0x31) στη θύρα COM, θα ενεργοποιήσουμε τη δίοδο και όταν φτάσει ένα μηδέν (κωδικός 0x30) σβήνει. Επιπλέον, όλα θα γίνονται σε διακοπές και η εργασία στο παρασκήνιο θα είναι το αναβοσβήσιμο μιας άλλης διόδου. Απλό και ουσιαστικό.

Συναρμολόγηση του κυκλώματος
Πρέπει να συνδέσουμε τη μονάδα μετατροπέα USB-USART στις ακίδες USART του μικροελεγκτή. Για να το κάνετε αυτό, πάρτε έναν βραχυκυκλωτήρα από δύο καλώδια και τοποθετήστε τον σταυρωτά στους πείρους. Δηλαδή, συνδέουμε το Rx του ελεγκτή στο Tx του μετατροπέα, και το Tx του μετατροπέα στο Rx του ελεγκτή.

Στο τέλος, αυτό είναι το διάγραμμα:


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

Κώδικας γραφής

Επιτρέψτε μου να κάνω μια κράτηση αμέσως ότι δεν θα εμβαθύνω συγκεκριμένα στην περιγραφή της ίδιας της γλώσσας C. Υπάρχει απλώς ένας τεράστιος όγκος υλικού για αυτό, που κυμαίνεται από την κλασική "Γλώσσα Προγραμματισμού C" από το K&R έως διάφορα εγχειρίδια.

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

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

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

Προσθήκη βιβλιοθηκών.
Πρώτα απ 'όλα, προσθέτουμε τις απαραίτητες βιβλιοθήκες και κεφαλίδες με ορισμούς. Εξάλλου, η C είναι μια καθολική γλώσσα και πρέπει να του εξηγήσουμε ότι εργαζόμαστε ειδικά με το AVR, οπότε γράψτε τη γραμμή στον πηγαίο κώδικα:

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

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

Αυτό το αρχείο βρίσκεται στο φάκελο WinAVRκαι περιέχει μια περιγραφή όλων των καταχωρητών και των θυρών του ελεγκτή. Επιπλέον, όλα εκεί είναι πονηρά, με δέσμευση σε έναν συγκεκριμένο ελεγκτή, ο οποίος μεταδίδεται από τον μεταγλωττιστή μέσω φτιαχνω, κανωαρχείο στην παράμετρο MCUκαι με βάση αυτή τη μεταβλητή, ένα αρχείο κεφαλίδας συνδέεται με το έργο σας με μια περιγραφή των διευθύνσεων όλων των θυρών και των μητρώων για τον συγκεκριμένο ελεγκτή. Ουάου! Χωρίς αυτό, είναι επίσης δυνατό, αλλά τότε δεν θα μπορείτε να χρησιμοποιήσετε συμβολικά ονόματα μητρώου όπως SREG ή UDR και θα πρέπει να θυμάστε τη διεύθυνση του καθενός όπως "0xC1", κάτι που θα σας προκαλέσει πονοκέφαλο.

Η ίδια η ομάδα #περιλαμβάνω<имя файла> σας επιτρέπει να προσθέσετε περιεχόμενο οποιουδήποτε είδους στο έργο σας αρχείο κειμένου, για παράδειγμα, ένα αρχείο με περιγραφή συναρτήσεων ή ένα κομμάτι άλλου κώδικα. Και για να μπορέσει η οδηγία να βρει αυτό το αρχείο, καθορίσαμε τη διαδρομή προς το έργο μας (ο κατάλογος WinAVR είναι ήδη καταχωρημένος εκεί από προεπιλογή).

Κύρια λειτουργία.
Ένα πρόγραμμα C αποτελείται εξ ολοκλήρου από συναρτήσεις. Μπορούν να φωλιαστούν και να καλούνται το ένα από το άλλο με οποιαδήποτε σειρά και διαφορετικοί τρόποι. Κάθε συνάρτηση έχει τρεις απαιτούμενες παραμέτρους:

  • Η επιστρεφόμενη τιμή είναι π.χ. αμαρτία (x)επιστρέφει την τιμή του ημίτου του x. Όπως στα μαθηματικά, εν ολίγοις.
  • Οι μεταδιδόμενες παράμετροι είναι οι ίδιες X.
  • Σώμα λειτουργίας.

Όλες οι τιμές που μεταδίδονται και επιστρέφονται πρέπει να είναι κάποιου τύπου, ανάλογα με τα δεδομένα.

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

1 2 3 4 5 int main(void) (επιστροφή 0 ;)

int main(void) (επιστροφή 0;)

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

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

Φυσικά, σε μικροελεγκτή κύριοςκαταρχήν τίποτα δεν μπορεί να επιστραφεί και θεωρητικά θα έπρεπε να υπάρχει κενό κύριο (κενό), αλλά το GCC σχεδιάστηκε αρχικά για υπολογιστή και εκεί το πρόγραμμα μπορεί να επιστρέψει την τιμή λειτουργικό σύστημαΜετά την ολοκλήρωση. Ως εκ τούτου GCC σε κενό κύριο (κενό)ορκίζεται στην Προειδοποίηση.

Αυτό δεν είναι σφάλμα, θα λειτουργήσει, αλλά δεν μου αρέσουν οι προειδοποιήσεις.

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

Εδώ είναι { } Τα σγουρά τιράντες είναι ένα μπλοκ προγράμματος, σε αυτήν την περίπτωση το σώμα μιας συνάρτησης κύριος, ο κωδικός θα βρίσκεται εκεί.

ΕΠΙΣΤΡΟΦΗ- αυτή είναι η τιμή επιστροφής που θα επιστρέψει η κύρια συνάρτηση με την ολοκλήρωση, αφού έχουμε ένα int, δηλαδή έναν αριθμό, τότε πρέπει να επιστρέψουμε έναν αριθμό. Αν και αυτό δεν έχει νόημα, γιατί... στον μικροελεγκτή, δεν μπορούμε να πάμε πουθενά μόνο από το κεντρικό. Επιστρέφω μηδενικό. Γιατί δεν πειράζει. Αλλά ο μεταγλωττιστής είναι συνήθως έξυπνος και δεν δημιουργεί κώδικα για αυτήν την περίπτωση.
Αν και, αν είναι διεστραμμένο, τότε από κύριοςΜπορείτε να μεταβείτε στο MK - για παράδειγμα, να πέσετε στην ενότητα του bootloader και να το εκτελέσετε, αλλά αυτό θα απαιτήσει επεξεργασία χαμηλού επιπέδου με το υλικολογισμικό προκειμένου να διορθωθούν οι διευθύνσεις μετάβασης. Παρακάτω θα δείτε μόνοι σας και θα καταλάβετε πώς να το κάνετε. Για τι? Αυτή είναι μια άλλη ερώτηση, στο 99,999% των περιπτώσεων αυτό δεν είναι απαραίτητο :)

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

1 2 3 4 5 6 int main(void) (ανυπόγραφο char i; επιστροφή 0 ;)

int main(void) (ανυπόγραφο char i; επιστροφή 0; )

ανυπόγραφοσημαίνει ανυπόγραφο. Το γεγονός είναι ότι στη δυαδική αναπαράσταση, το πιο σημαντικό bit εκχωρείται στο πρόσημο, πράγμα που σημαίνει ότι ο αριθμός +127/-128 χωράει σε ένα byte (char), αλλά αν το πρόσημο απορριφθεί, θα χωρέσει από το 0 έως το 255. Συνήθως το σημάδι δεν χρειάζεται. Έτσι ανυπόγραφο.
Εγώείναι απλώς ένα όνομα μεταβλητής. ΟΧΙ πια.

Τώρα πρέπει να αρχικοποιήσουμε τις θύρες και UART. Φυσικά, μπορείτε να πάρετε και να συνδέσετε τη βιβλιοθήκη και να καλέσετε κάποιο είδος UartInit(9600). αλλά τότε δεν θα ξέρετε τι πραγματικά συνέβη.

Κάνουμε αυτό:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 int main(void ) ( ανυπόγραφο char i; #define XTAL 8000000L #define baudrate 9600L #define bauddivider (XTAL/(16*baudrate)-1)#define HI(x) ((x)>>8) #define LO(x) ((x)& 0xFF) UBRRL = LO(bauddivider) ; UBRRH = HI(bauddivider) ; UCSRA = 0 ; UCSRB = 1<< RXEN| 1 << TXEN| 1 << RXCIE| 0 << TXCIE; UCSRC = 1 << URSEL| 1 << UCSZ0| 1 << UCSZ1; }

int main(void) ( ανυπόγραφο char i; #define XTAL 8000000L #define baudrate 9600L #define bauddivider (XTAL/(16*baudrate)-1) #define HI(x) ((x)>>8) #define LO( x) ((x)& 0xFF) UBRRL = LO(bauddivider); UBRRH = HI(bauddivider); UCSRA = 0; UCSRB = 1<

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

Θα διευκολύνουν τις συνήθεις πράξεις σας για τον υπολογισμό των απαραίτητων συντελεστών. Στην πρώτη γραμμή λέμε ότι αντί XTALμπορείτε να αντικαταστήσετε με ασφάλεια το 8000000 και μεγάλο- ένδειξη του τύπου, λέγοντας long είναι η συχνότητα ρολογιού του επεξεργαστή. Το ίδιο baudrate— συχνότητα μετάδοσης δεδομένων μέσω UART.

bauddividerήδη πιο περίπλοκο, αντί για αυτό θα αντικατασταθεί η έκφραση που υπολογίζεται χρησιμοποιώντας τον τύπο από τους δύο προηγούμενους.
Καθώς και L.O.Και ΓΕΙΑτο χαμηλό και το υψηλό byte θα ληφθούν από αυτό το αποτέλεσμα, επειδή Προφανώς μπορεί να μην χωράει σε ένα byte. ΣΕ ΓΕΙΑΤο X (η παράμετρος εισόδου μακροεντολής) μετατοπίζεται οκτώ φορές προς τα δεξιά, με αποτέλεσμα να απομένει μόνο το πιο σημαντικό byte. Και στο L.O.κάνουμε λίγο AND με τον αριθμό 00FF, ως αποτέλεσμα θα παραμείνει μόνο το χαμηλό byte.

Οπότε όλα όσα γίνονται είναι σαν #καθορίζωμπορείτε να το πετάξετε με ασφάλεια και να υπολογίσετε τους απαραίτητους αριθμούς σε μια αριθμομηχανή και να τους εισαγάγετε αμέσως στις γραμμές UBBRL = …. και UBBRH = …..

Μπορώ. Αλλά! Κάνε αυτό ΑΠΟΛΥΤΑ ΑΔΥΝΑΤΟ!

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

Τότε όλα είναι απλά:
Όλα αυτά τα “UBRRL and Co” είναι καταχωρητές διαμόρφωσης του πομπού UART με τη βοήθεια του οποίου θα επικοινωνούμε με τον κόσμο. Και τώρα τους έχουμε εκχωρήσει τις απαιτούμενες τιμές, ρυθμίζοντας τις στην επιθυμητή ταχύτητα και λειτουργία.

Τύπος εγγραφής 1<Σημαίνει το εξής: πάρτε 1 και βάλτε το στη θέση του RXENσε byte. RXENαυτό είναι το 4ο bit του μητρώου UCSRB, Ετσι 1<σχηματίζει τον δυαδικό αριθμό 00010000, TXEN- αυτό είναι το 3ο bit, και 1<θα δώσει 00001000. Μονό "|" είναι bitwise Ή, άρα 00010000 | 00001000 = 00011000. Με τον ίδιο τρόπο, τα υπόλοιπα απαραίτητα bit διαμόρφωσης ρυθμίζονται και προστίθενται στο γενικό σωρό. Ως αποτέλεσμα, ο αριθμός που συλλέγεται καταγράφεται στο UCSRB. Περισσότερες λεπτομέρειες περιγράφονται στο φύλλο δεδομένων του MK στην ενότητα USART. Ας μην παρασυρόμαστε λοιπόν από τεχνικές λεπτομέρειες.

Έγινε, ήρθε η ώρα να δούμε τι έγινε. Κάντε κλικ στη μεταγλώττιση και ξεκινήστε την εξομοίωση (Ctrl+F7).

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

Το γεγονός είναι ότι αρχικά, στην πραγματικότητα, ήταν στη γραμμή UBRRL = LO(bauddivider). Εξάλλου, αυτό που έχουμε στο ορισμό δεν είναι κώδικας, αλλά απλώς προκαταρκτικοί υπολογισμοί, γι' αυτό και ο προσομοιωτής είναι λίγο βαρετός. Αλλά τώρα κατάλαβε, η πρώτη οδηγία έχει ολοκληρωθεί και αν σκαρφαλώσετε στο δέντρο Προβολή I/O, στην ενότητα USART και κοιτάξτε το byte UBBRL εκεί, θα δείτε ότι η τιμή είναι ήδη εκεί! 0x33.

Πηγαίνετε ένα βήμα παραπέρα. Δείτε πώς αλλάζουν τα περιεχόμενα του άλλου μητρώου. Λοιπόν, διαβάστε τα όλα, δώστε προσοχή στο γεγονός ότι όλα τα υποδεικνυόμενα bit έχουν οριστεί όπως σας είπα και ρυθμίζονται ταυτόχρονα για ολόκληρο το byte. Δεν θα πάει άλλο από το Return - το πρόγραμμα τελείωσε.

Ανοιγμα
Τώρα επαναφέρετε την προσομοίωση στο μηδέν. Κάντε κλικ εκεί Επαναφορά (Shift+F5). Ανοίξτε την αποσυναρμολογημένη λίστα, τώρα θα δείτε τι πραγματικά συμβαίνει στον ελεγκτή. Προβολή -> Αποσυναρμολόγηση. Και όχι ΓΙΑΑΑΑΑΑ!!! Συμβολομεταφράστης!!! ΦΡΙΚΗ!!! ΚΑΙ ΕΙΝΑΙ ΑΠΑΡΑΙΤΗΤΟ. Έτσι ώστε αργότερα, όταν κάτι πάει στραβά, να μην είστε ανόητοι στον κώδικα και να μην κάνετε κουτό ερωτήσεις στα φόρουμ, αλλά αμέσως να μπείτε στα κότσια και να δείτε πού έχετε κολλήσει. Δεν υπάρχει τίποτα τρομακτικό εκεί.

Πρώτα θα υπάρχουν κορυφές από τη σειρά:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 +00000000: 940C002A JMP 0x0000002A Jump +00000002: 940C0034 JMP 0x00000034 Jump +00000004: 940C0034 JMP 0x3000000C 0x00000034 Jump +00000008: 940C0034 JMP 0x00000034 Jump +0000000A: 940C0034 JMP 0x00000034 Jump +00000000C: 940MP000C: 940MP00C 0000000E: 940C0034 JMP 0x00000034 Jump +00000010: 940C0034 JMP 0x00000034 Jump +00000012: 940C0034 JMP 0x0000000C Jump : 940C0034 JMP 0x00000034 Jump +0000001E: 940C0034 JMP 0x00000034 Jump +00000020: 940C0034 JMP 0x00000034 JMP 0x00000034 JMP 0x00000034 JMP 0x00000034 άλμα +00000034 άλμα 0x00000034 940C0034 JMP 0x0000000034 34 Jump +00000024: 940C0034 JMP 0x00000034 Jump +00000026: 940C0034 JMP 0x00000034 Jump +00000028: 940C0034 Jump 0x00000026

00000000: 940C002A JMP 0x0000002A Jump +00000002: 940C0034 JMP 0x00000034 Jump +00000004: 940C0034 JMP 0x00000000C 0x00000034 Jump +00000008: 940C0034 JMP 0x00000034 Jump +0000000A: 940C0034 JMP 0x00000034 Jump +00000000C: 940000000C: 94000000C: 94000000C : 940C0034 JMP 0x00000034 Jump +00000010: 940C0034 JMP 0x00000034 Jump +00000012: 940C0034 JMP 0x00000034 JMP 0x00000034 JMP 0x00000034 άλμα 0x00000034 JMP 0x00000034 άλμα 0x00000034 940C0034 34 Jump +00000016: 940C0034 JMP 0x00000034 Jump +00000018: 940C0034 JMP 0x00000034 Jump +0000001A: 940C0034 Jump +00000034 Jump +00000018 : 940C0034 JMP 0x00000034 Jump +0000001E: 940C0034 JMP 0x00000034 Jump +00000020: 940C0034 JMP 0x00000034 JMP 0x00000034 JMP 0x00000034 JMP 0x00000034 άλμα +00000034 άλμα 0x00000034 940C0034 JMP 0x0000000034 34 Jump +00000024: 940C0034 JMP 0x00000034 Jump +00000026: 940C0034 JMP 0x00000034 Jump +00000028: 940C0034 Jump 0x00000026

Αυτός είναι ο διανυσματικός πίνακας διακοπής. Θα επιστρέψουμε σε αυτό αργότερα, αλλά προς το παρόν κοιτάξτε και θυμηθείτε ότι υπάρχει. Η πρώτη στήλη είναι η διεύθυνση του κελιού flash στο οποίο βρίσκεται η εντολή, η δεύτερη είναι ο κώδικας εντολής, η τρίτη είναι η εντολή μνημονική, η ίδια οδηγία συναρμολόγησης, η τρίτη είναι οι τελεστές της εντολής. Λοιπόν, αυτόματο σχόλιο.
Έτσι, αν κοιτάξετε, υπάρχουν συνεχείς μεταβάσεις. Και ο κώδικας εντολής JMP είναι τέσσερα byte, περιέχει τη διεύθυνση άλματος γραμμένη προς τα πίσω - το χαμηλό byte στη χαμηλή διεύθυνση και τον κωδικό εντολής άλματος 940C

0000002B: BE1F OUT 0x3F, R1 Έξοδος σε θέση I/O

Καταγραφή αυτού του μηδενός στη διεύθυνση 0x3F. Εάν κοιτάξετε τη στήλη προβολής εισόδου/εξόδου, θα δείτε ότι η διεύθυνση 0x3F είναι η διεύθυνση του καταχωρητή SREG - ο καταχωρητής σημαίας του ελεγκτή. Εκείνοι. επαναφέρουμε το SREG για να τρέξει το πρόγραμμα σε μηδενικές συνθήκες.

1 2 3 4 +0000002C: E5CF LDI R28,0x5F Άμεση φόρτωση +0000002D: E0D4 LDI R29,0x04 Άμεση φόρτωση +0000002E: BFDE OUT 0x3E,R29 Έξοδος σε θέση I/O +000000002F Θέση I/O +0000000002F

0000002C: E5CF LDI R28,0x5F Άμεση φόρτωση +0000002D: E0D4 LDI R29,0x04 Άμεση φόρτωση +0000002E: BFDE OUT 0x3E,R29 Έξοδος σε θέση I/O +000000002F Θέση I/O +0000000002F

Αυτό φορτώνει τον δείκτη στοίβας. Δεν μπορείτε να φορτώσετε απευθείας σε καταχωρητές I/O, μόνο μέσω ενός ενδιάμεσου καταχωρητή. Επομένως, πρώτα LDI σε ενδιάμεσο, και μετά από εκεί OUT στο I/O. Θα σας πω επίσης περισσότερα για τη στοίβα αργότερα. Προς το παρόν, να ξέρετε ότι πρόκειται για μια δυναμική περιοχή μνήμης που κρέμεται στο τέλος της μνήμης RAM και αποθηκεύει διευθύνσεις και ενδιάμεσες μεταβλητές. Τώρα έχουμε υποδείξει από πού θα ξεκινά η στοίβα μας.

00000032: 940C0041 JMP 0x00000041 Άλμα

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

1 2 +00000041: 94F8 CLI Καθολική διακοπή Απενεργοποίηση +00000042: CFFF RJMP PC-0x0000 Σχετικό άλμα

00000041: 94F8 CLI Global Interrupt Disable +00000042: CFFF RJMP PC-0x0000 Σχετικό άλμα

Αυτό συμβαίνει σε περίπτωση απρόβλεπτων περιστάσεων, όπως η έξοδος από την κύρια λειτουργία. Ο ελεγκτής μπορεί να βγει από έναν τέτοιο βρόχο είτε με επαναφορά υλικού, είτε, πιο πιθανό, με επαναφορά από έναν φύλακα. Λοιπόν, ή, όπως είπα παραπάνω, διορθώστε το στο εξάγωνο πρόγραμμα επεξεργασίας και καλπάστε όπου θέλει η καρδιά μας. Σημειώστε επίσης ότι υπάρχουν δύο τύποι μεταβάσεων: JMP και RJMP· ο πρώτος είναι μια άμεση μετάβαση σε μια διεύθυνση. Καταλαμβάνει τέσσερα byte και μπορεί να μεταπηδήσει απευθείας σε ολόκληρη την περιοχή της μνήμης. Ο δεύτερος τύπος μετάβασης είναι RJMP - σχετικός. Η εντολή του παίρνει δύο byte, αλλά μετακινείται από την τρέχουσα θέση (διεύθυνση) 1024 βήματα προς τα εμπρός ή προς τα πίσω. Και οι παράμετροί του υποδεικνύουν τη μετατόπιση από το τρέχον σημείο. Χρησιμοποιείται πιο συχνά γιατί καταλαμβάνει το μισό χώρο σε ένα flush, και σπάνια χρειάζονται μεγάλες μεταβάσεις.

1 +00000034: 940C0000 JMP 0x00000000 Άλμα

00000034: 940C0000 JMP 0x00000000 Άλμα

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

Λειτουργία κύρια. Όλα είναι παρόμοια, δεν χρειάζεται καν να τα περιγράψεις. Απλώς κοιτάξτε τον ήδη υπολογισμένο αριθμό που εισάγεται στα μητρώα. Ο μεταγλωττιστής προεπεξεργαστής ροκάρει!!! Όχι λοιπόν «μαγικοί» αριθμοί!

1 2 3 4 5 6 7 8 9 10 11 12 <

00000036: E383 LDI R24,0x33 Φόρτωση άμεσης +00000037: B989 OUT 0x09,R24 Έξοδος στη θέση I/O 15: UBRRH = HI(bauddivider); +00000038: BC10 OUT 0x20,R1 Έξοδος σε θέση I/O 16: UCSRA = 0; +00000039: B81B OUT 0x0B, R1 Έξοδος στη θέση I/O 17: UCSRB = 1<

Και εδώ είναι το σφάλμα:

1 2 3 +0000003E: E080 LDI R24.0x00 Φόρτωση άμεση +0000003F: E090 LDI R25.0x00 Φόρτωση άμεση +00000040: 9508 RET Επιστροφή υπορουτίνας

0000003E: E080 LDI R24.0x00 Φόρτωση άμεση +0000003F: E090 LDI R25.0x00 Φόρτωση άμεση +00000040: 9508 RET Επιστροφή υπορουτίνας

Το ερώτημα είναι γιατί ο μεταγλωττιστής προσθέτει τέτοιες κορυφές; Και αυτό δεν είναι τίποτα άλλο από το Return 0, ορίσαμε τη συνάρτηση ως int main(void) και έτσι σπαταλήσαμε άλλα τέσσερα byte για τίποτα :) Και αν κάνετε void main(void) τότε θα παραμείνει μόνο το RET, αλλά θα εμφανιστεί μια προειδοποίηση , ότι η κύρια λειτουργία μας δεν επιστρέφει τίποτα. Γενικά, κάνε ό,τι θέλεις :)

Δύσκολος? Προφανώς όχι. Κάντε κλικ στην εκτέλεση βήμα προς βήμα σε λειτουργία αποσυναρμολόγησης και δείτε πώς ο επεξεργαστής εκτελεί μεμονωμένες οδηγίες, τι συμβαίνει με τους καταχωρητές. Πώς γίνεται η κίνηση μέσω εντολών και ο τελικός βρόχος;

Συνέχεια σε λίγες μέρες...

Εκτός κορυφής:
Αλεξέι78Δημιούργησα μια προσθήκη για τον Firefox που διευκολύνει την πλοήγηση στον ιστότοπο και το φόρουμ μου.
Συζήτηση και λήψη,


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

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

4. Ποια βιβλιογραφία πρέπει να μελετήσω;

Ας προσπαθήσουμε να απαντήσουμε σε αυτές τις ερωτήσεις.

1. Ποιον μικροελεγκτή να επιλέξω για τη δουλειά;

Οι μικροελεγκτές 8-bit είναι πολύ δημοφιλείς στους ραδιοερασιτέχνες. PICΤεχνολογία μικροτσίπ και AVR Atmel, 16-bit MSP430από TI, καθώς και μικροελεγκτές 32-bit, αρχιτεκτονικές ΜΠΡΑΤΣΟ.

Στη βιομηχανία, κάπως διαφορετικά, την πρώτη θέση με μεγάλη διαφορά κατέχει Renesas Electronicsστο δεύτερο Ελεύθερη κλίμακα, στην τρίτη Samsung, τοτε ΠΗΓΑΙΝΕ ΜικροτσίπΚαι T.I., μετά όλα τα υπόλοιπα.
Η δημοτικότητα καθορίζεται από την τιμή και τη διαθεσιμότητα· η διαθεσιμότητα των τεχνικών πληροφοριών και το κόστος υποστήριξης λογισμικού παίζουν σημαντικό ρόλο.

Θα μελετήσουμε 8-bit μικροελεγκτές AVR, οικογένειες Σειρά ATMEGA 8 και 16. Η επιλογή καθορίστηκε και πάλι από την προσβασιμότητα, την παρουσία πολλών ερασιτεχνικών εξελίξεων και την τεράστια ποσότητα εκπαιδευτικού υλικού. Η παρουσία μιας ποικιλίας ενσωματωμένων εξαρτημάτων και λειτουργικότητας αυτής της οικογένειας.

2. Ποιο περιβάλλον ανάπτυξης πρέπει να χρησιμοποιήσω για να προγραμματίσω τον επιλεγμένο μικροελεγκτή;

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

Τα πιο συνηθισμένα AVRStudio, ATmelStudio, WINAVR, CodeVision, IAR Embedded Workbench.
Για να γράψουμε προγράμματα, θα χρησιμοποιήσουμε το δωρεάν IDE ATmelStudio έκδοση 6και ψηλότερα.
Μπορείτε να κατεβάσετε το Atmel Studio από τον επίσημο ιστότοπο μετά την εγγραφή (η εγγραφή είναι απολύτως δωρεάν και δεν σας υποχρεώνει σε τίποτα!)

Το ATmelStudio σάς επιτρέπει να δημιουργείτε έργα και να γράφετε προγράμματα τόσο σε assembler όσο και σε SI.

Αρχικά, το ερώτημα είναι πάντα: ποια γλώσσα προγραμματισμού πρέπει να επιλέξω για να γράψω αποτελεσματικά προγράμματα;

Η απάντησή μου είναι απλή: πρέπει να είστε σε θέση να γράφετε σε τουλάχιστον δύο γλώσσες: assembly και SI. Η γλώσσα συναρμολόγησης είναι απλά απαραίτητη όταν χρειάζεται να γράψετε γρήγορες και συμπαγείς υπορουτίνες και μακροεντολές, καθώς και διάφορα προγράμματα οδήγησης συσκευών. Όμως, όταν χρειάζεται να δημιουργήσετε ένα μεγάλο έργο βασισμένο σε πολύπλοκους αλγόριθμους, χωρίς γνώση του SI, μπορεί να δαπανηθεί πολύς χρόνος, ειδικά στη διαδικασία εντοπισμού σφαλμάτων, και εάν υπάρχει επιθυμία να το μεταφέρετε σε άλλη πλατφόρμα, για παράδειγμα PIC18 , ή STM, μπορεί να γίνει ένα άλυτο πρόβλημα.
Επιπλέον, έχουν πλέον εμφανιστεί πλατφόρμες υπολογιστών υλικού Arduino, εργασία με την οποία απαιτεί γνώση της γλώσσας SI++.
Επομένως, θα γράψουμε προγράμματα τόσο σε assembler όσο και σε SI.

Για να δείτε ξεκάθαρα το αποτέλεσμα της εργασίας σας χωρίς να χρησιμοποιήσετε κολλητήρι ή breadboard, απλώς εγκαταστήστε το πρόγραμμα Πρωτεύς.

3. Πώς να αναβοσβήσετε το χειριστήριο και ποιες πρόσθετες συσκευές και αξεσουάρ χρειάζονται για εύκολη εργασία μαζί τους;

Χρησιμοποιούμε Datagorian. Επιπλέον, θα χρειαστεί να αγοράσετε breadboards και τροφοδοτικό με τάση εξόδου 5 Volt. Μπορείτε να το χρησιμοποιήσετε ως τροφοδοτικό χαμηλού κυματισμού χρησιμοποιώντας μια δίοδο zener 5 volt.
Ίσως, με την πάροδο του χρόνου, ο Igor και εγώ θα προτείνουμε ένα έργο για τη συναρμολόγηση ενός πίνακα εντοπισμού σφαλμάτων.

4. Ποια βιβλιογραφία πρέπει να μελετήσω;

Αλλά, για παράδειγμα:
Πρακτικός προγραμματισμός AVR σε assembler. Revich, 2011
1000 και ένα κύκλωμα μικροελεγκτή Vol. 1-2. Ryumik, 2010-2011
10 πρακτικές συσκευές στο AVR MK Book 1-2. Kravchenko, 2008-2009
Ένα σεμινάριο για έναν προγραμματιστή συσκευών που χρησιμοποιεί το AVR MK. Belov, 2008
Οι οικογένειες MK AVR Tiny και Atmega. Efstifeev, 2008
CodeVisionAVR. Ένας οδηγός για αρχάριους. Lebedev, 2008
Έλεγχος συσκευών με μικροεπεξεργαστή, θυρίστορ, ρελέ. Belov, 2008
Αναλογικές διεπαφές MK. Steward, Ball, 2007
Δημιουργούμε συσκευές στο AVR MK. Belov, 2007
MK AVR στην πρακτική του ραδιοερασιτέχνη. Πλήρης ανάλυση του ATTINY2313. Belov, 2007
Ανταλλαγή δεδομένων δικτύου και διαδικτύου με την MK. Go, 2007
MK AVR. εργαστήριο για αρχάριους. Hartov, 2007
Εφαρμογή AVR Schemes, αλγορίθμων, προγραμμάτων. Baranov, 2006
Μικροελεγκτές AVR. Εισαγωγικό μάθημα. Morton, 2006
Μέτρηση, έλεγχος και ρύθμιση με χρήση AVR. Τρούμπερτ, 2006
Προγραμματισμός σε γλώσσα C για AVR και PIC MK. Shpak, 2006
Σχεδιασμός συσκευών στο MK. Belov, 2005
MK - είναι απλό, τόμοι 1-3. Frunze, 2002-2003
The C Programming Language, 2η έκδοση. Kernighan, Ritchie, 2009
Προγραμματισμός μικροελεγκτών ATMEL στη γλώσσα S. Prokopenko, 2012

5. Πού στο Διαδίκτυο μπορείτε να κάνετε ερωτήσεις και να λάβετε συγκεκριμένες απαντήσεις;

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

Τώρα ας ρίξουμε μια πιο προσεκτική ματιά στον αγαπημένο μας, τον μικροελεγκτή ATMEGA 8

Μικροελεγκτής AVR 8-bit, υψηλής απόδοσης, χαμηλής ισχύος
Προοδευτική αρχιτεκτονική RISC
130 εντολές υψηλής απόδοσης, οι περισσότερες εντολές εκτελούνται σε έναν κύκλο ρολογιού
Μητρώοι εργασίας 32 8-bit γενικού σκοπού
Εντελώς στατική λειτουργία
Απόδοση που πλησιάζει τα 16 MIPS (σε ταχύτητα ρολογιού 16 MHz)
Ενσωματωμένος πολλαπλασιαστής 2 κύκλων

Μη πτητικό πρόγραμμα και μνήμη δεδομένων
8 KB αυτοπρογραμματιζόμενης μνήμης Flash εντός συστήματος
Παρέχει 1000 κύκλους διαγραφής/εγγραφής
Πρόσθετος τομέας κωδικών εκκίνησης με ανεξάρτητα bits κλειδώματος
Παρέχει ταυτόχρονη λειτουργία ανάγνωσης/εγγραφής (Read-While-Write)
512 byte EEPROM
Παρέχει 100.000 κύκλους διαγραφής/εγγραφής
1 KB SRAM σε τσιπ
Προγραμματιζόμενο κλείδωμα για προστασία του λογισμικού χρήστη

Ενσωματωμένα περιφερειακά
Δύο χρονοδιακόπτες/μετρητές 8 bit με ξεχωριστό prescaler, ο ένας με λειτουργία σύγκρισης
Ένας χρονοδιακόπτης/μετρητής 16 bit με ξεχωριστό prescaler και λειτουργίες λήψης και σύγκρισης
Μετρητής πραγματικού χρόνου με ξεχωριστή γεννήτρια
Τρία κανάλια PWM
Μετατροπέας A/D 8 καναλιών (TQFP και MLF)
6 κανάλια με ακρίβεια 10 bit
Μετατροπέας αναλογικού σε ψηφιακό 6 καναλιών (σε συσκευασία PDIP)
4 κανάλια με ακρίβεια 10-bit
2 κανάλια με ακρίβεια 8 bit
Σειριακή διεπαφή 2 συρμάτων προσανατολισμένη στα byte
Προγραμματιζόμενη σειριακή USART
Σειριακή διεπαφή SPI (master/slave)
Προγραμματιζόμενος χρονοδιακόπτης παρακολούθησης με ξεχωριστό ενσωματωμένο ταλαντωτή
Ενσωματωμένος αναλογικός συγκριτής

Ειδικές λειτουργίες μικροελεγκτή
Επαναφορά ενεργοποίησης και προγραμματιζόμενη ανίχνευση διακοπής λειτουργίας
Ενσωματωμένος βαθμονομημένος ταλαντωτής RC
Εσωτερικές και εξωτερικές πηγές διακοπής
Πέντε λειτουργίες χαμηλής κατανάλωσης: Idle, Power-Save, Power-down, Standby και μείωση θορύβου ADC

Καρφίτσες και περιβλήματα I/O
23 προγραμματιζόμενες γραμμές I/O
Πακέτο PDIP 28 ακίδων, πακέτο TQFP 32 ακίδων και πακέτο MLF 32 ακίδων

Τάσεις λειτουργίας
2,7 - 5,5 V (ATmega8L)
4,5 - 5,5 V (ATmega8)

Συχνότητα λειτουργίας
0 - 8 MHz (ATmega8L)
0 - 16 MHz (ATmega8)

διαφορές μεταξύ ATMEGA16 και 8
16 KB αυτοπρογραμματιζόμενης μνήμης Flash εντός του συστήματος

Διεπαφή JTAG (συμβατό με IEEE 1149.1)
Δυνατότητα περιφερειακής σάρωσης συμβατή με το πρότυπο JTAG
Διευρυμένη υποστήριξη για ενσωματωμένο εντοπισμό σφαλμάτων
Προγραμματισμός μέσω διασύνδεσης JTAG: Flash, μνήμη EEPROM, jumpers και bits κλειδώματος

Τέσσερα κανάλια PWM/PWM

Μετατροπέας αναλογικού σε ψηφιακό 8 καναλιών 10 bit
8 μη ισορροπημένα κανάλια
7 διαφορικά κανάλια (μόνο πακέτο TQFP)
2 διαφορικά κανάλια με προγραμματιζόμενο κέρδος 1x, 10x ή 200x (μόνο πακέτο TQFP)

Έξι λειτουργίες χαμηλής κατανάλωσης: Idle, Power-Save, Power-down, Standby, Extended Standby και μείωση θορύβου ADC

32 προγραμματιζόμενες γραμμές I/O

Πακέτο PDIP 40 ακίδων και πακέτο TQFP 44 ακίδων

AtmelStudio

Εάν μόλις ξεκινάτε, τότε πρέπει να κατεβάσετε και να εγκαταστήσετε το πρόγραμμα AtmelStudio από την επίσημη σελίδα atmel.com
Αφού εγκαταστήσετε το πρόγραμμα AtmelStudio, μπορείτε να ξεκινήσετε τη δημιουργία ενός έργου.
Εργο- αυτό είναι το πρόγραμμά σας που θα γράψετε, θα διορθώσετε και θα αναβοσβήσετε, μετά τη μεταγλώττιση, στη μνήμη του μικροελεγκτή.

Για να δημιουργήσετε ένα έργο, πρέπει να ανοίξετε το πρόγραμμα, θα εμφανιστεί η ακόλουθη προφύλαξη οθόνης,

και θα ανοίξει η σελίδα δημιουργίας έργου

Για να δημιουργήσετε ένα νέο έργο, πρέπει να κάνετε κλικ στο "Νέο έργο..."
Σε αυτήν την περίπτωση, θα ανοίξει ένα νέο παράθυρο όπου μπορείτε να επιλέξετε τη γλώσσα προγραμματισμού, το όνομα του έργου, τη θέση του, το όνομα του πακέτου με τα αρχεία του έργου και τη δυνατότητα δημιουργίας καταλόγου για περαιτέρω χρήση σε άλλα πολλαπλά έργα . Για να δημιουργήσουμε ένα έργο όπου θα προγραμματίσουμε σε assembler, πρέπει να επιλέξουμε - Συμβολομεταφράστης, μετά από αυτό αλλάζουμε το όνομα του έργου, τη θέση του και επιλέγουμε ΕΝΤΑΞΕΙ.

Θα εμφανιστεί το παρακάτω παράθυρο

Επιλέγω “megaAVR, 8-bit”και βρούμε τον μικροελεγκτή που χρειαζόμαστε, επιλέξαμε ATmega8.Στη δεξιά πλευρά της προφύλαξης οθόνης, εμφανίζεται μια λίστα συσκευών που λειτουργούν με αυτόν τον μικροελεγκτή, μία από τις οποίες μπορούμε να συνδέσουμε. Επιλέγω ΕΝΤΑΞΕΙ.

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


Μπορούμε να προγραμματίσουμε σε assembler.
Με τον ίδιο τρόπο δημιουργείται ένα έργο προγραμματισμού σε γλώσσα SI.

Γεια σας, κάτοικοι MySku! Ο ήρωας της κριτικής μας είναι ο μικροελεγκτής Atmega8A-16PU. Θα σας πω για τον προγραμματισμό αυτού του μικροελεγκτή στο ενσωματωμένο περιβάλλον ανάπτυξης CodeVisionAvr, θα αναβοσβήνουμε το LED και θα εξετάσουμε τα πλεονεκτήματα και τα μειονεκτήματα της εργασίας σε αυτό το περιβάλλον. Ίσως στο μέλλον αυτό να χρησιμεύσει ως εναλλακτική λύση για το ήδη «δημοφιλές» Arduino. Αν σε ενδιαφέρει πήγαινε να κόψεις.

Προοίμιο.
Έτυχε να ξεκινήσω τη γνωριμία μου με τον MK με το Arduino. Ανοιγόκλεισα το LED, συνέδεσα διάφορους αισθητήρες και ασπίδες και έκανα διάφορα έργα. Όλα δούλεψαν, έμεινα ικανοποιημένος, αλλά ήθελα κάτι παραπάνω. Συνάντησα ένα έργο στο οποίο εμπλέκεται το Atmega8A, για το οποίο πρέπει να γράψω μόνος μου το υλικολογισμικό. Ήταν αυτός που με ώθησε να μελετήσω τη διαδικασία προγραμματισμού ενός «γυμνού» MK.
Έτσι, έχουμε έναν μικροελεγκτή από την Atmel, την οικογένεια AVR Atmega8A.

Προδιαγραφές:


Pinout:


Εδώ είναι
Τώρα για λειτουργία και προγραμματισμό πρέπει να το συνδέσετε στον προγραμματιστή σύμφωνα με το διάγραμμα:

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


Ωστόσο, αυτή η λύση έχει ένα σημαντικό μειονέκτημα, για το οποίο θα μιλήσω λίγο αργότερα. Πριν ξεκινήσουμε να γράφουμε ένα πρόγραμμα στο CodeVisionAvr (στο εξής θα αναφέρεται ως CvAvr), πρέπει να αποφασίσουμε σε ποια συχνότητα θα λειτουργεί ο μικροελεγκτής μας. Από προεπιλογή, από το εργοστάσιο, ο ήρωάς μας λειτουργεί από μια εσωτερική γεννήτρια rc σε συχνότητα 1 MHz (με δυνατότητα επαναδιαμόρφωσης στα 2, 4 και 8 MHz). Εφόσον η εσωτερική γεννήτρια rc βαθμονομείται στο εργοστάσιο υπό ορισμένες συνθήκες (ακριβής τάση, θερμοκρασία), η ακρίβεια της λειτουργίας της σε συνθήκες «πεδίου» μπορεί να διαφέρει από 3% έως 10%. Για εργασίες όπου δεν απαιτείται υψηλή ακρίβεια χρονισμού, αυτό μπορεί να παραμεληθεί· σε άλλες περιπτώσεις, είναι καλύτερο να χρησιμοποιείτε εξωτερικό χαλαζία. Στο έργο μου χρησιμοποίησα έναν εξωτερικό χαλαζία σε συχνότητα 8 MHz. Τώρα πρέπει να "εξηγήσουμε" στο MC ότι πρέπει να λειτουργεί από εξωτερικό χαλαζία. Αυτό γίνεται αλλάζοντας τις ασφάλειες. Για να το θέσω με απλά λόγια, αυτό είναι κάτι σαν BIOS, όπως σε μια μητρική πλακέτα, όπου υποδεικνύετε τους τρόπους λειτουργίας της· ομοίως, λέμε στο MK σε ποιες λειτουργίες, εκτός από τη συχνότητα, πρέπει να λειτουργεί. Όλες οι πληροφορίες θα αποθηκευτούν σε μη πτητική μνήμη.
Θα σας πω για τη σύντηξη υλικολογισμικού κάτω από το σπόιλερ· όσοι ξέρουν πώς να το κάνουν οι ίδιοι μπορούν να μετακινηθούν περαιτέρω.

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

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


Όλα είναι απλά εδώ:
Πηγή ρολογιού - ρυθμίστε τη συχνότητα (Εξωτερικός κρύσταλλος 3 - 16 Mhz) από τον εξωτερικό χαλαζία.
Χρόνος εκκίνησης - Ταχύτητα εκκίνησης MC μετά την αφαίρεση του RESET ή την παροχή ρεύματος (16K CK + 4,1ms γρήγορα).
Επιλέξτε το πλαίσιο: Ext. Ρολόι/RC Osc./Χαμηλή συχνότητα. Κρύσταλλο: ενεργοποίηση εσωτερικών πυκνωτών (36 pF)
Εσωτερικό R/C Osc.: αφήστε χωρίς έλεγχο! Εξωτερικό κρύσταλλο: ενεργοποίηση πλήρους αιώρησης (απαραίτητο για >8 MHz).
Έτσι, πήραμε Low Fuse 0xEF και High Fuse 0xC9. Τέλεια, η μισή δουλειά έγινε. Τώρα συνδέουμε τον μικροελεγκτή στο Arduino UNO και το ίδιο το Arduino στον υπολογιστή, αντίστοιχα. Εκκινήστε τη γραμμή εντολών, μεταβείτε στο φάκελο με το AvrDude. Στη συνέχεια, εισαγάγετε τη γραμμή: avrdude -C avrdude.conf -c avrisp -P COM13 -b 19200 -p m8 -U lfuse:w:0xef:m -U hfuse:w:0xc9:m
Έτσι φαίνεται στην εικόνα:


Ας αναλύσουμε τη γραμμή που εισαγάγατε:
Το avrisp είναι ένας τύπος προγραμματιστή που μοιάζει με Arduino
Το COM13 είναι ο αριθμός θύρας που προσδιορίζει το Arduino μας στο σύστημα (στην περίπτωσή σας θα πρέπει να το αναζητήσετε στη διαχείριση συσκευών)
19200 - Ταχύτητα θύρας com, αφήστε ως έχει
m8 - υποδεικνύουν ότι το MK μας είναι το Atmega8
-U fuse:w:0xef:m -U hfuse:w:0xc9:m - Η χαμηλή ασφάλεια 0xEF και η υψηλή ασφάλεια 0xC9 υποδεικνύονται εδώ
Είναι ΠΑΡΑΚΑΛΩ ΠΡΟΣΟΧΗ!!, Η λανθασμένα καθορισμένη ασφάλεια μπορεί να οδηγήσει στο μπλοκάρισμα του MK (δεν χρειάζεται να χορεύουμε με ντέφι για να το επαναφέρουμε).
Πατάμε «Enter» και στην έξοδο παίρνουμε το αποτέλεσμα, όπως στην εικόνα:


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


Τώρα είμαστε έτοιμοι να ξεκινήσουμε τον προγραμματισμό. Για τον εαυτό μου, επέλεξα το περιβάλλον ανάπτυξης CvAvr. Η γλώσσα προγραμματισμού θα είναι διαφορετική από την Arduino· στο CvAvr είναι σαν C. Ας γράψουμε το πρώτο μας Blink.
Μετά την εγκατάσταση και την εκκίνηση του περιβάλλοντος, θα χρησιμοποιήσουμε τον Οδηγό δημιουργίας έργου. Επιλέξτε "Αρχείο" - "Νέο" - "Έργο". Στην ερώτηση αν θα χρησιμοποιήσουμε τον μάγο, απαντάμε καταφατικά. Τύπος Chip Target AVR: AT90, ATtity, ATmega.
Έτσι φαίνεται ο Οδηγός Έργου:


Στην καρτέλα Chip, επιλέξτε ATmega8A, Ρολόι 8.000000 Mhz. Μεταβείτε στην καρτέλα Ports. Το LED μας θα συνδεθεί στον ακροδέκτη 14 του μικροελεγκτή, σύμφωνα με το pinout - PB0. Στην καρτέλα, επιλέξτε Θύρα B, μετάβαση Bit 0 από IN σε OUT, δηλ. Αλλάζουμε τον τρόπο λειτουργίας του 14ου σκέλους του μικροελεγκτή μας στην έξοδο.


Αυτό ολοκληρώνει το έργο του πλοιάρχου. Επιλέξτε "Πρόγραμμα" - "Δημιουργία, Αποθήκευση και Έξοδος". Αποθηκεύουμε το έργο μας, για παράδειγμα, με το όνομα Blink.

Ας πάρουμε ένα ποδαρικό σαν αυτό

/*******************************************************
Αυτό το πρόγραμμα δημιουργήθηκε από τον
CodeWizardAVR V3.12 Για προχωρημένους
Αυτόματη Γεννήτρια Προγραμμάτων
Τύπος τσιπ: ATmega8A
Τύπος προγράμματος: Εφαρμογή
Συχνότητα ρολογιού πυρήνα AVR: 8.000000 MHz
Μοντέλο μνήμης: Μικρό
Μέγεθος εξωτερικής μνήμης RAM: 0
Μέγεθος στοίβας δεδομένων: 256
*******************************************************/
#περιλαμβάνω
#περιλαμβάνω
// Δηλώστε τις καθολικές μεταβλητές σας εδώ

Κενό κύριο (κενό)
{
// Δηλώστε τις τοπικές σας μεταβλητές εδώ

// Αρχικοποίηση θυρών εισόδου/εξόδου
// Αρχικοποίηση θύρας Β
// Συνάρτηση: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=Out
DDRB=(0<// Κατάσταση: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=0
PORTB=(0<

// Αρχικοποίηση θύρας C
// Συνάρτηση: Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In
DDRC=(0<// Κατάσταση: Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T
PORTC=(0<

// Αρχικοποίηση θύρας D
// Συνάρτηση: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In
DDRD=(0<// Κατάσταση: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T
PORTD=(0<

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

// Τιμή ρολογιού: Χρονοδιακόπτης 0 Σταμάτησε
TCCR0=(0<TCNT0=0x00;

// Αρχικοποίηση χρονοδιακόπτη/μετρητή 1
// Πηγή ρολογιού: Ρολόι συστήματος
// Τιμή ρολογιού: Timer1 Σταμάτησε
// Λειτουργία: Κανονική κορυφή=0xFFFF
// Έξοδος OC1A: Αποσυνδεδεμένη
// Έξοδος OC1B: Αποσυνδέθηκε
// Noise Canceller: Off
// Εισαγωγή λήψης στο Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Σύγκριση Διακοπή αγώνα: Απενεργοποίηση
// Σύγκριση B Διακοπή αγώνα: Απενεργοποίηση
TCCR1A=(0<TCCR1B=(0<TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Αρχικοποίηση χρονοδιακόπτη/μετρητή 2
// Πηγή ρολογιού: Ρολόι συστήματος
// Τιμή ρολογιού: Timer2 Διακοπή
// Λειτουργία: Κανονική κορυφή=0xFF
// Έξοδος OC2: Αποσυνδεδεμένη
ASSR=0<TCCR2=(0<TCNT2=0x00;
OCR2=0x00;

// Timer(s)/Counter(s) Αρχικοποίηση διακοπής(ών).
TIMSK=(0<

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

// Αρχικοποίηση USART
// Η USART απενεργοποιήθηκε
UCSRB=(0<

// Αρχικοποίηση αναλογικού συγκριτή
// Αναλογικός Συγκριτής: Απενεργοποίηση
// Η θετική είσοδος του Αναλογικού Συγκριτή είναι
// συνδεδεμένο με τον ακροδέκτη AIN0
// Η αρνητική είσοδος του Αναλογικού Συγκριτή είναι
// συνδεδεμένο με τον ακροδέκτη AIN1
ACSR=(1<SFIOR=(0<

//Αρχικοποίηση ADC
//Το ADC απενεργοποιήθηκε
ADCSRA=(0<

// Αρχικοποίηση SPI
// SPI απενεργοποιημένο
SPCR=(0<

// Αρχικοποίηση TWI
// TWI απενεργοποιημένο
TWCR=(0<

Ενώ (1)
{


Δεν υπάρχει τίποτα ανησυχητικό εδώ· το έργο καθορίζει τους τρόπους λειτουργίας των θυρών, των χρονόμετρων, των διακοπών, του USART, του Αναλογικού Συγκριτή, του ADC, του SPI και των συνδεδεμένων βιβλιοθηκών. Εν ολίγοις, όλες οι παράμετροι που καθορίσαμε στον οδηγό, όλα εκτός από τις θύρες και το τσιπ, έχουν ρυθμιστεί από προεπιλογή. Θα γράψουμε τον κύριο βρόχο προγράμματος στο while (1) (κείμενο προγράμματος). Επειδή εργαζόμαστε με το PB0 (14 σκέλη), στον βρόχο προγράμματος θα γράψουμε:
ενώ (1)
{
PORTB.0=1;
καθυστέρηση_ms(1000);
PORTB.0=0;
καθυστέρηση_ms(1000);
}
Εδώ ρυθμίζουμε το PB0 ψηλά, περιμένουμε 1 δευτερόλεπτο και ρυθμίζουμε χαμηλά και μετά ο κύκλος επαναλαμβάνεται. Μην ξεχάσετε να συμπεριλάβετε τη βιβλιοθήκη στην αρχή του έργου #include . Το πρόγραμμα μας είναι έτοιμο!!! Όπως μπορείτε να δείτε, όλα είναι πολύ απλά. Τώρα επιλέξτε "Project" - "Build All". Εάν δεν έγιναν σφάλματα, θα δούμε την αναφορά του οδηγού:

Το μέγεθος του προγράμματός μας ήταν 198 byte και καταλάμβανε το 2,4% της μνήμης του micron.
Στη συνέχεια συναρμολογούμε το διάγραμμα:


Τώρα μεταβείτε στον φάκελο με το έργο μας, μεταβείτε στο φάκελο "Debug" και μετά "Exe", υπάρχει ένα αρχείο με επέκταση hex. Στην περίπτωσή μου είναι blink.hex.
Απομένει ένα τελευταίο βήμα. Αντιγράψτε αυτό το αρχείο στο φάκελο με το AvrDude. Ξεκινάμε ξανά τη γραμμή εντολών, πηγαίνουμε στον φάκελό μας. Εισαγάγετε τη γραμμή avrdude -C avrdude.conf -c avrisp -P COM13 -b 19200 -p m8 -U flash:w:blink.hex
Έτσι φαίνεται στην εικόνα:


Εάν όλα έχουν εισαχθεί σωστά, πατήστε "Enter"


Συγχαρητήρια! Η δουλειά τελείωσε, το LED θα πρέπει να αναβοσβήνει ευχάριστα για εσάς :)
Συμπέρασμα.
Εν κατακλείδι, θέλω να πω για το μειονέκτημα του προγραμματιστή που μοιάζει με Arduino, το CvAvr απλά δεν το υποστηρίζει. Έχοντας, για παράδειγμα, το AVRISP mkII στο χέρι, μπορείτε να αναβοσβήσετε τις ασφάλειες και να κατεβάσετε το πρόγραμμα απευθείας από το CodeVisionAvr. Παρεμπιπτόντως, ο προγραμματιστής homebrew αρνήθηκε επίσης να χρησιμοποιήσει τη γραφική διεπαφή AvrDude και εργάστηκε μόνο από τη γραμμή εντολών.
Κατάλαβα το CodeVisionAvr αρκετά γρήγορα· το Διαδίκτυο είναι γεμάτο μαθήματα κειμένου και βίντεο. Σε μερικές εβδομάδες κατάκτησα τη λειτουργία του υλικού PWM, των διακοπών, των χρονοδιακόπτων, της εργασίας με κουμπιά και της σύνδεσης μιας οθόνης γραφικών. Συγκεκριμένα, έπρεπε να κάνω μέρος του έργου μου: να οργανώσω ένα PWM υλικού 16-bit στο Atmega8, να συνδέσω 2 κουμπιά για να το ελέγξω και επίσης να εμφανίσω τους τρόπους λειτουργίας του σε μια οθόνη γραφικών, κάτι που έκανα με ευκολία :) Εδώ είναι ένα δυο φωτο:

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





Αποτελέσματα σε σύγκριση με το Arduino:
+ Η κατανόηση του CvArv δεν είναι δύσκολη γιατί υπάρχει ένας οδηγός δημιουργίας έργου.
+ Διαθεσιμότητα βιβλιοθηκών plug-in, υπάρχουν αρκετές.
+ Γρήγορη συλλογή.
+ Η δυνατότητα προσομοίωσης ενός έργου στο Proteus, καθώς και διόρθωσης σφαλμάτων χρησιμοποιώντας το ενσωματωμένο πρόγραμμα εντοπισμού σφαλμάτων.
+ Το μέγεθος του προγράμματος είναι αρκετές φορές μικρότερο. Το Standard Blink μας πήρε 198 Bytes, ένα παρόμοιο σκίτσο στο Arduino IDE 1084 Bytes + 2 KB bootloader.
+ Δυνατότητα υλοποίησης τρόπων λειτουργίας που δεν μπορούν να γίνουν στο Arduino. Για παράδειγμα, 16-bit PWM (γενικά, είναι δυνατό στο Arduino, αλλά μόνο με "πατερίτσες").
+ Η δυνατότητα χρήσης μικροελεγκτών ATtiny, ATmega για τα έργα σας όπου το Arduino θα ήταν περιττό.
- Ωστόσο, είναι καλύτερο για έναν αρχάριο να αρχίσει να κατέχει το MK με το Arduino.
- Η γλώσσα προγραμματισμού είναι διαφορετική από την επεξεργασία Arduino.
- Υπάρχουν ακόμα περισσότερες βιβλιοθήκες για το Arduino.
- Το CodeVisionAvr είναι ένα πρόγραμμα επί πληρωμή, υπάρχουν δωρεάν εκδόσεις με περιορισμούς.
Προγραμματίζοντας τον «γυμνό» μικροελεγκτή στο CodeVisionAvr, απέκτησα μεγάλη εμπειρία. Η μελέτη χρονομέτρων, καταχωρητών, τρόπων λειτουργίας, αρχιτεκτονικής, ανάγνωσης φύλλων δεδομένων θα αυξήσει τις δεξιότητές σας, θα διευρύνει τους ορίζοντές σας και θα ανοίξει νέες πτυχές της εργασίας με μικροελεγκτές.
Ως μπόνους, επισυνάπτω μερικές φωτογραφίες όταν κατάλαβα τη γραφική οθόνη LCD και έπαιξα λίγο.





ΥΣΤΕΡΟΓΡΑΦΟ. Υπάρχουν πολλά άλλα για τα οποία ήθελα να γράψω, αλλά αυτό δεν θα είναι μια κριτική, αλλά ένα τεράστιο άρθρο. Είμαι έτοιμος να απαντήσω σε ερωτήσεις της αρμοδιότητάς μου, ιδιωτικά ή με σχόλια. Μπορείτε να παρακολουθήσετε πολλά μαθήματα στο AVR.

Μπλουζα