Πίνακας περιεχομένων:

Φροντιστήριο AVR Assembler 1: 5 Βήματα
Φροντιστήριο AVR Assembler 1: 5 Βήματα

Βίντεο: Φροντιστήριο AVR Assembler 1: 5 Βήματα

Βίντεο: Φροντιστήριο AVR Assembler 1: 5 Βήματα
Βίντεο: LDmicro 1: Introduction (Microcontroller PLC Ladder Logic Programming with LDmicro) 2024, Ιούλιος
Anonim
Φροντιστήριο AVR Assembler 1
Φροντιστήριο AVR Assembler 1

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

Τρέχω το Arch linux και δουλεύω σε ένα atmega328p-pu που έχει ρυθμιστεί σε ένα breadboard. Μπορείτε να το κάνετε με τον ίδιο τρόπο όπως εγώ ή μπορείτε απλά να συνδέσετε ένα arduino στον υπολογιστή σας και να εργαστείτε στον μικροελεγκτή με αυτόν τον τρόπο.

Θα γράψουμε προγράμματα για το 328p όπως αυτό που υπάρχει στα περισσότερα arduino, αλλά θα πρέπει να σημειώσετε ότι αυτά τα ίδια προγράμματα και τεχνικές θα λειτουργήσουν επίσης για οποιονδήποτε από τους μικροελεγκτές Atmel και αργότερα (εάν υπάρχει ενδιαφέρον) θα συνεργαστούμε με μερικούς τα άλλα επίσης. Οι λεπτομέρειες του μικροελεγκτή βρίσκονται στα φύλλα δεδομένων Atmel και στο εγχειρίδιο οδηγιών. Τα επισυνάπτω σε αυτό το διδακτικό.

Εδώ είναι αυτό που θα χρειαστείτε:

1. Μια σανίδα ψωμιού

2. Ένα Arduino, ή απλώς ο μικροελεγκτής

3. Υπολογιστής με Linux

4. Ο συναρμολογητής avra χρησιμοποιώντας git: git clone https://github.com/Ro5bert/avra.git ή αν χρησιμοποιείτε ubuntu ή σύστημα βασισμένο σε debian απλά πληκτρολογήστε "sudo apt install avra" και θα λάβετε και τα δύο avr assembler και avrdude. Πάντως, αν λάβετε την τελευταία έκδοση χρησιμοποιώντας το github, θα λάβετε επίσης όλα τα απαραίτητα αρχεία συμπερίληψης, με άλλα λόγια έχει ήδη τα αρχεία m328Pdef.inc και tn85def.inc.

5. avrdude

Το πλήρες σετ των μαθημάτων μου για το AVR assembler μπορείτε να το βρείτε εδώ:

Βήμα 1: Δημιουργήστε έναν πίνακα δοκιμών

Δημιουργήστε έναν πίνακα δοκιμών
Δημιουργήστε έναν πίνακα δοκιμών

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

Για όσους από εσάς συμφωνείτε, μπορείτε να τραβήξετε τον μικροελεγκτή από το arduino σας και στη συνέχεια να ξεκινήσετε κατασκευάζοντας ένα "Breadboard Arduino" ακολουθώντας τις οδηγίες εδώ:

Στην εικόνα παρουσιάζω τη ρύθμισή μου η οποία αποτελείται από δύο αυτόνομα Atmega328p σε ένα μεγάλο breadboard (θέλω να μπορώ να διατηρώ το προηγούμενο σεμινάριο ενσύρματο και φορτωμένο σε έναν μικροελεγκτή ενώ δουλεύω στον επόμενο). Έχω ρυθμίσει το τροφοδοτικό έτσι ώστε η κορυφαία ράγα να είναι 9V και όλες οι άλλες 5V από τον ρυθμιστή τάσης. Χρησιμοποιώ επίσης ένα FT232R breakout board για να προγραμματίσω τα τσιπ. Τα αγόρασα και τα έβαλα μόνος μου bootloaders, αλλά αν μόλις τραβήξατε ένα από ένα Arduino τότε είναι μια χαρά ήδη.

