Προγραμματισμός atmega8. Προγραμματισμός μικροελεγκτών AVR. Διασύνδεση MK σε λειτουργία προγραμματισμού

Για μεταφορά από υπολογιστή σε μικροελεγκτή χρειαζόμαστε USBasp και το πρόγραμμα AVRDUDE.Σήμερα υπάρχει μια μεγάλη ποικιλία προγραμματιστών σχεδιασμένων για προγραμματισμό Μικροελεγκτές AVR. Ανάμεσά τους μπορείτε να βρείτε πολλά σπιτικά, τα οποία δύσκολα μπορούν να ονομαστούν προγραμματιστές, αφού συνδέονται απευθείας στη θύρα COM χρησιμοποιώντας λίγες μόνο αντιστάσεις. Ωστόσο σύγχρονους υπολογιστέςκαι οι φορητοί υπολογιστές πρακτικά δεν είναι πλέον εξοπλισμένοι με θύρες COM, επομένως ένα από τα κύρια κριτήρια κατά την επιλογή ενός προγραμματιστή είναι η δυνατότητα σύνδεσής του με θύρα USB. Ο φθηνότερος, απλούστερος και πιο συνηθισμένος είναι ο προγραμματιστής USBasp. Μπορεί να αγοραστεί σε σχεδόν οποιοδήποτε κατάστημα ραδιοφώνου στο προσιτη τιμη. Το κόστος του είναι Κινεζικό ΔιαδίκτυοΤο κατάστημα κυμαίνεται από $1,5 έως $3.

Προγραμματιστής USBasp

Ο υπολογιστής επικοινωνεί με τον μικροελεγκτή χρησιμοποιώντας τον προγραμματιστή USBasp μέσω της θύρας USB και τα δεδομένα μεταδίδονται μέσω της διεπαφής SPI μικρό erial Π περιφερειακό Εγώ διεπαφή(σειριακή περιφερειακή διεπαφή). Για την επικοινωνία του MK με τον προγραμματιστή, χρησιμοποιούνται ειδικές ακίδες: MOSI, MISO, SCK, RESET, VCC, GND. Αν και SPI προϋποθέτει τη χρήση μόνο τριών ακίδων MOSI, MISO και SCK, αλλά θα χρησιμοποιήσουμε και τις έξι ακίδες.

Κατά την ανταλλαγή δεδομένων μέσω διεπαφής SPI Ο μικροελεγκτής μπορεί ταυτόχρονα είτε να λαμβάνει (MISO pin) είτε να μεταδίδει δεδομένα (MOSI pin). Η ρύθμιση του τρόπου λήψης ή μετάδοσης δεδομένων πραγματοποιείται με την εφαρμογή ενός συγκεκριμένου παλμού στον ακροδέκτη SCK.

Η υποδοχή προγραμματιστή, κατά κανόνα, έχει 10 ακίδες και συνδέεται με τον μικροελεγκτή χρησιμοποιώντας ένα καλώδιο 10 συρμάτων. Ωστόσο, είναι πιο βολικό να χρησιμοποιείτε καλώδια που διαθέτουν προσαρμογέα 6 ακίδων, καθώς σε αυτήν την περίπτωση είναι κατειλημμένοι όλοι οι ακροδέκτες. Για έναν σύνδεσμο δέκα ακίδων, ένας ακροδέκτης παραμένει ελεύθερος και τέσσερις ακίδες συνδέονται στο κοινό καλώδιο (GND).

Για να εντοπίσει ο υπολογιστής τον προγραμματιστή, πρέπει να εγκαταστήσετε το πρόγραμμα οδήγησης USBasp.

Μια φωτογραφία του προγραμματιστή που είναι συνδεδεμένος στον μικροελεγκτή ATmega8 φαίνεται παρακάτω.

Το μόνο μειονέκτημα ή, πιο σωστά, μικρή ταλαιπωρία αυτού του προγραμματιστή είναι ότι δεν υποστηρίζεται (χωρίς διάφορα κόλπα) από το Atmel Studio, επομένως πρέπει να χρησιμοποιήσετε πρόγραμμα τρίτων. Το πιο αποδεδειγμένο είναι το AVRDUDE.

Ρυθμίσεις

