Διαδικασία προγραμματισμού μικροελεγκτών avr. Συμβουλές για αρχάριους προγραμματιστές μικροελεγκτών. Απαιτούμενο σύνολο προγραμμάτων

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

Υπάρχουν δύο τύποι (το EEPROM δεν μετράει αφού είναι γενικά περιφερειακό, αλλά περισσότερα για αυτό αργότερα):

  • RAM - RAM
  • ROM - ROM, aka flash, aka μνήμη προγράμματος

Εφόσον η αρχιτεκτονική μας είναι το Χάρβαρντ, το operative έχει τη δική του διεύθυνση και το flash έχει τη δική του. Στο φύλλο δεδομένων μπορείτε να δείτε τη δομή διευθύνσεων RAM.

Προσοχή στις διευθύνσεις αμέσως! Οι καταχωρητές RON και περιφερειακοί, καθώς και η μνήμη RAM βρίσκονται στον ίδιο χώρο διευθύνσεων. Εκείνοι. διευθύνσεις από 0000 έως 001F καταλαμβάνουν τους καταχωρητές μας, μετά μέχρι τη διεύθυνση 005F υπάρχουν κελιά I/O - θύρες. Μέσω των θυρών, ρυθμίζονται όλα όσα βρίσκονται στο χειριστήριο. Και μόνο τότε, από τη διεύθυνση 0060 προέρχεται η μνήμη RAM μας, την οποία μπορούμε να χρησιμοποιήσουμε για τον προορισμό της.

Επιπλέον, σημειώστε ότι οι καταχωρητές I/O έχουν επίσης τη δική τους διεύθυνση - ο χώρος διευθύνσεων των καταχωρητών I/O (από 00 έως 3F), υποδεικνύεται στην αριστερή πλευρά του σχήματος. IO/Register Block Αυτή η διευθυνσιοδότηση λειτουργεί ΜΟΝΟ σε οδηγίες OUT και IN. Αυτό οδηγεί σε ένα ενδιαφέρον χαρακτηριστικό.

Οι περιφερειακοί καταχωρητές μπορούν να έχουν πρόσβαση με δύο διαφορετικούς τρόπους:

  • Μέσω εντολών IN/OUT σε μια σύντομη διεύθυνση στο χώρο διευθύνσεων I/O
  • Μέσω μιας ομάδας εντολών LOAD/STORE σε μια πλήρη διεύθυνση στο χώρο διευθύνσεων RAM

Παράδειγμα. Ας πάρουμε τον καταχωρητή εισόδου του ασύγχρονου πομποδέκτη UDR· έχει τη διεύθυνση 0x0C (0x2C)· η διεύθυνση στο γενικό χώρο διευθύνσεων υποδεικνύεται σε αγκύλες.

LDI R18.10; Φορτώσαμε τον αριθμό 10 στον καταχωρητή R18. Ακριβώς όπως αυτό OUT UDR,R18 ; Συνάγεται με τον πρώτο τρόπο, ο ίδιος ο μεταγλωττιστής. Αντικαθιστά την τιμή 0x0C αντί για UDR STS 0x2C,R18 ; Με έβγαλαν με τον δεύτερο τρόπο. Μέσω της εντολής Store. Εισάγοντας απευθείας τη διεύθυνση.

Και οι δύο μέθοδοι δίνουν τα ίδια αποτελέσματα. ΑΛΛΑ! Αυτά που λειτουργούν με διευθυνσιοδότηση στο χώρο εισόδου/εξόδου (OUT/IN) είναι δύο byte μικρότερα. Αυτό είναι κατανοητό - δεν χρειάζεται να αποθηκεύουν τη διεύθυνση δύο byte ενός αυθαίρετου κελιού μνήμης και η σύντομη διεύθυνση του χώρου εισόδου-εξόδου ταιριάζει στον κώδικα εντολών δύο byte.

Είναι αλήθεια ότι υπάρχει ένα άλλο αστείο εδώ. Γεγονός είναι ότι κάθε χρόνο εμφανίζονται όλο και περισσότερες πέτρες από το AVR και υπάρχει όλο και περισσότερο κρέας σε αυτές. Και κάθε κροτάλισμα χρειάζεται τους δικούς του περιφερειακούς καταχωρητές I/O. Και τώρα, καταλήξαμε στο συμπέρασμα ότι το ATMega88 (το οποίο αντικατέστησε το Mega8) έχει ήδη τόσα πολλά περιφερειακά που οι καταχωρητές I/O του δεν χωρούν πλέον στο όριο του χώρου διευθύνσεων 3F.

Ωχ, έφτασαν. Και εδώ είναι όπου όσοι αλλάζουν από παλιές πέτρες σε νέες αρχίζουν να εκφράζουν μπερδεμένες εκφράσεις - γιατί οι εντολές OUT/IN λειτουργούν σε ορισμένους περιφερειακούς καταχωρητές, αλλά όχι σε άλλους;

Και είναι απλό - δεν υπήρχε αρκετή χωρητικότητα bit.

Αλλά ο πυρήνας είναι ένας, δεν μπορεί πλέον να ξαναφτιάχνεται. Και εδώ οι άνθρωποι της ATMEL ενήργησαν πονηρά - εισήγαγαν τους λεγόμενους καταχωρητές με χαρτογράφηση μνήμης. Εκείνοι. όλα αυτά τα μητρώα που δεν χωρούσαν στο όριο των 3F είναι τώρα διαθέσιμα μόνο με έναν τρόπο - μέσω Load/Store.

Τι αστείο. Εάν ανοίξετε κάποιο m88def.inc, τότε μπορείτε να δείτε ποιοι από τους καταχωρητές εισόδου/εξόδου είναι "σωστοί" και ποιοι έχουν αντιστοιχιστεί στη μνήμη.

Θα υπάρξει κάτι σαν αυτό:

