Προγραμματισμός μικροελεγκτών σε C από την αρχή. CodeVisionAVR. Γενικές πληροφορίες για αρχάριους στον προγραμματισμό στη γλώσσα C. Ποιον μικροελεγκτή να επιλέξετε για εργασία

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

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

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

Προηγούμενη εμπειρία προγραμματισμού.Μην παραμελείτε την προηγούμενη εμπειρία προγραμματισμού σας. Ακόμα κι αν ήταν ΒΑΣΙΚΟ. Κι ας ήταν πολύ καιρό πριν στο σχολείο. Ο προγραμματισμός είναι σαν να οδηγείς ποδήλατο – μόλις ξεκινήσεις, θυμάσαι γρήγορα όλα όσα έχεις ξεχάσει. Ξεκινήστε με το BASIC - κατακτήστε το - αργότερα θα είναι πιο εύκολο να επιλέξετε κάτι πιο κατάλληλο για τους σκοπούς σας.

Βοήθεια από το περιβάλλον.Οι φίλοι σου γράφουν σε Pascal; Το ζήτημα επιλύθηκε για εσάς - γράψτε στο Pascal! Θα σας βοηθούν πάντα με συμβουλές, θα σας δίνουν βιβλιοθήκες και θα σας δίνουν έτοιμα έργα για μελέτη. Γενικά, θα χαρούν να σας καλωσορίσουν στην κοινότητά τους. Αν κάνετε το αντίθετο, θα έχετε το αντίθετο αποτέλεσμα. Οι φίλοι της βιομηχανίας CIS θα σας ραμφίσουν αν αποφασίσετε να σπουδάσετε Assembler. Μην περιμένετε βοήθεια.

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

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

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

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

Μάγοι.Οποιαδήποτε συσκευή στο τσιπ πρέπει να διαμορφωθεί χρησιμοποιώντας θύρες. Η διαδικασία είναι αρκετά κουραστική και απαιτούνται φύλλα δεδομένων. Επιπλέον, υπάρχουν αποχρώσεις που δεν είναι εύκολο να κατανοήσει ένας αρχάριος. Επομένως, είναι πολύ επιθυμητό να υπάρχουν μάγοι στο περιβάλλον. Οι Vyzards είναι αυτόματοι δέκτες για SPI, I2C, USART κ.λπ. Όσο περισσότερες συσκευές υποστηρίζονται, τόσο το καλύτερο. Ορίζετε τις απαραίτητες περιφερειακές παραμέτρους και ο ίδιος ο οδηγός δημιουργεί κώδικα που θα παρέχει τις καθορισμένες παραμέτρους. Κάνει τη ζωή πολύ πιο εύκολη.


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


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

(Επισκέφθηκε 7.377 φορές, 1 επισκέψεις σήμερα)

Γεια σου, αγαπητέ Habrazhitel!

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

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

1. Προγραμματιστής
Υπάρχουν πολλές επιλογές στην αγορά - από τους φθηνότερους προγραμματιστές ISP (In-System Programming) για λίγα δολάρια, μέχρι ισχυρούς προγραμματιστές-debugger για μερικές εκατοντάδες. Μη έχοντας μεγάλη εμπειρία σε αυτό το θέμα, πρώτα αποφάσισα να δοκιμάσω ένα από τα πιο απλά και φθηνά - USBasp. Το αγόρασα στο eBay μια φορά για 12 $, τώρα μπορείτε να το βρείτε ακόμη και για 3-4 $. Αυτή είναι στην πραγματικότητα μια κινεζική έκδοση του προγραμματιστή από τον Thomas Fischl. Τι να πω για αυτόν; Μόνο ένα πράγμα - λειτουργεί. Επιπλέον, υποστηρίζει πάρα πολλούς ελεγκτές AVR της σειράς ATmega και ATtiny. Στο Linux δεν απαιτείται πρόγραμμα οδήγησης.

Για να αναβοσβήσετε το υλικολογισμικό, πρέπει να συνδέσετε τις εξόδους του προγραμματιστή VCC, GND, RESET, SCK, MOSI, MISO με τις αντίστοιχες εξόδους του μικροελεγκτή. Για απλότητα, συναρμολόγησα το βοηθητικό κύκλωμα απευθείας στο breadboard:

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