Τώρα δεν έχουμε παρά να ολοκληρώσουμε το τελευταίο βήμα. Εκκινήστε το πρόγραμμα AVRDUDE. Από προεπιλογή, ανοίγει η καρτέλα Πρόγραμμα. Στο κάτω μέρος του παραθύρου, στο μενού Ρυθμίσεις, επιλέξτε τον τύπο του προγραμματιστή usbasp. Επόμενος στην κατηγορία Μικροελεγκτήςεπιλέξτε τον μικροελεγκτή μας ATmega8. Παρακάτω στην κατηγορία Λάμψηκάντε κλικ στο εικονίδιο έλλειψης και στο μενού που ανοίγει, καθορίστε τη διαδρομή προς το μεταγλωττισμένο αρχείο με την επέκταση γοητεύω. Η διαδρομή προς το αρχείο και το ίδιο το αρχείο θα είναι ίδια όπως καθορίσαμε προηγουμένως στο .

Για να βεβαιωθείτε ότι ο προγραμματιστής έχει εντοπιστεί από το λειτουργικό σύστημα (το πρόγραμμα οδήγησης προγραμματιστή έχει εγκατασταθεί σωστά) και ότι είναι σωστά συνδεδεμένος στον μικροελεγκτή, κάντε κλικ στο κουμπί ΑΝΑΓΝΩΣΗ. Εάν δεν υπάρχουν σφάλματα, θα εμφανιστεί ένα παράθυρο με την καταχώρηση " Οι κυψέλες βαθμονόμησης της γεννήτριας έχουν διαβαστεί!».Και ο δεκαεξαδικός αριθμός θα εμφανιστεί στο επάνω παράθυρο. Κάθε MK έχει τον δικό του αριθμό.

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

Τώρα κάντε κλικ στο κουμπί Πρόγραμμα στην κατηγορία Λάμψη. Όταν το πρόγραμμα εγγραφεί με επιτυχία στο MK, εμφανίζεται ένα παράθυρο με την παρακάτω καταχώρηση.

Το αποτέλεσμα του εγγεγραμμένου ή, όπως λένε επίσης, προγράμματος υλικολογισμικού είναι ένα αναμμένο LED συνδεδεμένο στον ακροδέκτη PC0 του μικροελεγκτή μας.

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

Για να προγραμματίσετε ένα πρωτότυπο ( atmega 8) θα χρησιμοποιήσουμε τον προγραμματιστή USBASP. Μοιάζει με αυτό:

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

Η πρώτη ακίδα επισημαίνεται στον σύνδεσμο με ένα βέλος.


Αφού καταλάβαμε τον προγραμματιστή. Ας προχωρήσουμε στη συναρμολόγηση του κυκλώματος σε υλικό. Τοποθετούμε τον μικροελεγκτή σε ένα breadboard. Να σας υπενθυμίσω ότι το πρώτο σκέλος σημειώνεται στο MK με έναν μικρό κύκλο.

Το καθήκον είναι να συνδέσετε τις ακίδες του προγραμματιστή στις ακίδες "πέτρινης".

Συνδέουμε βραχυκυκλωτήρες στον σύνδεσμο 10 ακίδων. Χρησιμοποιούμε τις ακόλουθες ακίδες MOSI, RST, SCK, MISO, VTG (VCC), GND.

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

Συνδέουμε βραχυκυκλωτήρες στις ακόλουθες ακίδες:

  • VCC στην καρφίτσα 7 του MK.
  • SCK στην καρφίτσα 19 του MK.
  • MISO στην καρφίτσα 18 του MK.
  • MOSI στην καρφίτσα 17 του MK.
  • GND (ακίδα προγραμματιστή 10) στην ακίδα 8 του MK.
  • RST σε 1 ακίδα MK.

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

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

Εάν εκτελείτε Windows 7 ή νεότερη έκδοση, ενδέχεται να αντιμετωπίσετε κάποιες μικρές δυσκολίες. Τα προγράμματα οδήγησης για τον προγραμματιστή είναι αρκετά παλιά, οπότε δεν έχουν ψηφιακή υπογραφή. Όταν προσπαθείτε να εγκαταστήσετε ένα τέτοιο πρόγραμμα οδήγησης, το λειτουργικό σύστημα θα εμφανίσει κάτι σαν αυτό *

«Η ψηφιακή υπογραφή των οδηγών που απαιτείται για αυτής της συσκευής. Στο τελευταία αλλαγήεξοπλισμό ή λογισμικόένα εσφαλμένα υπογεγραμμένο ή κατεστραμμένο αρχείοή κακόβουλο λογισμικόάγνωστη προέλευση. (Κωδικός 52)».

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

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

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