; ***** I/O ΟΡΙΣΜΟΙ ΕΓΓΡΑΦΗΣ ******************************************** ******** * ; ΣΗΜΕΙΩΣΗ: ; Οι ορισμοί με την ένδειξη "MEMORY MAPPED" είναι εκτεταμένες θύρες I/O. και δεν μπορεί να χρησιμοποιηθεί με οδηγίες IN/OUT .equ UDR0 = 0xc6 ; ΜΝΗΜΗ ΧΑΡΤΟΓΡΑΦΗΜΕΝΗ .equ UBRR0L = 0xc4 ; ΧΑΡΤΟΓΡΑΦΗΜΕΝΗ ΜΝΗΜΗ .equ UBRR0H = 0xc5 ; MEMORY MAPPED .equ UCSR0C = 0xc2 ; ΜΝΗΜΗ ΧΑΡΤΟΓΡΑΦΗΜΕΝΗ .equ UCSR0B = 0xc1 ; ΜΝΗΜΗ ΧΑΡΤΟΓΡΑΦΗΜΕΝΗ .equ UCSR0A = 0xc0 ; ΧΑΡΤΟΓΡΑΦΗΜΕΝΗ ΜΝΗΜΗ μπλα μπλα μπλα, και πολλά άλλα.equ OSCCAL = 0x66 ; MEMORY MAPPED .equ PRR = 0x64 ; ΧΑΡΤΟΓΡΑΦΗΜΕΝΗ ΜΝΗΜΗ .equ CLKPR = 0x61 ; MEMORY MAPPED .equ WDTCSR = 0x60 ; ΧΑΡΤΟΓΡΑΦΗΜΕΝΗ ΜΝΗΜΗ .equ SREG = 0x3f ;<------ А тут пошли обычные.equ SPL = 0x3d .equ SPH = 0x3e .equ SPMCSR = 0x37 .equ MCUCR = 0x35 .equ MCUSR = 0x34 .equ SMCR = 0x33 .equ ACSR = 0x30

Αυτές είναι οι πίτες.

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

Ωστόσο, υπάρχει λύση. Μακρογλώσσα! Δεν σας αρέσει το σύστημα εντολών; Φτιάξτε το δικό σας με blackjack και πόρνες!
Ας φτιάξουμε τη δική μας ομάδα UOUT, σαν ένα καθολικό OUT

Ομοίως για την εντολή IN. Γενικά, με τέτοιες μακροεντολές μπορείτε να διαφοροποιήσετε ΠΟΛΥ το assembler, μετατρέποντάς το σε μια ισχυρή γλώσσα προγραμματισμού που μπορεί να διαλύσει όλα τα είδη C και Pascal σαν κουρέλι.

Λοιπόν, τι μιλάω για τη μνήμη RAM.

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

Και στον κώδικά μας η μνήμη RAM ξεκινά με την οδηγία.DSEG Θυμάστε το πρότυπό μας;

Συμπεριλάβετε το "m16def.inc" ; Χρησιμοποιούμε ATMega16 ;= Έναρξη macro.inc ===================================================== ; Μακροεντολές εδώ;= Τέλος macro.inc ================================== ; RAM ================================================== ============= .DSEG ; Τμήμα RAM; FLASH ================================================= ========== .CSEG ; Τμήμα κώδικα; EEPROM ================================================= ======== .ESEG ; Τμήμα EEPROM

Μετά το .DSEG μπορούμε να ορίσουμε τις μεταβλητές μας. Και εδώ έχουμε απλώς μια έκρηξη κελιών - καταλαμβάνουν οποιοδήποτε. Πληκτρολογήστε τη διεύθυνση και να είστε χαρούμενοι. Αλλά γιατί να μετράμε τις διευθύνσεις χειροκίνητα; Αφήστε τον μεταγλωττιστή να σκεφτεί εδώ.

Επομένως, θα πάρουμε και θα ορίσουμε μια ετικέτα

0x0060 ## ;Μεταβλητές 0x0061 ## 0x0062 ## 0x0063 ## ;Variables2 0x0064 ## 0x0065 ## ;Variables4 θα μπορούσαν να ξεκινήσουν εδώ

Ως ## οποιοδήποτε byte. Από προεπιλογή FF. Φυσικά, δεν χρειάζεται να μιλήσουμε για καμία πληκτρολόγηση μεταβλητών, αρχική αρχικοποίηση, έλεγχο υπερχείλισης και άλλες αστικές χαρές. Εδώ είναι Σπάρτη! Δηλαδή, συναρμολογητής. Όλα με το χέρι.
Αν σχεδιάσουμε μια αναλογία με το C, τότε είναι σαν να δουλεύουμε με τη μνήμη μόνο μέσω κενών δεικτών. Ο Σίσνικς θα καταλάβει. Θα καταλάβουν και θα τρομοκρατηθούν. Επειδή αυτός ο κόσμος είναι σκληρός και προδοτικός. Υπολόγισα λίγο λάθος τον δείκτη και έχασα άλλα δεδομένα. Και θα καταλάβετε αυτό το σφάλμα αν δεν εμφανιστεί αμέσως.

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

Η οδηγία .ORG λειτουργεί επίσης στο τμήμα δεδομένων.Λειτουργεί ακριβώς με τον ίδιο τρόπο - μεταφέρει διευθύνσεις, σε αυτήν την περίπτωση σήματα, από εδώ στο τέλος της μνήμης. Μόνο μια λεπτότητα - το ORG 0000 θα μας δώσει την αρχή της μνήμης RAM, και αυτό είναι το R0 και άλλοι καταχωρητές. Και το μηδέν χιλιόμετρο μνήμης RAM χρησιμοποιώντας το Mega16 ως παράδειγμα θα δώσει το ORG 0x0060. Και σε άλλους ελεγκτές υπάρχει κάποια άλλη αξία. Είναι τεμπέλικο να περνάτε από το φύλλο δεδομένων κάθε φορά, επομένως υπάρχει ένας τέτοιος ορισμός μακροεντολών όπως SRAM_START, ο οποίος υποδεικνύει την έναρξη της μνήμης RAM για ένα συγκεκριμένο MK.

Αν λοιπόν θέλουμε η αρχή της μνήμης RAM, ας πούμε 100 byte, να μείνει κάτω από κάποιου είδους buffer σκουπιδιών, τότε κάνουμε αυτό το κόλπο.

1 2 3 4 .DSEG .ORG SRAM_START+100 Μεταβλητές: .byte 3

DSEG .ORG SRAM_START+100 Μεταβλητές: .byte 3

Τελειώσαμε, καθαρίσαμε τη ζώνη ασφαλείας μας από την αρχή έως το 100.

Εντάξει, τακτοποιήσαμε τη διεύθυνση. Πώς να εργαστείτε με κύτταρα μνήμης; Και για αυτούς τους σκοπούς υπάρχουν δύο ομάδες εντολών. Το LOAD και το STORE είναι η μεγαλύτερη ομάδα εντολών.

Το γεγονός είναι ότι τίποτα δεν μπορεί να γίνει με ένα κελί RAM εκτός από τη φόρτωση ενός byte σε αυτό από το RON ή την εκφόρτωση ενός byte από αυτό στο RON.