2. Μικροελεγκτής
Δεν ασχολήθηκα πολύ με την επιλογή του μικροελεγκτή και πήρα το ATmega8 από την Atmel - 23 ακίδες I/O, δύο χρονόμετρα 8 bit, ένα 16 bit, συχνότητα έως 16 MHz, χαμηλή κατανάλωση (1-3,6 mA) , φθηνό (2$). Σε γενικές γραμμές, για αρχή - περισσότερο από αρκετό.

Στο Linux, ο συνδυασμός avr-gcc + avrdude λειτουργεί καλά για τη μεταγλώττιση και τη φόρτωση υλικολογισμικού στον ελεγκτή. Η εγκατάσταση είναι ασήμαντη. Ακολουθώντας τις οδηγίες, μπορείτε να εγκαταστήσετε όλο το απαραίτητο λογισμικό μέσα σε λίγα λεπτά. Η μόνη απόχρωση που πρέπει να προσέξετε είναι ότι το avrdude (λογισμικό για εγγραφή στον ελεγκτή) μπορεί να απαιτεί δικαιώματα υπερ-χρήστη για πρόσβαση στον προγραμματιστή. Η λύση είναι να το εκτελέσετε μέσω sudo (όχι πολύ καλή ιδέα) ή να καταχωρίσετε ειδικά δικαιώματα udev. Η σύνταξη μπορεί να διαφέρει σε διαφορετικές εκδόσεις λειτουργικού συστήματος, αλλά στην περίπτωσή μου ( Linux Mint 15) Η προσθήκη του ακόλουθου κανόνα στο αρχείο /etc/udev/rules.d/41-atmega.rules λειτούργησε:

# Προγραμματιστής USBasp SUBSYSTEM=="usb", ATTR(idVendor)=="16c0", ATTR(idProduct)=="05dc", GROUP="plugdev", MODE="0666"

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

Για Windows θα πρέπει να εγκαταστήσετε ένα πρόγραμμα οδήγησης. Διαφορετικά δεν υπάρχουν προβλήματα. Για λόγους επιστημονικού ενδιαφέροντος, δοκίμασα τον συνδυασμό AVR Studio + eXtreme Burner στα Windows. Και πάλι, όλα λειτουργούν υπέροχα.

Ας ξεκινήσουμε τον προγραμματισμό

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

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

Αποφασίστηκε να χρησιμοποιηθούν δύο δείκτες διόδων 7 τμημάτων ως οθόνη. Για έλεγχο, αρκούσαν 5 κουμπιά - "Player 1", "Player 2", "Reset", "Settings" και "Pause". Λοιπόν, μην ξεχνάτε την ηχητική ένδειξη του τέλους του παιχνιδιού. Δες ότι αυτό είναι. Το παρακάτω σχήμα δείχνει ένα γενικό διάγραμμα σύνδεσης του μικροελεγκτή σε ενδείξεις και κουμπιά. Θα το χρειαστούμε όταν αναλύουμε τον πηγαίο κώδικα του προγράμματος:

Απολογισμός

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

Int main(void) (init_io(); init_data(); sound_off(); sei(); while(1) (handle_buttons(); ) return 0; )
Ας δούμε κάθε λειτουργία ξεχωριστά.