Ας προχωρήσουμε στη συναρμολόγηση του κυκλώματος με το LED.

Για να αναβοσβήνουμε το υλικολογισμικό του μικροελεγκτή θα χρησιμοποιήσουμε το πρόγραμμα “avrdudeprog”. Βρίσκεται στο γενικό αρχείο.

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

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

Οι διαμορφωμένες ρυθμίσεις «εντολούν» το Atmega8A να εκτελέσει την εργασία του με την επιφύλαξη χρονισμού από τον εσωτερικό ταλαντωτή (συχνότητα χρονισμού 8 MHz). Για να τεθούν σε ισχύ οι ρυθμίσεις, πρέπει να κάνετε κλικ στο κουμπί "Προγραμματισμός". Αλλά πριν πατήσετε, ελέγξτε ξανά ότι όλα έχουν ρυθμιστεί σωστά.

Επιστρέψτε στη σελίδα «Πρόγραμμα».

Αφού έχουμε ήδη πει στο πρόγραμμα ποιον μικροελεγκτή θα αναβοσβήνουμε, επιλέγουμε το αρχείο υλικολογισμικού που γράψαμε στο τελευταίο μάθημα. Διαθέτει επέκταση HEX. Βρίσκεται στο φάκελο "Εντοπισμός σφαλμάτων".

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

Απολαμβάνουμε το αποτέλεσμα της δουλειάς μας :) Συνέχεια...

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

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

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

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

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

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

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

Υπάρχει επίσης CodeVision AVR Cείναι ένας πολύ δημοφιλής μεταγλωττιστής. Έγινε δημοφιλές λόγω της απλότητάς του. Πρόγραμμα εργασίαςΜπορείτε να το αποκτήσετε σε λίγα μόνο λεπτά - ο οδηγός κώδικα έναρξης βοηθάει πολύ σε αυτό, σφραγίζοντας πρότυπα για την προετοιμασία όλων των ειδών uarts. Για να είμαι ειλικρινής, το έχω κάπως καχύποπτο - μόλις χρειάστηκε να αποσυναρμολογήσω ένα πρόγραμμα που είχε γραφτεί από αυτόν τον μεταγλωττιστή, αποδείχθηκε ότι ήταν κάποιο χάλι και όχι κώδικας. Ένας τρομερός αριθμός περιττών κινήσεων και λειτουργιών, που οδήγησαν σε σημαντικό αριθμό κώδικα και αργή απόδοση. Ωστόσο, ίσως υπήρχε σφάλμα στο 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αυτή η προσέγγιση είναι βαθιά ξένη. Ως εκ τούτου, θα το κάνω με τον τρόπο μου, τα πάντα χρησιμοποιώντας στούντιο σημαίνει.

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


Αυτές είναι οι ρυθμίσεις για το έργο σας, ή μάλλον οι ρυθμίσεις για την αυτόματη δημιουργία ενός αρχείου δημιουργίας. Στην πρώτη σελίδα πρέπει απλώς να εισαγάγετε τη συχνότητα με την οποία θα λειτουργεί το 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) = HI(bauddivider);<

Τρομακτικός? Στην πραγματικότητα, υπάρχουν μόνο πέντε τελευταίες γραμμές πραγματικού κώδικα. Ολα όσα #καθορίζωΕίναι μια γλώσσα μακροεντολών προεπεξεργαστή. Σχεδόν τα ίδια πράγματα όπως στο 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. Ας μην παρασυρόμαστε λοιπόν από τεχνικές λεπτομέρειες.