Οι εντολές αποθήκευσης (ST**) εγγράφονται στη μνήμη RAM και οι εντολές Load (LD**) διαβάζονται.

Η ανάγνωση πηγαίνει στην εγγραφή R16…R31 και η διεύθυνση κελιού καθορίζεται είτε απευθείας στην εντολή. Εδώ είναι ένα απλό παράδειγμα. Υπάρχει μια μεταβλητή Variables τριών byte, πρέπει να αυξηθεί κατά 1. Δηλαδή. εκτελέστε τη λειτουργία Variables++

Μεταβλητές DSEG: .byte 3 Variables2: .byte 1 .CSEG ; Η μεταβλητή βρίσκεται στη μνήμη· πρώτα πρέπει να την αποκτήσετε. LDS R16, Μεταβλητές ; Διαβάστε το πρώτο byte Variables στο R16 LDS R17, Variables+1 ; Διαβάστε το δεύτερο byte Variables στο R17 LDS R18, Variables+2 ; Λοιπόν, το τρίτο byte στο R18. Τώρα ας προσθέσουμε 1 σε αυτό, γιατί Το AVR δεν μπορεί να προσθέσει με σταθερά, μόνο. για να αφαιρέσεις, πρέπει να παραμορφώσεις. Ωστόσο, δεν προκαλεί ιδιαίτερα προβλήματα. SUBI R16,(-1) ; Σε γενικές γραμμές, το SUBI είναι μια αφαίρεση, αλλά το -(- δίνει + SBCI R17,(-1) ; Και εδώ λαμβάνεται υπόψη η μεταφορά. Αλλά περισσότερα για αυτό αργότερα. SBCI R18,(-1) ; Τα μαθηματικά στο assembler είναι ένα διαφορετική ιστορία STS Variables, R16 ; Αποθήκευση όλων είναι όπως ήταν. STS Variables+1,R17 STS Variables+2,R18

Ή μπορείτε να χρησιμοποιήσετε άλλη μέθοδο. Έμμεση καταγραφή μέσω καταχωρητή ευρετηρίου.

Μεταβλητές DSEG: .byte 3 Variables2: .byte 1 .CSEG ; Πάρτε τη διεύθυνση της μεταβλητής μας LDI YL,low(Variables) LDI YH,High(Variables) ; Η μεταβλητή βρίσκεται στη μνήμη· πρώτα πρέπει να την αποκτήσετε. LD R16, Υ+; Διαβάστε το πρώτο byte Μεταβλητών στο R16 LD R17, Y+ ; Διαβάστε το δεύτερο byte μεταβλητών στο R17 LD R18, Y+ ; Λοιπόν, το τρίτο byte στο R18. Τώρα ας προσθέσουμε 1 σε αυτό, γιατί Το AVR δεν μπορεί να προσθέσει με σταθερά, μόνο. για να αφαιρέσεις, πρέπει να παραμορφώσεις. Ωστόσο, δεν προκαλεί ιδιαίτερα προβλήματα. SUBI R16,(-1) ; Στην πραγματικότητα το SUBI είναι μια αφαίρεση, αλλά το -(- δίνει + SBCI R17,(-1) ; Και εδώ λαμβάνεται υπόψη η μεταφορά. Αλλά περισσότερα για αυτό αργότερα. SBCI R18,(-1) ; Τα μαθηματικά στο assembler είναι μια διαφορετική ιστορία ST -Y,R18; Διατηρούμε τα πάντα όπως ήταν. ST -Y,R17; Αλλά με αντίστροφη σειρά ST -Y,R16

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

Είναι βολικό να χρησιμοποιείτε τέτοιες αυξητικές εντολές για επανάληψη σε πίνακες στη μνήμη ή στους πίνακες.
Και υπάρχει επίσης μια έμμεση σχετική εγγραφή/ανάγνωση LDD/STD και άλλες επιλογές και για τους τρεις τύπους ευρετηρίων (X,Y,Z). Σε γενικές γραμμές, καπνίστε το φύλλο δεδομένων και το σύστημα εντολών.

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

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

Λοιπόν, σχετικά με τη στοίβα. Τι είναι? Και αυτή είναι η περιοχή μνήμης. Λειτουργεί με βάση την αρχή μιας στοίβας. Εκείνοι. Το τελευταίο που έβαλε κάτω, πήρε το πρώτο.

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

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

Αυτό γίνεται με αυτόν τον τρόπο, στην αρχή του προγράμματος:

1 2 3 4 5 LDI R16, Low(RAMEND) OUT SPL,R16 LDI R16,High(RAMEND) OUT SPH,R16

LDI R16, Low(RAMEND) OUT SPL,R16 LDI R16,High(RAMEND) OUT SPH,R16

Όπου RAMEND είναι ένας ορισμός μακροεντολών που υποδεικνύει το τέλος της μνήμης RAM στο τρέχον MK.

Αυτό είναι όλο, η στοίβα είναι έτοιμη. Τα δεδομένα προωθούνται στη στοίβα χρησιμοποιώντας την εντολή PUSH Rn και ανακτώνται μέσω POP Rn.
Το Rn είναι οποιοδήποτε από τα RON.

Οι εντολές CALL, RCALL, ICALL, RET, RETI και η κλήση διακοπής λειτουργούν επίσης με τη στοίβα, αλλά περισσότερα για αυτό αργότερα.

Ας παίξουμε με τη στοίβα για να νιώσουμε πώς λειτουργεί, για να καταλάβουμε πώς και πού κινείται.

Εισαγάγετε τον παρακάτω κωδικό στο στούντιο:

CSEG; Τμήμα κωδικού LDI R16, Low(RAMEND) ; Αρχικοποίηση στοίβας OUT SPL,R16 LDI R16,High(RAMEND) OUT SPH,R16 LDI R17,0 ; Τιμές φόρτωσης LDI R18.1 LDI R19.2 LDI R20.3 LDI R21.4 LDI R22.5 LDI R23.6 LDI R24.7 LDI R25.8 LDI R26.9 PUSH R17; Βάζουμε τις τιμές στη στοίβα PUSH R18 PUSH R19 PUSH R20 PUSH R21 PUSH R22 PUSH R23 PUSH R24 PUSH R25 PUSH R26 POP R0 ; Pop τιμές από τη στοίβα POP R1 POP R2 POP R3 POP R4 POP R5 POP R6 POP R7 POP R8 POP R9

Τώρα τρέξτε το στούντιο βήμα προς βήμα και παρακολουθήστε πώς αλλάζει το SP. Μπορείτε να δείτε το Stack Pointer στο στούντιο στο ίδιο μέρος με το Program Counter.

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

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

PUSH R16 PUSH R17 POP R16 POP R17

Για παράδειγμα, έχω ήδη μιλήσει για τον περιορισμό των χαμηλότερων RON - δεν σας επιτρέπουν να γράψετε έναν αριθμό απευθείας στον εαυτό σας. Μόνο μέσω των μητρώων της ανώτερης ομάδας. Αλλά αυτό είναι άβολο!

Το πρόβλημα επιλύεται χρησιμοποιώντας μια μακροεντολή. Το έλεγα LDIL - LDI low

MACRO LDIL PUSH R17; Ας αποθηκεύσουμε την τιμή ενός από τους υψηλότερους καταχωρητές στη στοίβα. LDI R17,@1 ; Ας φορτώσουμε την άμεση αξία μας MOV @0,R17 σε αυτό. Ας μεταφέρουμε την τιμή στο μητρώο της χαμηλής ομάδας. POP R17; Ας επαναφέρουμε την τιμή του υψηλότερου καταχωρητή από τη στοίβα. .ENDM

Τώρα μπορείτε εύκολα να χρησιμοποιήσετε την εντολή homemade μας.

1 LDIL R0.18

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

Σφάλματα στοίβας
Η στοίβα μεγαλώνει προς τα δεδομένα και τώρα φανταστείτε ότι έχουμε μια μεταβλητή κατάστασης στη μνήμη και βρίσκεται στη διεύθυνση, για παράδειγμα, 0x0450. Επικίνδυνα κοντά στην κορυφή της στοίβας. Η μεταβλητή αποθηκεύει, για παράδειγμα, την κατάσταση της μηχανής πεπερασμένης κατάστασης από την οποία εξαρτάται η περαιτέρω λογική του προγράμματος. Ας πούμε αν είναι 3, τότε πάμε να κάνουμε ένα πράγμα, αν είναι 4 τότε κάτι άλλο, αν είναι 5 τότε κάτι άλλο και ούτω καθεξής μέχρι 255 καταστάσεις. Και σύμφωνα με τη λογική της δουλειάς, μετά το 3 πρέπει να υπάρχουν 4re, αλλά όχι 10

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

Ή το αντίθετο παράδειγμα - η στοίβα προωθήθηκε στις μεταβλητές, αλλά εκείνη τη στιγμή οι μεταβλητές ενημερώθηκαν και αντικατέστησαν τα δεδομένα της στοίβας. Ως αποτέλεσμα, αφαιρέθηκε κάτι λάθος από τη στοίβα (συνήθως λανθασμένες διευθύνσεις επιστροφής) και το πρόγραμμα διακόπηκε. Αυτή η επιλογή, παρεμπιπτόντως, είναι πολύ πιο ακίνδυνη, επειδή... σε αυτή την περίπτωση, το τζάμπ φαίνεται αμέσως και δεν αναδύεται ΞΑΦΝΙΚΑ αφού ένας Θεός ξέρει πόσο καιρό.

Επιπλέον, αυτό το σφάλμα μπορεί να εμφανιστεί και να εξαφανιστεί. Ανάλογα με το πώς λειτουργεί το πρόγραμμα και πόσο βαθιά φορτώνει τη στοίβα. Ωστόσο, ένας τέτοιος δυσμενής είναι πιο συνηθισμένος όταν γράφετε σε C, όπου δεν μπορείτε να δείτε πόσο ενεργά γίνεται η εργασία με τη στοίβα. Στην ASMA όλα είναι πολύ πιο διαφανή. Και εδώ αυτό μπορεί να προκύψει λόγω ενός ειλικρινά λανθασμένου αλγορίθμου.

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

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

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

Στοίβα παραστροφές
Το αγαπημένο μου θέμα. =)))) Παρά το γεγονός ότι ο ίδιος ο δείκτης στοίβας υπολογίζεται κατά τις εντολές PUSH και POP, κανείς δεν μας εμποδίζει να τον επιλέξουμε από το SP και να χρησιμοποιήσουμε τις τιμές του για να υπολογίσουμε με μη αυτόματο τρόπο τη διεύθυνση των δεδομένων που βρίσκονται στο η στοίβα. Ή διορθώστε τα δεδομένα στοίβας όπως επιθυμούμε.
Για τι? Λοιπόν, μπορείτε να βρείτε πολλές εφαρμογές αν καταπονήσετε τον εγκέφαλό σας και αρχίσετε να σκέφτεστε έξω από το κουτί :))))

Επιπλέον, οι παράμετροι περνούν μέσα από τη στοίβα σε κλασικό C και Pascal στην αρχιτεκτονική x86 και λειτουργούν οι τοπικές μεταβλητές. Εκείνοι. Πριν καλέσετε μια συνάρτηση, πρώτα όλες οι μεταβλητές ωθούνται στη στοίβα και στη συνέχεια, μετά την κλήση της συνάρτησης, μπιτ μελλοντικών τοπικών μεταβλητών ωθούνται στη στοίβα.

Στη συνέχεια, χρησιμοποιώντας το SP ως σημείο αναφοράς, μπορούμε να χειριστούμε αυτές τις μεταβλητές όπως θέλουμε. Και όταν η στοίβα ελευθερωθεί με την εντολή POP, εξαφανίζονται, ελευθερώνοντας τη μνήμη.

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

Είναι αλήθεια ότι αυτό μοιάζει ήδη με νευροχειρουργική. Έκανα ένα μικρό λάθος και ο ασθενής είναι νεκρός.

Χάρη στη στοίβα και τη μνήμη RAM, μπορείτε να τα βγάλετε πέρα ​​με δύο ή τρεις καταχωρητές, χωρίς ιδιαίτερο άγχος για την έλλειψή τους.

Μνήμη flash

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

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

Ο τελεστής DB σημαίνει ότι χρησιμοποιούμε ένα byte για κάθε σταθερά. Υπάρχουν επίσης τελεστές που καθορίζουν σταθερές δύο byte DW (καθώς και DD και DQ).

1 δεδομένα: .db 12,34,45,23

δεδομένα: .db 12,34,45,23

Τώρα, η ετικέτα δεδομένων δείχνει τη διεύθυνση του πρώτου byte του πίνακα, τα υπόλοιπα byte εντοπίζονται με μετατόπιση, προσθέτοντας απλώς ένα στη διεύθυνση.

Μια λεπτομέρεια είναι ότι ο μεταγλωττιστής αντικαθιστά τη διεύθυνση σήμανσης και τη θεωρεί τη διεύθυνση άλματος για τον μετρητή προγράμματος. Και αυτός, αν θυμάστε, απευθύνεται σε λέξεις διπλών byte - τελικά, το μήκος της εντολής μπορεί να είναι είτε 2 είτε 4 byte.

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

Για να φορτώσετε δεδομένα από τη μνήμη προγράμματος, χρησιμοποιήστε την εντολή από την ομάδα Load Program Memory

Για παράδειγμα, LPM Rn,Z

Εισάγει στον καταχωρητή Rn τον αριθμό από το κελί που δείχνει το ζεύγος καταχωρητών Z. Επιτρέψτε μου να σας υπενθυμίσω ότι το Z είναι δύο καταχωρητές, R30 (ZL) και R31 (ZH). Το χαμηλό byte της διεύθυνσης εισάγεται στο R30 και το υψηλό byte στο R31.

Στον κώδικα μοιάζει με αυτό:

LDI ZL,low(data*2) ; Εισάγουμε το χαμηλό byte της διεύθυνσης στο ζεύγος καταχωρητών Z LDI ZH,high(data*2) ; Εισάγουμε το υψηλό byte της διεύθυνσης στο ζεύγος καταχωρητών Z. Ο πολλαπλασιασμός επί δύο οφείλεται στο γεγονός ότι η διεύθυνση υποδεικνύεται στο. σε λέξεις διπλών byte, αλλά τις χρειαζόμαστε σε byte. ; Επομένως, πολλαπλασιάζουμε επί δύο. Μετά τη φόρτωση της διεύθυνσης, μπορείτε να φορτώσετε τον αριθμό από τη μνήμη LPM R16, Z; στον καταχωρητή R16 μετά από αυτή την εντολή θα υπάρχει ο αριθμός 12, ; λαμβάνονται από τη μνήμη του προγράμματος. ; κάπου στο τέλος του προγράμματος, αλλά στο τμήμα δεδομένων .CSEG: .db 12,34,45,23

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


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

Δομή και σειρά σύνταξης προγράμματος

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

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


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

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

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

Σύνταξη προγράμματος

Ο κώδικας C που γράψαμε δεν είναι ακόμα κατανοητός στον μικροελεγκτή, αφού το MK κατανοεί εντολές μόνο στο δυαδικό (ή δεκαεξαδικό) σύστημα, το οποίο είναι ένα σύνολο μηδενικών και μονάδων. Επομένως, ο κωδικός C πρέπει να μετατραπεί σε μηδενικά και μονά. Για το σκοπό αυτό χρησιμοποιείται ένα ειδικό πρόγραμμα που ονομάζεται μεταγλωττιστήςκαι η ίδια η διαδικασία Ο μετασχηματισμός κώδικα ονομάζεται μεταγλώττιση.

Για να αναβοσβήνει το υλικολογισμικό MK, καλείται μια συσκευή προγραμματιστής. Ανάλογα με τον τύπο του προγραμματιστή, η είσοδός του συνδέεται σε μια θύρα COM ή USB και η έξοδός του συνδέεται με ορισμένες ακίδες του μικροελεγκτή.


Υπάρχει μια μεγάλη ποικιλία από προγραμματιστές και πίνακες ανάπτυξης, αλλά είμαστε πολύ ευχαριστημένοι με την απλούστερη προγραμματιστής, που στην Κίνα δεν κοστίζει περισσότερο από 3 $.


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

Τώρα ας συνοψίσουμε τα βήματα του προγραμματισμού μικροελεγκτών.


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

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

Απαιτούμενο σύνολο προγραμμάτων

Υπάρχουν πολλά χρήσιμα και βολικά προγράμματα για τον προγραμματισμό του MK. Είναι και οι δύο επί πληρωμή και δωρεάν. Ανάμεσά τους υπάρχουν τρεις κύριες:

1) Atmel Studio

2) CodeVisionAVR

3) WinAVR

Όλα αυτά τα προγράμματα σχετίζονται με IDEΕγώολοκληρωμένο ρεανάπτυξη μιπεριβάλλον – ολοκληρωμένο περιβάλλον ανάπτυξης. Μπορείτε να γράψετε κώδικα σε αυτά, να τον μεταγλωττίσετε και να τον διορθώσετε.

Θα πρέπει να δώσετε προσοχή στο Code Vision AVR. Αυτό το IDE κάνει τη σύνταξη κώδικα ευκολότερη και ταχύτερη. Ωστόσο, το πρόγραμμα πληρώνεται.

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

Εντοπισμός σφαλμάτων υλικολογισμικού και προγράμματος

Θα αναβοσβήσουμε μικροελεγκτές χρησιμοποιώντας ένα πρόσθετο πρόγραμμα.

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

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

Ένα άλλο σημαντικό στοιχείο που θα μας φανεί χρήσιμο είναι η τεχνική τεκμηρίωση για το MK, που ονομάζεται φύλλο δεδομένων. Σε γενικές γραμμές, πρέπει να κάνετε λήψη φύλλο δεδομένων για τον μικροελεγκτή ATmega8.

Kiselev Roman, Μάιος 2007 Το άρθρο ενημερώθηκε στις 26 Μαΐου 2014

Λοιπόν, τι είναι ένας μικροελεγκτής (εφεξής καλούμενος MK); Αυτός είναι, σχετικά, ένας μικρός υπολογιστής που στεγάζεται σε ένα ενιαίο ολοκληρωμένο κύκλωμα. Διαθέτει επεξεργαστή (αριθμητική λογική μονάδα, ή ALU), μνήμη flash, μνήμη EEPROM, πολλούς καταχωρητές, θύρες I/O, καθώς και πρόσθετα κουδούνια και σφυρίχτρες όπως χρονόμετρα, μετρητές, συγκριτές, USARTs κ.λπ. Μετά την ενεργοποίηση , ο μικροελεγκτής εκκινεί και ξεκινά την εκτέλεση του προγράμματος που είναι αποθηκευμένο στη μνήμη flash του. Ταυτόχρονα, μπορεί να ελέγχει μια μεγάλη ποικιλία εξωτερικών συσκευών μέσω θυρών I/O.

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

Τα AVR είναι μικροελεγκτές 8 bit, δηλαδή η ALU τους μπορεί να εκτελεί απλές λειτουργίες μόνο με αριθμούς 8 bit σε έναν κύκλο ρολογιού. Τώρα ήρθε η ώρα να μιλήσουμε για το ποια MK θα χρησιμοποιήσουμε. Δουλεύω με ένα ATMega16 MK. Είναι πολύ κοινό και μπορεί να αγοραστεί σε σχεδόν οποιοδήποτε κατάστημα ανταλλακτικών ραδιοφώνου για περίπου 100 ρούβλια. Εάν δεν το βρείτε, τότε μπορείτε να αγοράσετε οποιοδήποτε άλλο MK της σειράς MEGA, αλλά σε αυτήν την περίπτωση θα πρέπει να αναζητήσετε τεκμηρίωση για αυτό, καθώς τα ίδια «πόδια» διαφορετικών MK μπορούν να εκτελέσουν διαφορετικές λειτουργίες και σύνδεση, φαίνεται, εάν όλα τα συμπεράσματα είναι σωστά, μπορεί να έχετε μια συσκευή που λειτουργεί ή ίσως απλώς ένα σύννεφο βρωμερό καπνού. Όταν αγοράζετε ένα ATMega16, βεβαιωθείτε ότι διατίθεται σε μεγάλη συσκευασία DIP 40 ακίδων και αγοράστε επίσης μια υποδοχή για αυτό στην οποία μπορεί να τοποθετηθεί. Για να εργαστείτε με αυτό, θα χρειαστείτε επίσης πρόσθετες συσκευές: LED, κουμπιά, υποδοχές κ.λπ.

Το ATMega16 έχει έναν πολύ μεγάλο αριθμό διαφορετικών λειτουργιών. Εδώ είναι μερικά από τα χαρακτηριστικά του:

  • Μέγιστη συχνότητα ρολογιού – 16 MHz (8 MHz για ATMega16L)
  • Οι περισσότερες εντολές εκτελούνται σε έναν κύκλο ρολογιού
  • 32 καταχωρητές εργασίας 8-bit
  • 4 πλήρεις θύρες I/O 8-bit
  • δύο χρονόμετρο/μετρητές 8 bit και ένα 16 bit
  • Μετατροπέας αναλογικού σε ψηφιακό 10-bit (ADC)
  • εσωτερική γεννήτρια ρολογιού στο 1 MHz
  • αναλογικός συγκριτής
  • διεπαφές SPI, I2C, TWI, RS-232, JTAG
  • προγραμματισμός εντός κυκλώματος και αυτοπρογραμματισμός
  • Μονάδα διαμόρφωσης πλάτους παλμού (PWM).

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

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

Τι θα χρειαστείτε για αυτό;

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

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

Ας εξηγήσουμε ποια πόδια μας ενδιαφέρουν τώρα.

  • VCC - η ισχύς παρέχεται εδώ (4,5 - 5,5 V) από σταθεροποιημένη πηγή
  • GND – γείωση
  • RESET – επαναφορά (σε επίπεδο χαμηλής τάσης)
  • XTAL1, XTAL2 – εδώ συνδέεται ένας συντονιστής χαλαζία
  • PA, PB, PC, PD – θύρες εισόδου/εξόδου (A, B, C και D, αντίστοιχα).

Οτιδήποτε παράγει 7-11 V DC μπορεί να χρησιμοποιηθεί ως πηγή ενέργειας. Για σταθερή λειτουργία του MK απαιτείται σταθεροποιημένη παροχή ρεύματος. Ως σταθεροποιητής, μπορείτε να χρησιμοποιήσετε μικροκυκλώματα της σειράς 7805. Πρόκειται για γραμμικούς ενσωματωμένους σταθεροποιητές, η είσοδος των οποίων παρέχεται με 7-11 V συνεχούς μη σταθεροποιημένου ρεύματος και η έξοδος είναι 5 V σταθεροποιημένου ρεύματος. Πριν και μετά το 7805, πρέπει να εγκαταστήσετε πυκνωτές φίλτρου (ηλεκτρολυτικοί για φιλτράρισμα παρεμβολών χαμηλής συχνότητας και κεραμικοί για υψηλές συχνότητες). Εάν δεν μπορείτε να βρείτε σταθεροποιητή, τότε μπορείτε να χρησιμοποιήσετε μια μπαταρία 4,5 V ως πηγή τροφοδοσίας. Το MK πρέπει να τροφοδοτείται απευθείας από αυτήν.

Ακολουθεί ένα διάγραμμα της σύνδεσης MK:

Ας καταλάβουμε τώρα τι είναι τι εδώ.

Το BQ1 είναι ένας συντονιστής χαλαζία που ρυθμίζει τη συχνότητα λειτουργίας του MK. Μπορείτε να ρυθμίσετε οποιαδήποτε έως 16 MHz, αλλά επειδή σκοπεύουμε να δουλέψουμε στο μέλλον με μια θύρα COM, συνιστώ τη χρήση συντονιστών για τις ακόλουθες συχνότητες: 14,7456 MHz, 11,0592 MHz, 7,3725 MHz, 3,6864 MHz ή 1,842 MHz θα γίνει σαφές γιατί). Χρησιμοποίησα 11,0592 MHz. Είναι σαφές ότι όσο μεγαλύτερη είναι η συχνότητα, τόσο μεγαλύτερη είναι η ταχύτητα της συσκευής.

Το R1 είναι μια αντίσταση έλξης που διατηρεί τάση 5 V στην είσοδο RESET. Ένα χαμηλό επίπεδο τάσης σε αυτήν την είσοδο υποδηλώνει επαναφορά. Μετά την επαναφορά, το MK εκκινεί (10 - 15 ms) και ξεκινά ξανά την εκτέλεση του προγράμματος. Δεδομένου ότι πρόκειται για είσοδο υψηλής σύνθετης αντίστασης, δεν μπορείτε να την αφήσετε να "κρέμεται στον αέρα" - μια μικρή λήψη σε αυτήν θα οδηγήσει σε απροσδόκητη επαναφορά του MK. Αυτό ακριβώς είναι το R1. Για αξιοπιστία, προτείνω επίσης την εγκατάσταση πυκνωτή C6 (όχι περισσότερο από 20 µF).

SB1 – κουμπί επαναφοράς.

Το αντηχείο χαλαζία και ο πυκνωτής φίλτρου C3 θα πρέπει να βρίσκονται όσο το δυνατόν πιο κοντά στο MK (όχι περισσότερο από 5-7 cm), καθώς διαφορετικά μπορεί να προκύψουν παρεμβολές στα καλώδια, οδηγώντας σε δυσλειτουργίες του MK.

Το μπλε ορθογώνιο στο διάγραμμα περιγράφει τον ίδιο τον προγραμματιστή. Είναι βολικό να το φτιάξετε με τη μορφή σύρματος, το ένα άκρο του οποίου είναι συνδεδεμένο στη θύρα LPT και το άλλο σε έναν συγκεκριμένο σύνδεσμο δίπλα στο MK. Το καλώδιο δεν πρέπει να είναι υπερβολικά μακρύ. Εάν προκύψουν προβλήματα με αυτό το καλώδιο (συνήθως δεν συμβαίνει, αλλά όλα μπορούν να συμβούν), θα πρέπει να κολλήσετε τον προσαρμογέα Altera ByteBlaster. Πώς να το κάνετε αυτό γράφεται στην περιγραφή του προγραμματιστή AVReal.

Τώρα που ασχοληθήκαμε με το υλικό, ήρθε η ώρα να προχωρήσουμε στο λογισμικό.

Υπάρχουν πολλά περιβάλλοντα ανάπτυξης για προγραμματισμό AVR. Πρώτον, αυτό είναι το AVR Studio - το επίσημο σύστημα προγραμματισμού από την Atmel. Σας επιτρέπει να γράφετε σε assembler και προγράμματα εντοπισμού σφαλμάτων γραμμένα σε assembly, C και C++. Το IAR είναι ένα εμπορικό σύστημα προγραμματισμού σε C, C++ και γλώσσα assembly. Το WinAVR είναι ένας μεταγλωττιστής ανοιχτού κώδικα. Το AtmanAVR είναι ένα σύστημα προγραμματισμού για AVR με διεπαφή σχεδόν ίδια με το Visual C++ 6. Το AtmanAVR σάς επιτρέπει επίσης να διορθώνετε προγράμματα και περιέχει πολλές βοηθητικές λειτουργίες που διευκολύνουν τη σύνταξη κώδικα. Αυτό το σύστημα προγραμματισμού είναι εμπορικό, αλλά, σύμφωνα με την άδεια χρήσης, μπορείτε να το χρησιμοποιήσετε δωρεάν για ένα μήνα.

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

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

Έχοντας ξεκινήσει το IAR, επιλέξτε αρχείο/νέο/χώρος εργασίας, επιλέξτε τη διαδρομή προς το έργο μας και δημιουργήστε ένα φάκελο για αυτό και δώστε του ένα όνομα, για παράδειγμα, "Prog1". Τώρα ας δημιουργήσουμε ένα έργο: Έργο / Δημιουργία νέου έργου…Ας το ονομάσουμε επίσης "Prog1". Κάντε δεξί κλικ στον τίτλο του έργου στο δέντρο του έργου και επιλέξτε "Επιλογές"

Εδώ θα διαμορφώσουμε τον μεταγλωττιστή για ένα συγκεκριμένο MK. Αρχικά, πρέπει να επιλέξετε τον τύπο επεξεργαστή ATMega16 στην καρτέλα Target, επιλέξτε το πλαίσιο ελέγχου Enable bit definitions in I/O-include files στην καρτέλα Library Configuration (ώστε να μπορείτε να χρησιμοποιήσετε τα ονόματα bit διαφόρων καταχωρητών MK στον κώδικα προγράμματος ), και επιλέξτε τον τύπο βιβλιοθήκης C εκεί /EU++. Στην κατηγορία ICCAVR, πρέπει να επιλέξετε το πλαίσιο ελέγχου Ενεργοποίηση υποστήριξης πολλών byte στην καρτέλα Γλώσσα και να απενεργοποιήσετε τη βελτιστοποίηση στην καρτέλα Βελτιστοποίηση (διαφορετικά θα καταστρέψει το πρώτο μας πρόγραμμα).

Στη συνέχεια, επιλέξτε την κατηγορία XLINK. Εδώ πρέπει να προσδιορίσετε τη μορφή του μεταγλωττισμένου αρχείου. Επειδή τώρα ορίζουμε επιλογές για τη λειτουργία εντοπισμού σφαλμάτων, όπως περιγράφεται στον τίτλο, πρέπει να λάβουμε ως έξοδο ένα αρχείο εντοπισμού σφαλμάτων. Αργότερα θα το ανοίξουμε στο AVR Studio. Για να το κάνετε αυτό, πρέπει να επιλέξετε το extension.cof και ο τύπος αρχείου είναι ubrof 7.

Τώρα κάντε κλικ στο OK και μετά αλλάξτε το Debug σε Release.

Μεταβείτε ξανά στις Επιλογές, όπου όλες οι παράμετροι εκτός από το XLINK έχουν οριστεί στο ίδιο. Στο XLINK, αλλάξτε την επέκταση σε .hex και τη μορφή αρχείου σε intel-standart.

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

#περιλαμβάνω"iom16.h" σύντομη ανυπόγραφη int i; κενόςκύριος( κενός) (DDRB = 255; PORTB = 0; ενώ(1) { αν(PORTB == 255) PORTB = 0; αλλού PORTB++; Για(i=0; i

Το αρχείο "iom16.h" βρίσκεται στο φάκελο (C:\Program Files)\IAR Systems\Embedded Workbench 3.2\avr\inc. Εάν χρησιμοποιείτε άλλο MK, για παράδειγμα, ATMega64, επιλέξτε το αρχείο “iom64.h”. Αυτά τα αρχεία κεφαλίδας αποθηκεύουν πληροφορίες σχετικά με το MK: τα ονόματα των καταχωρητών, τα bit σε καταχωρητές και τα ονόματα των διακοπών. Κάθε μεμονωμένη ακίδα της θύρας A, B, C ή D μπορεί να λειτουργήσει είτε ως είσοδος είτε ως έξοδος. Αυτό καθορίζεται από το Data Direction Register (DDR). Το 1 κάνει το πόδι έξοδο, το 0 είσοδο. Έτσι, ρυθμίζοντας, για παράδειγμα, DDRA = 13, κάνουμε τις εξόδους "πόδια" PB0, PB2, PB3, τις υπόλοιπες - εισόδους, επειδή Το 13 στο δυαδικό είναι το 00001101.

Το PORTB είναι ένας καταχωρητής που καθορίζει την κατάσταση των ακίδων της θύρας. Έχοντας γράψει 0 εκεί, ρυθμίσαμε την τάση σε όλες τις εξόδους στο 0 V. Μετά υπάρχει ένας ατελείωτος βρόχος. Κατά τον προγραμματισμό του MK, κάνουν πάντα έναν ατελείωτο βρόχο στον οποίο το MK εκτελεί κάποια ενέργεια μέχρι να μηδενιστεί ή μέχρι να συμβεί διακοπή. Σε αυτόν τον κύκλο γράφουν, λες, «κώδικα παρασκηνίου», τον οποίο το MK εκτελεί ως το τελευταίο πράγμα. Αυτό θα μπορούσε, για παράδειγμα, να είναι η εμφάνιση πληροφοριών σε μια οθόνη. Στην περίπτωσή μας, τα περιεχόμενα του καταχωρητή PORTB αυξάνονται μέχρι να γεμίσει. Μετά από αυτό όλα ξεκινούν από την αρχή. Τέλος, δέκα χιλιάδες κύκλος για βρόχο. Απαιτείται για να σχηματιστεί μια ορατή καθυστέρηση στην αλλαγή της κατάστασης της θύρας Β.