Σημειώστε ότι εάν το δοκιμάζετε με ένα ATtiny85 τότε μπορείτε απλά να αποκτήσετε το Sparkfun Tiny Programmer εδώ: https://www.sparkfun.com/products/11801# και στη συνέχεια απλά να το συνδέσετε στη θύρα USB του υπολογιστή σας. Θα πρέπει πρώτα να εγκαταστήσετε ένα πρόγραμμα εκκίνησης στο Attiny85 και ο ευκολότερος τρόπος είναι απλώς να χρησιμοποιήσετε το Arduino IDE. Ωστόσο, θα χρειαστεί να κάνετε κλικ στο αρχείο και στις προτιμήσεις και, στη συνέχεια, να προσθέσετε αυτήν τη διεύθυνση URL νέων πινάκων: https://raw.githubusercontent.com/damellis/attiny/ide-1.6.x-boards-manager/package_damellis_attiny_index.json που θα σας επιτρέπουν να εγκαταστήσετε τον φορτωτή εκκίνησης (εάν το ATtiny85 δεν ήταν ήδη διαθέσιμο.)

Βήμα 2: Εγκαταστήστε το Assembler και το Avrdude

Τώρα μπορείτε να κατεβάσετε και να εγκαταστήσετε το assembler και το avrdude από τους συνδέσμους που δίνονται στο πρώτο βήμα αυτού του σεμιναρίου. Είναι πιθανό ότι εάν έχετε ήδη εργαστεί με το Arduino, τότε έχετε ήδη εγκαταστήσει το avrdude.

Αφού εγκαταστήσετε το avra, θα παρατηρήσετε ότι υπάρχει ένας υποκατάλογος που συνοδεύει τον τίτλο "πηγές" και μέσα σε αυτόν τον κατάλογο υπάρχουν ένα σωρό αρχεία συμπερίληψης. Αυτοί είναι όλοι οι μικροελεγκτές που μπορείτε να προγραμματίσετε με το avra. Θα παρατηρήσετε αμέσως ότι δεν υπάρχει αρχείο για το 328p που χρησιμοποιούμε εδώ. Έχω επισυνάψει ένα. Το αρχείο θα πρέπει να ονομάζεται m328Pdef.inc και θα πρέπει να το βάλετε μέσα στον κατάλογο περιλαμβάνει ή οπουδήποτε αλλού θέλετε. Θα το συμπεριλάβουμε στα προγράμματα της γλώσσας συνέλευσης. Το μόνο που χρειάζεται είναι να δώσουμε σε κάθε έναν από τους καταχωρητές στα ονόματα των μικροελεγκτών από το φύλλο δεδομένων, έτσι ώστε να μην χρειαστεί να χρησιμοποιήσουμε τα δεκαεξαδικά ονόματά τους. Το παραπάνω αρχείο περιλαμβάνει "οδηγίες πραγματισμού", καθώς σχεδιάστηκε για προγραμματισμό C και C ++. Εάν βαρεθήκατε να βλέπετε τον συναρμολογητή να φτύνει τα παράπονα "αγνοώντας την οδηγία του πράγματος", απλώς μπείτε στο αρχείο και διαγράψτε ή σχολιάστε όλες τις γραμμές που ξεκινούν με #pragma

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

Σημείωση: Εάν χρησιμοποιείτε το ATtiny85 αντί για το ATmega328P, τότε χρειάζεστε ένα διαφορετικό αρχείο συμπερίληψης που ονομάζεται tn85def.inc. Θα το επισυνάψω επίσης (σημειώστε ότι έπρεπε να το ονομάσω tn85def.inc.txt έτσι ώστε το Instructables να μου επιτρέψει να το ανεβάσω.) ΠΑΝΤΩΣ, αν έχετε το avra assembler από το github τότε έχετε ήδη και τα δύο αυτά αρχεία μαζί του. Προτείνω λοιπόν να το αποκτήσετε και να το συντάξετε μόνοι σας: git clone

Βήμα 3: Γεια σου Κόσμο

Ο στόχος αυτού του πρώτου σεμιναρίου είναι να χτίσει το τυπικό πρώτο πρόγραμμα που γράφει κάποιος όταν μαθαίνει οποιαδήποτε νέα γλώσσα ή εξερευνά οποιαδήποτε νέα πλατφόρμα ηλεκτρονικών. "Γειά σου Κόσμε!." Στην περίπτωσή μας, απλώς θέλουμε να γράψουμε ένα πρόγραμμα γλώσσας συναρμολόγησης, να το συναρμολογήσουμε και να το ανεβάσουμε στον μικροελεγκτή μας. Το πρόγραμμα θα προκαλέσει την ενεργοποίηση μιας λυχνίας LED. Το να αναβοσβήνει ένα LED όπως κάνουν για το κανονικό πρόγραμμα Arduino hello world είναι στην πραγματικότητα ένα πολύ πιο περίπλοκο πρόγραμμα στη γλώσσα συναρμολόγησης και έτσι δεν θα το κάνουμε ακόμα. Θα γράψουμε τον απλούστερο κώδικα "γυμνά κόκαλα" με ελάχιστο περιττό χνούδι.