Έγινε, ήρθε η ώρα να δούμε τι έγινε. Κάντε κλικ στο compile και ξεκινήστε την εξομοίωση (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 0x00000Mp 0x00000034 Jump +00000008: 940C0034 JMP 0x00000034 Jump +0000000A: 940C0034 JMP 0x00000034 Jump +00000000C: 940MP000C: 940MP00C 0000000E: 940C0034 JMP 0x000034 Jump +00000010: 940c0034 JMP 0x00000034 Jump +000012: 940c0034 JMP 0x000000003 0000034 Jump +00000016: 940C003 4 JMP 0x00000034 Jump +00000018: 940c0034 JMP 0x00000034 Jump +0000001a: 940MP00003 0000001c : 940C0034 JMP 0x00000034 Jump +0000001E: 940C0034 JMP 0x00000034 Jump +00000020: 940C0034 JMP 003000C MP 0x00000 034 Jump +00000024: 940C0034 JMP 0x00000034 Jump +00000026: 940C0034 JMP 0x00000034 Jump +000000034 Jump +000000034 Jump +000000034 Jump +000000028: 940C0034 JMP 0x00000034 Jump +00000026:

00000000: 940C002A JMP 0x00002A Jump +00000002: 940C0034 JMP 0x00000034 Jump +00000004: 940C0034 JMP 0x0000000C 000034 Jump +000008: 940C0034 JMP 0x00000034 Jump +0000000a: 940c0034 JMP 0x00000034 Jump +0000000C: 940c0003000 JMP0 : 940C0034 JMP 0x00000034 Jump +00000010: 940C0034 JMP 0x00000034 Jump +00000012: 940C0034 JMP 0x00000034 90MP00000C 034 Jump +00000016: 940C0034 JMP 0x00000034 Jump +00000018: 940C0034 JMP 0x00000034 Jump +0000001A: 940C003001 Jump +000000018 : 940C0034 JMP 0x00000034 Jump +0000001E: 940C0034 JMP 0x00000034 Jump +00000020: 940C0034 JMP 0x00000034 90MP00000C 03 4 Jump +00000024: 940C0034 JMP 0x00000034 Jump +00000026: 940C0034 JMP 0x00000034 Jump +00000028: 940C00304 JMP0

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

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

Καταγραφή αυτού του μηδενός στη διεύθυνση 0x3F Αν κοιτάξετε τη στήλη προβολής I/O, θα δείτε ότι η διεύθυνση 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 που διευκολύνει την πλοήγηση στον ιστότοπο και το φόρουμ μου.
Συζήτηση και λήψη,

Εργασία: Ας αναπτύξουμε ένα πρόγραμμα για τον έλεγχο ενός 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. "Οδηγός για προγραμματιστές συσκευών AVR"

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

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

Οι μικροελεγκτές είναι παντού. Μπορούν να βρεθούν σε ψυγεία, πλυντήρια, τηλέφωνα, εργοστασιακά μηχανήματα και σε μεγάλο αριθμό άλλων τεχνικών συσκευών. Οι μικροελεγκτές κυμαίνονται από απλούς έως εξαιρετικά σύνθετους. Τα τελευταία προσφέρουν σημαντικά περισσότερες δυνατότητες και λειτουργικότητα. Αλλά δεν θα είστε σε θέση να κατανοήσετε τη σύνθετη τεχνολογία αμέσως. Αρχικά, πρέπει να μάθετε κάτι απλό. Και το Atmega8 θα ληφθεί ως δείγμα. Ο προγραμματισμός σε αυτό δεν είναι δύσκολος χάρη στην ικανή αρχιτεκτονική και τη φιλική του διεπαφή. Επιπλέον, έχει επαρκή απόδοση για χρήση στα περισσότερα Επιπλέον, χρησιμοποιούνται ακόμη και στη βιομηχανία. Στην περίπτωση του Atmega8, ο προγραμματισμός απαιτεί γνώση γλωσσών όπως το AVR (C/Assembler). Από πού να αρχίσω? Η εκμάθηση αυτής της τεχνολογίας είναι δυνατή με τρεις τρόπους. Και ο καθένας επιλέγει μόνος του πού να αρχίσει να εργάζεται με το Atmega8:

  1. Προγραμματισμός μέσω Arduino.
  2. Αγορά έτοιμης συσκευής.
  3. Αυτοσυναρμολόγηση μικροελεγκτή.

Θα εξετάσουμε το πρώτο και το τρίτο σημείο.

Arduino

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

  1. Απαιτήσεις χαμηλού ορίου. Δεν χρειάζεται να έχετε ειδικές δεξιότητες για να αναπτύξετε τεχνικές συσκευές.
  2. Ένα ευρύ φάσμα στοιχείων θα είναι διαθέσιμο για σύνδεση χωρίς πρόσθετη προετοιμασία.
  3. Γρήγορη έναρξη ανάπτυξης. Με το Arduino μπορείτε να μεταβείτε κατευθείαν στη δημιουργία συσκευών.
  4. Διαθεσιμότητα μεγάλου αριθμού εκπαιδευτικού υλικού και παραδείγματα υλοποιήσεων διαφόρων σχεδίων.

Υπάρχουν όμως και ορισμένα μειονεκτήματα. Έτσι, ο προγραμματισμός Arduino Atmega8 δεν σας επιτρέπει να βουτήξετε βαθύτερα στον κόσμο του μικροελεγκτή και να κατανοήσετε πολλές χρήσιμες πτυχές. Επιπλέον, θα πρέπει να μάθετε μια γλώσσα προγραμματισμού, η οποία διαφέρει από αυτές που χρησιμοποιεί το AVR (C/Assembler). Και κάτι ακόμα: Το Arduino έχει μια αρκετά στενή γκάμα μοντέλων. Επομένως, αργά ή γρήγορα θα υπάρξει ανάγκη χρήσης μικροελεγκτή, ο οποίος δεν χρησιμοποιείται σε πλακέτες. Αλλά γενικά, αυτή είναι μια καλή επιλογή για εργασία με το Atmega8. Ο προγραμματισμός μέσω Arduino θα σας δώσει ένα σίγουρο ξεκίνημα στον κόσμο των ηλεκτρονικών. Και ένα άτομο είναι απίθανο να τα παρατήσει λόγω αποτυχιών και προβλημάτων.

Αυτοσυναρμολόγηση

Χάρη στον φιλικό σχεδιασμό, μπορείτε να τα φτιάξετε μόνοι σας. Εξάλλου, αυτό απαιτεί φθηνά, οικονομικά και απλά εξαρτήματα. Αυτό θα σας επιτρέψει να μελετήσετε διεξοδικά τη σχεδίαση του μικροελεγκτή Atmega8, ο προγραμματισμός του οποίου μετά τη συναρμολόγηση θα φαίνεται ευκολότερος. Επίσης, εάν είναι απαραίτητο, μπορείτε να επιλέξετε ανεξάρτητα άλλα στοιχεία για μια συγκεκριμένη εργασία. Είναι αλήθεια ότι υπάρχει ένα συγκεκριμένο μειονέκτημα εδώ - πολυπλοκότητα. Δεν είναι εύκολο να συναρμολογήσεις έναν μικροελεγκτή μόνος σου όταν δεν έχεις τις απαραίτητες γνώσεις και δεξιότητες. Θα εξετάσουμε αυτήν την επιλογή.

Τι χρειάζεται για τη συναρμολόγηση;

Πρώτα πρέπει να πάρετε το ίδιο το Atmega8. Ο προγραμματισμός ενός μικροελεγκτή χωρίς αυτόν, ξέρετε, είναι αδύνατος. Θα κοστίσει αρκετές εκατοντάδες ρούβλια - παρέχοντας παράλληλα αξιοπρεπή λειτουργικότητα. Υπάρχει επίσης το ερώτημα πώς θα προγραμματιστεί το Atmega8. Το USBAsp είναι μια αρκετά καλή συσκευή που έχει αποδειχθεί πολύ καλή. Αλλά μπορείτε να χρησιμοποιήσετε κάποιον άλλο προγραμματιστή. Ή συναρμολογήστε το μόνοι σας. Αλλά σε αυτή την περίπτωση, υπάρχει ο κίνδυνος αν δημιουργηθεί κακώς, να μετατρέψει τον μικροελεγκτή σε ένα μη λειτουργικό κομμάτι πλαστικού και σιδήρου. Επίσης, δεν θα έβλαπτε να έχετε breadboard και jumpers. Δεν απαιτούνται, αλλά θα σας εξοικονομήσουν νεύρα και χρόνο. Και τέλος, χρειάζεστε μια πηγή ρεύματος 5 V.

Προγραμματισμός Atmega8 για αρχάριους χρησιμοποιώντας ένα παράδειγμα

Ας δούμε πώς, σε γενικές γραμμές, δημιουργείται μια συσκευή. Λοιπόν, ας πούμε ότι έχουμε έναν μικροελεγκτή, ένα LED, μια αντίσταση, έναν προγραμματιστή, καλώδια σύνδεσης και ένα τροφοδοτικό. Το πρώτο βήμα είναι η εγγραφή του υλικολογισμικού. Εννοείται ως ένα σύνολο εντολών για τον μικροελεγκτή, το οποίο παρουσιάζεται ως τελικό αρχείο σε ειδική μορφή. Είναι απαραίτητο να προσδιορίσετε τη σύνδεση όλων των στοιχείων, καθώς και την αλληλεπίδραση μαζί τους. Μετά από αυτό, μπορείτε να ξεκινήσετε τη συναρμολόγηση του κυκλώματος. Ο ακροδέκτης VCC πρέπει να τροφοδοτείται. Σε οποιοδήποτε άλλο, σχεδιασμένο για να λειτουργεί με συσκευές και στοιχεία, συνδέεται πρώτα μια αντίσταση και μετά ένα LED. Σε αυτή την περίπτωση, η ισχύς του πρώτου εξαρτάται από τις απαιτήσεις ισχύος του δεύτερου. Μπορείτε να χρησιμοποιήσετε τον ακόλουθο τύπο: R=(Up-Ups)/Is. Εδώ το p είναι η ισχύς και το s το LED. Ας φανταστούμε ότι έχουμε ένα LED που καταναλώνει 2V και απαιτεί ρεύμα τροφοδοσίας 10 mA, μετατρέψτε το σε μια μορφή πιο βολική για μαθηματικές πράξεις και πάρτε 0,01A. Τότε ο τύπος θα μοιάζει με αυτό: R=(5V-2V)/0.01A=3V/0.01A=300 Ohm. Αλλά στην πράξη είναι συχνά αδύνατο να επιλέξετε το ιδανικό στοιχείο. Επομένως, λαμβάνεται το καταλληλότερο. Αλλά πρέπει να χρησιμοποιήσετε μια αντίσταση με αντίσταση μεγαλύτερη από την τιμή που λαμβάνεται μαθηματικά. Χάρη σε αυτήν την προσέγγιση, θα παρατείνουμε τη διάρκεια ζωής του.

Τι έπεται?

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

Σημαντικά σημεία

Θα ήθελα να δώσω στους αρχάριους χρήσιμες συμβουλές σχετικά με τον προγραμματισμό του Atmega8. Μην αλλάζετε ενσωματωμένες μεταβλητές και συναρτήσεις! Συνιστάται να αναβοσβήσετε τη συσκευή με το πρόγραμμα που δημιουργήθηκε αφού την ελέγξετε για απουσία «αιώνιων βρόχων», που θα εμποδίσουν οποιαδήποτε άλλη παρεμβολή και χρησιμοποιώντας έναν καλό πομπό. Εάν χρησιμοποιείτε ένα σπιτικό προϊόν για αυτούς τους σκοπούς, θα πρέπει να είστε διανοητικά προετοιμασμένοι για την αποτυχία του μικροελεγκτή. Όταν φλας μια συσκευή χρησιμοποιώντας προγραμματιστή, θα πρέπει να συνδέσετε τις αντίστοιχες εξόδους VCC, GND, SCK, MOSI, RESET, MISO. Και μην παραβιάζετε τα μέτρα ασφαλείας! Εάν οι τεχνικές προδιαγραφές ορίζουν ότι η παροχή ρεύματος πρέπει να είναι 5V, τότε πρέπει να τηρείτε ακριβώς αυτήν την τάση. Ακόμη και η χρήση στοιχείων 6V μπορεί να επηρεάσει αρνητικά την απόδοση του μικροελεγκτή και να μειώσει τη διάρκεια ζωής του. Φυσικά, οι μπαταρίες 5V έχουν ορισμένες διαφορές, αλλά, κατά κανόνα, όλα είναι εντός λογικών ορίων. Για παράδειγμα, η μέγιστη τάση θα διατηρηθεί στα 5,3 V.

Εκπαίδευση και βελτίωση δεξιοτήτων

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

Είναι δύσκολο να ξεκινήσετε να δημιουργείτε κάτι δικό σας;

Αρκεί να έχετε 500-2000 ρούβλια και μερικά δωρεάν βράδια. Αυτή η φορά είναι υπεραρκετή για να εξοικειωθείτε με την αρχιτεκτονική Atmega8. Μετά από λίγη εξάσκηση, μπορείτε εύκολα να δημιουργήσετε τα δικά σας έργα που εκτελούν συγκεκριμένες εργασίες. Για παράδειγμα, ένας ρομποτικός βραχίονας. Το Atmega8 από μόνο του θα πρέπει να είναι περισσότερο από αρκετό για να μεταφέρει τις βασικές κινητικές λειτουργίες των δακτύλων και του χεριού. Φυσικά, αυτό είναι ένα αρκετά δύσκολο έργο, αλλά είναι αρκετά εφικτό. Στο μέλλον, θα είναι δυνατή η δημιουργία πολύπλοκων πραγμάτων που θα απαιτούν δεκάδες μικροελεγκτές. Αλλά όλα αυτά είναι μπροστά, πριν από αυτό πρέπει να αποκτήσετε μια καλή σχολή πρακτικής σε κάτι απλό.