Void init_io() ( // ορίστε την έξοδο DDRB = 0xFF; DDRD = 0xFF; // ορίστε την είσοδο DDRC = 0b11100000; // pull-up αντιστάσεις PORTC |= 0b00011111; // διακόπτει το χρονόμετρο TIMSK = (1<

Η ρύθμιση των θυρών I/O είναι πολύ απλή - ένας αριθμός γράφεται στον καταχωρητή DDRx (όπου x είναι το γράμμα που υποδηλώνει τη θύρα), κάθε bit του οποίου σημαίνει εάν η αντίστοιχη ακίδα θα είναι συσκευή εισόδου (αντιστοιχεί στο 0) ή συσκευή εξόδου (αντιστοιχεί σε 1). Έτσι, στέλνοντας τον αριθμό 0xFF στα DDRB και DDRD, φτιάξαμε θύρες εξόδου B και D. Αντίστοιχα, η εντολή DDRC = 0b11100000; μετατρέπει τις πρώτες 5 ακίδες της θύρας C σε ακίδες εισόδου και τις υπόλοιπες σε ακίδες εξόδου. Εντολή PORTC |= 0b00011111; περιλαμβάνει εσωτερικές αντιστάσεις έλξης σε 5 εισόδους ελεγκτή. Σύμφωνα με το διάγραμμα, σε αυτές τις εισόδους συνδέονται κουμπιά, τα οποία, όταν πατηθούν, βραχυκυκλώνουν στη γείωση. Με αυτόν τον τρόπο ο ελεγκτής καταλαβαίνει ότι το κουμπί είναι πατημένο.

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

Διακοπή χειρισμού

ISR (TIMER0_OVF_vect) ( display(); if (_buzzer > 0) ( _buzzer--; if (_buzzer == 0) sound_off(); ) ) ISR(TIMER1_COMPA_vect) ( if (ActiveTimer == 1 && Timer1 > 0) ( Timer1--; if (Timer1 == 0) process_timeoff(); ) if (ActiveTimer == 2 && Timer2 > 0) ( Timer2--; if (Timer2 == 0) process_timeoff(); ) )

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

Έξοδος σε δείκτες

Void display() ( display_number((Timer1/60)/10, 0b00001000); _delay_ms(0.25); display_number((Timer1/60)%10, 0b00000100); _delay_ms(0.25); display_number((Timer)) . 60)%10, 0b01000000); _delay_ms(0.25); display_number((Timer2%60)/10, 0b00100000); _delay_ms(0.25); display_number((Timer2%60)%10, 0b000); = 0; ) void display_number(int number, int mask) ( PORTB = number_mask(number); PORTD = mask; )

Η λειτουργία εμφάνισης χρησιμοποιεί μια μέθοδο δυναμικής εμφάνισης. Το γεγονός είναι ότι κάθε μεμονωμένος δείκτης έχει 9 επαφές (7 για έλεγχο τμήματος, 1 για σημείο και 1 για ισχύ). Για τον έλεγχο 4 ψηφίων, χρειάζονται 36 επαφές. Πάρα πολύ σπάταλος. Επομένως, η έξοδος των ψηφίων σε έναν δείκτη με πολλά ψηφία οργανώνεται σύμφωνα με την ακόλουθη αρχή:

Η τάση παρέχεται εναλλάξ σε κάθε μία από τις κοινές επαφές, γεγονός που σας επιτρέπει να επισημάνετε τον επιθυμητό αριθμό στην αντίστοιχη ένδειξη χρησιμοποιώντας τις ίδιες 8 επαφές ελέγχου. Σε αρκετά υψηλή συχνότητα εξόδου, μοιάζει με στατική εικόνα στο μάτι. Αυτός είναι ο λόγος για τον οποίο και οι 8 επαφές ισχύος και των δύο ενδείξεων στο διάγραμμα συνδέονται σε 8 εξόδους της θύρας D και 16 επαφές ελέγχου τμήματος συνδέονται ανά ζεύγη και συνδέονται σε 8 εξόδους της θύρας Β. Έτσι, η λειτουργία εμφάνισης με καθυστέρηση 0,25 ms εμφανίζει εναλλάξ τον επιθυμητό αριθμό σε καθεμία από τις ενδείξεις. Τέλος, όλες οι έξοδοι που τροφοδοτούν τάση στις ενδείξεις απενεργοποιούνται (εντολή PORTD = 0;). Εάν αυτό δεν γίνει, τότε το τελευταίο εμφανιζόμενο ψηφίο θα συνεχίσει να ανάβει μέχρι την επόμενη κλήση στη λειτουργία οθόνης, η οποία θα οδηγήσει σε φωτεινότερη λάμψη του σε σύγκριση με τα υπόλοιπα.

Χειρισμός κλικ

Void handle_buttons() ( handle_button(KEY_SETUP); handle_button(KEY_RESET); handle_button(KEY_PAUSE); handle_button(KEY_PLAYER1); handle_button(KEY_PLAYER2); ) void handle_button (KEY_RESET); = SETUP_BIT; διάλειμμα; περίπτωση KEY_RESET: bit = RESET_BIT; διάλειμμα; περίπτωση KEY_PAUSE: bit = PAUSE_BIT; διάλειμμα; περίπτωση KEY_PLAYER1: bit = PLAYER1_BIT; διάλειμμα; περίπτωση KEY_PLAYER2: bit = PLAYER2_BIT; είναι σαφές, εάν είναι PLAYER2_BIT; BUTTON_PIN, bit)) (αν (_πατήθηκε == 0) ( _delay_ms(DEBOUNCE_TIME); if (bit_is_clear(BUTTON_PIN, bit)) ( _πατήθηκε |= πλήκτρο; // διακόπτης ενεργειών πλήκτρων (πλήκτρο) (περίπτωση KEY_SETUP: process_setup(); break; περίπτωση KEY_RESET: process_reset(); break; case KEY_PAUSE: process_pause(); break; case KEY_PLAYER1: process_player1(); break; case KEY_PLAYER2: process_player2(); break; ) sound_on(15); ) ) ) other ( _pressed &= ~κλειδί;))

Αυτή η λειτουργία μετράει και τα 5 κουμπιά με τη σειρά και επεξεργάζεται το κλικ, εάν υπάρχει. Το κλικ καταγράφεται επιλέγοντας bit_is_clear(BUTTON_PIN, bit) , π.χ. το κουμπί πατιέται εάν η αντίστοιχη είσοδος είναι συνδεδεμένη στη γείωση, κάτι που θα συμβεί, σύμφωνα με το διάγραμμα, όταν πατηθεί το κουμπί. Απαιτείται καθυστέρηση διάρκειας DEBOUNCE_TIME και επαναλαμβανόμενοι έλεγχοι για την αποφυγή πολλαπλών περιττών λειτουργιών λόγω αναπήδησης επαφής. Η αποθήκευση της κατάστασης πατημένο στα αντίστοιχα bit της μεταβλητής _pressed χρησιμοποιείται για να αποτραπεί η επαναλαμβανόμενη ενεργοποίηση όταν το κουμπί πατιέται για μεγάλο χρονικό διάστημα.
Οι λειτουργίες για την επεξεργασία των κλικ είναι αρκετά ασήμαντες και πιστεύω ότι δεν χρειάζονται επιπλέον σχόλια.

Το πλήρες κείμενο του προγράμματος

#define F_CPU 4000000UL #include #περιλαμβάνω #περιλαμβάνω #define DEBOUNCE_TIME 20 #define BUTTON_PIN PINC #define SETUP_BIT PC0 #define RESET_BIT PC1 #define PAUSE_BIT PC2 #define PLAYER1_BIT PC3 #define PLAYER2_BIT PC4 #define PLAYER2_BIT PC4 #define KEY0SETUP0 0b0000001 0 #define KEY_PAUSE 0b00000100 #define KEY_PLAYER1 0b00001000 #define KEY_PLAYER2 0b00010000 volatile int ActiveTimer = 0; volatile int Timer1 = 0; volatile int Timer2 = 0; volatile int _buzzer = 0; volatile int _pressed = 0; // δηλώσεις συνάρτησης void init_io(); void init_data(); int number_mask(int num); void handle_buttons(); void handle_button(int key); void process_setup(); void process_reset(); void process_pause(); void process_timeoff(); void process_player1(); void process_player2(); void display(); void display_number(int mask, int number); void sound_on(int interval); void sound_off(); // διακόπτει το ISR (TIMER0_OVF_vect) ( display(); if (_buzzer > 0) ( _buzzer--; if (_buzzer == 0) sound_off(); ) ) ISR(TIMER1_COMPA_vect) ( if (ActiveTimer == 1 && Timer1 > 0) ( Timer1--; if (Timer1 == 0) process_timeoff(); ) if (ActiveTimer == 2 && Timer2 > 0) ( Timer2--; if (Timer2 == 0) process_timeoff(); ) ) int main (void) ( init_io(); init_data(); sound_off(); sei(); while(1) ( handle_buttons(); ) return 0; ) void init_io() ( // ορισμός εξόδου DDRB = 0xFF; DDRD = 0xFF ; // ορίστε την είσοδο DDRC = 0b11100000; // pull-up αντιστάσεις PORTC |= 0b00011111; // ο χρονοδιακόπτης διακόπτει TIMSK = (1<5940 || Timer2 > 5940) ( Timer1 = 0; Timer2 = 0; ) ) void process_reset() (init_data(); ) void process_timeoff() (init_data(); sound_on(30); ) void process_pause() ( ActiveTimer = 0; ) void process_player1() ( ActiveTimer = 2; ) void process_player2() ( ActiveTimer = 1; ) void handle_button(int key) ( int bit; switch (key) ( case KEY_SETUP: bit = SETUP_BIT; break; case KEY_RESET: bit = RESET ; διάλειμμα; περίπτωση KEY_PAUSE: bit = PAUSE_BIT; διάλειμμα; περίπτωση KEY_PLAYER1: bit = PLAYER1_BIT; διάλειμμα; περίπτωση KEY_PLAYER2: bit = PLAYER2_BIT; διάλειμμα; προεπιλογή: επιστροφή; ) εάν (bit_is_clear(BUTTON_PIN, bit = if (_bit)=) 0) ( _delay_ms(DEBOUNCE_TIME); if (bit_is_clear(BUTTON_PIN, bit)) ( _πατήθηκε |= πλήκτρο; // διακόπτης ενεργειών πλήκτρων (κλειδί) (περίπτωση KEY_SETUP: process_setup(); break; case KEY_RESET: process_reset(); break; περίπτωση KEY_PAUSE: process_pause(); break; case KEY_PLAYER1: process_player1(); break; case KEY_PLAYER2: process_player2(); break; ) sound_on(15); ) ) ) other ( _πατήθηκε &= ~πλήκτρο; ) ) void handle_buttons() ( handle_button(KEY_SETUP); handle_button(KEY_RESET); handle_button(KEY_PAUSE); handle_button(KEY_PLAYER1); handle_button(KEY_PLAYER2); ) void displaynumber(1) (0) (0b displayim) 00) . 10. %60)/10, 0b00100000); _delay_ms(0.25); display_number((Timer2%60)%10, 0b00010000); _delay_ms(0.25); PORTD = 0; ) void display_number(int number, int mask) (αριθμός) PORTD = μάσκα

Το πρωτότυπο συναρμολογήθηκε σε ένα breadboard.

Μάθημα 0.

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

Σήμερα θα συζητηθούν τα ακόλουθα ερωτήματα:

  1. Τι είναι ένας μικροελεγκτής;
  2. Πού χρησιμοποιούνται οι μικροελεγκτές;

Εισαγωγή.

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

Τι είναι λοιπόν ένας μικροελεγκτής;

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

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

Πού χρησιμοποιούνται οι μικροελεγκτές;

  1. Οικιακές συσκευές (πλυντήρια, φούρνοι μικροκυμάτων κ.λπ.).
  2. Κινητή τεχνολογία (Ρομπότ, ρομποτικά συστήματα, εξοπλισμός επικοινωνιών κ.λπ.).
  3. Βιομηχανικός εξοπλισμός (συστήματα ελέγχου μηχανών).
  4. Τεχνολογία Η/Υ (Μητρικές πλακέτες, συστήματα ελέγχου περιφερειακών συσκευών).
  5. Εξοπλισμός ψυχαγωγίας (Παιδικά παιχνίδια, διακοσμητικά).
  6. Μεταφορές (συστήματα ελέγχου κινητήρα αυτοκινήτου, συστήματα ασφαλείας)

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

Ξεκινώντας με το AVR

AVR- μια οικογένεια μικροελεγκτών της Atmel. Έχουν επαρκή απόδοση για τις περισσότερες ερασιτεχνικές συσκευές. Χρησιμοποιούνται επίσης ευρέως στη βιομηχανία.

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

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

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

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

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

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

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

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

Επί του παρόντος, υπάρχουν πολλοί μεταγλωττιστές C για AVR. Ο πιο ισχυρός από αυτούς θεωρείται ο μεταγλωττιστής από την IAR Systems από τη Στοκχόλμη. Ήταν οι υπάλληλοί της που συμμετείχαν στην ανάπτυξη του συστήματος εντολών AVR στα μέσα της δεκαετίας του '90. Το IAR C Compiler έχει εκτεταμένες δυνατότητες βελτιστοποίησης κώδικα και διατίθεται ως μέρος του ολοκληρωμένου περιβάλλοντος ανάπτυξης IAR Embedded Workbench (EWB), το οποίο περιλαμβάνει επίσης έναν μεταγλωττιστή assembler, έναν σύνδεσμο, έναν διαχειριστή έργου και βιβλιοθήκης και έναν εντοπισμό σφαλμάτων. Η τιμή της πλήρους έκδοσης του πακέτου είναι 2820 EUR. Στην ιστοσελίδα της εταιρείας μπορείτε να κατεβάσετε μια δωρεάν έκδοση αξιολόγησης για 30 ημέρες ή μια απεριόριστη έκδοση με όριο μεγέθους κωδικού 4 KB.

Η αμερικανική εταιρεία Image Craft από το Palo Alto της Καλιφόρνια παράγει έναν μεταγλωττιστή γλώσσας C που έχει κερδίσει αρκετά μεγάλη δημοτικότητα. Το JumpStart C για AVR έχει αποδεκτή βελτιστοποίηση κώδικα και όχι πολύ υψηλή τιμή (από 50 $ έως 499 $ ανάλογα με την έκδοση). Η δοκιμαστική έκδοση του JumpStart C για AVR είναι πλήρως λειτουργική για 45 ημέρες.

Ο ρουμανικός μεταγλωττιστής Code Vision AVR C έχει κερδίσει λιγότερη δημοτικότητα· η τιμή της πλήρους έκδοσης αυτού του μεταγλωττιστή είναι σχετικά χαμηλή και ανέρχεται στα 150 EUR. Ο μεταγλωττιστής συνοδεύεται από ένα ενσωματωμένο περιβάλλον ανάπτυξης, το οποίο, εκτός από τις τυπικές δυνατότητες, περιλαμβάνει ένα αρκετά ενδιαφέρον χαρακτηριστικό - CodeWizardAVR Automatic Program Generator. Η παρουσία ενός σειριακού τερματικού στο περιβάλλον ανάπτυξης σάς επιτρέπει να κάνετε εντοπισμό σφαλμάτων προγραμμάτων χρησιμοποιώντας τη σειριακή θύρα του μικροελεγκτή. Μπορείτε να κάνετε λήψη μιας δωρεάν έκδοσης αξιολόγησης από τους προγραμματιστές με όριο μεγέθους κώδικα 4 KB και απενεργοποιημένη αποθήκευση του πηγαίου κώδικα που δημιουργήθηκε σε C.

Η εταιρεία MikroElektronika, που βρίσκεται στη σερβική πόλη του Βελιγραδίου, παράγει μια ολόκληρη οικογένεια μεταγλωττιστών για μικροελεγκτές AVR. Ένας μεταγλωττιστής για τη γλώσσα C που ονομάζεται mikroC PRO για AVR κοστίζει 249 $. Υπάρχουν επίσης mikroBasic και mikroPascal στην ίδια τιμή. Υπάρχουν εκδόσεις επίδειξης στον ιστότοπο των προγραμματιστών με όριο μεγέθους κώδικα 4096 byte. Το πλεονέκτημα αυτής της οικογένειας μεταγλωττιστών είναι μια ενιαία πλατφόρμα και μια ενιαία ιδεολογία, που μπορεί να προσφέρει εύκολη μετάβαση όχι μόνο μεταξύ γλωσσών, αλλά και μεταξύ μικροελεγκτών (υπάρχουν εκδόσεις μεταγλωττιστή για PIC, STM32, 8051...).

Το ολοκληρωμένο περιβάλλον ανάπτυξης έχει γίνει πραγματικά εμβληματικό. Περιλαμβάνει ισχυρούς μεταγλωττιστές C και assembler, τον προγραμματιστή AVRDUDE, έναν εντοπισμό σφαλμάτων, έναν προσομοιωτή και πολλά άλλα υποστηρικτικά προγράμματα και βοηθητικά προγράμματα. Το WinAVR ενσωματώνεται άψογα με το περιβάλλον ανάπτυξης AVR Studio της Atmel. Η assembler είναι πανομοιότυπη στον κωδικό εισόδου με τη assembler AVR Studio. Οι μεταγλωττιστές C και assembler έχουν τη δυνατότητα να δημιουργούν αρχεία εντοπισμού σφαλμάτων σε μορφή COFF, η οποία σας επιτρέπει να χρησιμοποιείτε όχι μόνο ενσωματωμένα εργαλεία, αλλά και να χρησιμοποιείτε τον ισχυρό προσομοιωτή AVR Studio. Ένα άλλο σημαντικό πλεονέκτημα είναι ότι το WinAVR διανέμεται δωρεάν χωρίς περιορισμούς (οι κατασκευαστές υποστηρίζουν τη Γενική Δημόσια Άδεια GNU).

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

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


Μπλουζα