Συνδέστε πρώτα ένα LED από το PB5 (δείτε το διάγραμμα pinout) που ονομάζεται επίσης Digital Out 13 σε ένα arduino, σε μια αντίσταση 220 ohm και μετά στο GND. Δηλ.

PB5 - LED - R (220 ohm) - GND

Τώρα για να γράψω το πρόγραμμα. Ανοίξτε τον αγαπημένο σας επεξεργαστή κειμένου και δημιουργήστε ένα αρχείο που ονομάζεται "hello.asm"

γεια σου.ασμ

? ανάβει ένα LED που είναι συνδεδεμένο στο PB5 (ψηφιακή έξοδος 13). Συμπεριλάβετε "./m328Pdef.inc" ldi r16, 0b00100000 out DDRB, r16 out PortB, r16 Έναρξη: rjmp Έναρξη

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

Αφού δημιουργήσετε το αρχείο, τότε σε ένα τερματικό το συναρμολογείτε ως εξής:

avra γεια σου.ασμ

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

avrdude -p m328p -c stk500v1 -b 57600 -P /dev /ttyUSB0 -U flash: w: hello.hex

εάν χρησιμοποιείτε arduino breadboard θα πρέπει να πατήσετε το κουμπί επαναφοράς στο arduino breadboard λίγο πριν εκτελέσετε την παραπάνω εντολή. Σημειώστε ότι μπορεί επίσης να χρειαστεί να προσθέσετε ένα sudo μπροστά ή να το εκτελέσετε ως root. Σημειώστε επίσης ότι σε ορισμένα arduino (όπως το Arduino UNO) πιθανότατα θα πρέπει να αλλάξετε το ρυθμό μετάδοσης bit σε -b 115200 και τη θύρα -P /dev /ttyACM0 (εάν λάβετε ένα σφάλμα από το avrdude σχετικά με μια μη έγκυρη υπογραφή συσκευής, απλά προσθέστε ένα - F στην εντολή)

Εάν όλα έχουν λειτουργήσει όπως θα έπρεπε, τώρα θα έχετε ανάψει ένα LED….. "Hello World!"

Εάν χρησιμοποιείτε το ATtiny85, τότε η εντολή avrdude θα είναι:

avrdude -p attiny85 -c usbtiny -U flash: w: hello.hex

Βήμα 4: Hello.asm Γραμμή-γραμμή

Για να ολοκληρώσουμε αυτό το εισαγωγικό σεμινάριο, θα περάσουμε από το πρόγραμμα hello.asm σειρά-γραμμές για να δούμε πώς λειτουργεί.

γεια σου.ασμ

? ανάβει ένα LED που είναι συνδεδεμένο στο PB5 (ψηφιακή έξοδος 13)

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

.συμπεριλάβετε "./m328Pdef.inc"

Αυτή η γραμμή λέει στον συναρμολογητή να συμπεριλάβει το αρχείο m328Pdef.inc που κατεβάσατε. Μπορεί να θέλετε να το τοποθετήσετε σε έναν κατάλογο παρόμοιων αρχείων και να αλλάξετε την παραπάνω γραμμή για να το δείξετε εκεί.

ldi r16, 0b00100000

Το ldi σημαίνει "άμεση φόρτωση" και λέει στον συναρμολογητή να πάρει ένα μητρώο εργασίας, r16 σε αυτή την περίπτωση, και να φορτώσει έναν δυαδικό αριθμό σε αυτόν, 0b00100000 σε αυτή την περίπτωση. Το 0b μπροστά λέει ότι ο αριθμός μας είναι δυαδικός. Αν θέλαμε θα μπορούσαμε να είχαμε επιλέξει άλλη βάση, όπως η δεκαεξαδική. Σε αυτήν την περίπτωση, ο αριθμός μας θα ήταν 0x20, ο οποίος είναι δεκαεξαδικός για 0b00100000. Or θα μπορούσαμε να χρησιμοποιήσουμε 32 που είναι δεκαδική βάση 10 για τον ίδιο αριθμό.

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