Τώρα αποθηκεύουμε αυτό το αρχείο στο φάκελο του έργου ως Prog1.c, αντιγράφουμε το αρχείο iom16.h στο φάκελο του έργου, επιλέγουμε Project/Add Files και προσθέτουμε τα “iom16.h” και “Prog1.c”. Επιλέξτε Release, πατήστε F7, το πρόγραμμα μεταγλωττίζεται και θα εμφανιστεί το μήνυμα:


Συνολικός αριθμός σφαλμάτων: 0
Συνολικός αριθμός προειδοποιήσεων: 0

Εδώ είναι μια φωτογραφία του προγραμματιστή μου:

Κατεβάστε τον προγραμματιστή AVReal. Αντιγράψτε το (AVReal32.exe) στο φάκελο Release/exe, όπου θα πρέπει να βρίσκεται το αρχείο Prog1.hex. Παρέχουμε ρεύμα στο MK, συνδέουμε το καλώδιο προγραμματισμού. Ανοίξτε το Far Manager (είναι πιο βολικό να αναβοσβήσετε το MK), μεταβείτε σε αυτόν τον φάκελο, πατήστε Ctrl+O. Αφού έχουμε ένα εντελώς νέο MK, γεμίζουμε

avreal32.exe +MEGA16 -o11.0592MHZ -p1 -fblev=0,jtagen=1,cksel=F,sut=1 –w

Μην ξεχάσετε να εισάγετε τη σωστή συχνότητα εάν δεν χρησιμοποιείτε 11059200 Hz! Ταυτόχρονα, τα λεγόμενα ασφάλειες – καταχωρητές που ελέγχουν τη λειτουργία του (χρήση εσωτερικής γεννήτριας, Jtag κ.λπ.). Μετά από αυτό, είναι έτοιμο να λάβει το πρώτο πρόγραμμα. Στον προγραμματιστή δίνεται η χρησιμοποιούμενη θύρα LPT, η συχνότητα, το όνομα αρχείου και άλλες ως παράμετροι (όλα αυτά αναφέρονται στην περιγραφή του AVReal). Καλούμε:

Avreal32.exe +Mega16 -o11.0592MHz -p1 -e -w -az -% Prog1.hex

Εάν η σύνδεση είναι σωστή, ο προγραμματιστής θα αναφέρει επιτυχή προγραμματισμό. Δεν υπάρχει καμία εγγύηση ότι αυτό θα λειτουργήσει την πρώτη φορά (την πρώτη φορά που καλείτε το πρόγραμμα). Εγώ ο ίδιος μερικές φορές προγραμματίζομαι για δεύτερη φορά. Ίσως η θύρα LPT είναι ελαττωματική ή υπάρχει παρεμβολή στο καλώδιο. Εάν παρουσιαστούν προβλήματα, ελέγξτε προσεκτικά το καλώδιο σας. Από τη δική μου εμπειρία, γνωρίζω ότι το 60% των δυσλειτουργιών σχετίζονται με την έλλειψη επαφής στο σωστό μέρος, το 20% με την παρουσία ενός περιττού και ένα άλλο 15% με τη λανθασμένη συγκόλληση του λάθος πράγματος στο λάθος πράγμα. Εάν όλα τα άλλα αποτύχουν, διαβάστε την περιγραφή του προγραμματιστή και δοκιμάστε να δημιουργήσετε το Byte Blaster.

Ας υποθέσουμε ότι όλα λειτουργούν για εσάς. Εάν συνδέσετε τώρα οκτώ LED στη θύρα B του MK (κάντε το με απενεργοποιημένο το MK και καλό είναι να συμπεριλάβετε αντιστάσεις 300-400 Ohm σε σειρά με τα LED) και εφαρμόσετε ρεύμα, θα συμβεί ένα μικρό θαύμα - ένα " κύμα» θα τους διατρέχει!

© Kiselev Roman
Μάιος 2007

Δεκέμβριος 2015

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

Τα κυκλώματα συσκευών που βασίζονται σε μικροελεγκτές (MCU) διακρίνονται συνήθως από έναν συνδυασμό δύο δύσκολα συνδυαστικών ιδιοτήτων: μέγιστη απλότητα και υψηλή λειτουργικότητα. Επιπλέον, η λειτουργικότητα μπορεί να αλλάξει και να επεκταθεί στο μέλλον χωρίς να γίνουν αλλαγές στο κύκλωμα - απλώς αντικαθιστώντας το πρόγραμμα (αναβοσβήνει). Αυτά τα χαρακτηριστικά εξηγούνται από το γεγονός ότι οι δημιουργοί των σύγχρονων μικροελεγκτών προσπάθησαν να τοποθετήσουν σε ένα τσιπ όλα όσα θα μπορούσε να χρειαστεί ένας προγραμματιστής μιας ηλεκτρονικής συσκευής - τουλάχιστον όσο το δυνατόν περισσότερο. Ως αποτέλεσμα, υπήρξε μια μετατόπιση της έμφασης από το κύκλωμα και την εγκατάσταση στο λογισμικό. Με τη χρήση του 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 στα σχόλια υπάρχει μια γραμμή: "το ηχητικό σήμα παράγεται στον ακροδέκτη XX". Όταν ολοκληρωθεί το σενάριο προγραμματιστή, ο μικροελεγκτής βγαίνει από τη λειτουργία προγραμματισμού και μπαίνει σε κανονική λειτουργία. Η αναπαραγωγή των μελωδιών ξεκινά αμέσως. Συνδέοντας έναν πομπό ήχου, μπορείτε να το ελέγξετε. Μπορείτε να αφήσετε τον εκπομπό ήχου συνδεδεμένο κατά τον προγραμματισμό του κρυστάλλου μόνο εάν ο ήχος λαμβάνεται από μια ακίδα που δεν χρησιμοποιείται στο SPI, διαφορετικά η πρόσθετη χωρητικότητα στην ακίδα μπορεί να επηρεάσει τον προγραμματισμό.