Η χρήση του δυαδικού είναι απλούστερη λόγω του τρόπου λειτουργίας των Ports and Registers. Θα συζητήσουμε τις θύρες και τους καταχωρητές του atmega328p με περισσότερες λεπτομέρειες σε μελλοντικά μαθήματα, αλλά προς το παρόν απλώς θα δηλώσω ότι χρησιμοποιούμε το r16 ως "μητρώο εργασίας", πράγμα που σημαίνει ότι θα το χρησιμοποιήσουμε ως μεταβλητή που αποθηκεύουμε αριθμοί μέσα. Ένας "καταχωρητής" είναι ένα σύνολο 8 bit. Σημαίνει 8 σημεία που μπορεί να είναι 0 ή 1 («απενεργοποιημένο» ή «ενεργοποιημένο»). Όταν φορτώνουμε τον δυαδικό αριθμό 0b00100000 στον καταχωρητή χρησιμοποιώντας την παραπάνω γραμμή, έχουμε απλώς αποθηκεύσει αυτόν τον αριθμό στον καταχωρητή r16.

έξω DDRB, r16

Αυτή η γραμμή λέει στον μεταγλωττιστή να αντιγράψει τα περιεχόμενα του καταχωρητή r16 στον καταχωρητή DDRB. Το DDRB σημαίνει "Data Direction Register B" και ρυθμίζει τις "καρφίτσες" στο PortB. Στο χάρτη pinout για το 328p μπορείτε να δείτε ότι υπάρχουν 8 ακίδες με ετικέτα PB0, PB1,…, PB7. Αυτές οι καρφίτσες αντιπροσωπεύουν τα "bits" του "PortB" και όταν φορτώνουμε τον δυαδικό αριθμό 00100000 στον καταχωρητή DDRB λέμε ότι θέλουμε τα PB0, PB1, PB2, PB3, PB4, PB6 και PB7 να έχουν οριστεί ως ακίδες INPUT 0 σε αυτά και το PB5 ορίζεται ως πείρος ΕΞΟΔΟΥ αφού βάζουμε 1 σε αυτό το σημείο.

έξω PortB, r16

Τώρα που έχουμε καθορίσει τις κατευθύνσεις των ακίδων, μπορούμε τώρα να ορίσουμε τις τάσεις σε αυτές. Η παραπάνω γραμμή αντιγράφει τον ίδιο δυαδικό αριθμό από τον καταχωρητή αποθήκευσης r16 στο PortB. Αυτό ρυθμίζει όλους τους πείρους στα 0 βολτ εκτός από τον πείρο PB5 στο HIGH που είναι 5 βολτ.

Άσκηση 2: Πάρτε ένα ψηφιακό πολύμετρο, συνδέστε το μαύρο καλώδιο στη γείωση (GND) και στη συνέχεια δοκιμάστε κάθε έναν από τους πείρους PB0 έως PB7 με το κόκκινο καλώδιο. Είναι οι τάσεις σε κάθε έναν από τους ακροδέκτες ακριβώς εκείνες που αντιστοιχούν στην τοποθέτηση του 0b00100000 στο PortB; Εάν υπάρχουν κάποια που δεν είναι, γιατί νομίζετε ότι είναι; (δείτε το pin map)

Αρχή:

rjmp Έναρξη

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

Άσκηση 3: Αφαιρέστε τις δύο παραπάνω γραμμές από τον κωδικό σας, έτσι ώστε το πρόγραμμα να πέσει από έναν γκρεμό. Τι γίνεται; Θα πρέπει να δείτε κάτι που μοιάζει με το παραδοσιακό πρόγραμμα "blink" που χρησιμοποιείται από το Arduino ως "γεια σας κόσμο!". Γιατί πιστεύετε ότι λειτουργεί έτσι; (Σκεφτείτε τι πρέπει να συμβεί όταν το πρόγραμμα πέσει από έναν γκρεμό …)

Βήμα 5: Συμπέρασμα

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

Σε αυτό το σεμινάριο έχετε μάθει πώς να χρησιμοποιείτε τις ακόλουθες εντολές:

ldi hregister, αριθμός φορτώνει έναν αριθμό (0-255) σε ένα μητρώο άνω μισού (16-31)

εκτός ioregister, μητρώο αντιγράφει έναν αριθμό από ένα μητρώο εργασίας σε ένα μητρώο εισόδου/εξόδου

Η ετικέτα rjmp πηδά στη γραμμή του προγράμματος που φέρει την ένδειξη "ετικέτα" (η οποία δεν μπορεί να απέχει περισσότερο από 204 οδηγίες - δηλ. σχετικό άλμα)

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

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

Συνιστάται: