Inhaltsverzeichnis:
- Schritt 1: Konstruieren Sie ein Testboard
- Schritt 2: Installieren Sie den Assembler und Avrdude
- Schritt 3: Hallo Welt
- Schritt 4: Hello.asm Zeile für Zeile
- Schritt 5: Fazit
Video: AVR Assembler Tutorial 1: 5 Schritte
2024 Autor: John Day | [email protected]. Zuletzt bearbeitet: 2024-01-30 07:15
Ich habe beschlossen, eine Reihe von Tutorials zum Schreiben von Assemblersprachprogrammen für den Atmega328p zu schreiben, den Mikrocontroller, der im Arduino verwendet wird. Wenn die Leute interessiert bleiben, werde ich weiterhin etwa eine Woche oder so veröffentlichen, bis ich keine Freizeit mehr habe oder die Leute aufhören, sie zu lesen.
Ich verwende Arch Linux und arbeite an einem atmega328p-pu, das auf einem Steckbrett eingerichtet ist. Sie können es genauso machen wie ich oder Sie können einfach ein Arduino an Ihren Computer anschließen und auf diese Weise am Mikrocontroller arbeiten.
Wir werden Programme für den 328p schreiben, wie sie in den meisten Arduinos enthalten sind, aber Sie sollten beachten, dass dieselben Programme und Techniken auch für jeden der Atmel-Mikrocontroller funktionieren und später (wenn Interesse besteht) werden wir mit einigen von arbeiten die anderen auch. Die Details des Mikrocontrollers finden Sie in den Atmel Datenblättern und dem Instruction Set Manual. Ich befestige sie an diesem instructable.
Hier ist, was Sie brauchen:
1. Ein Steckbrett
2. Ein Arduino oder nur der Mikrocontroller
3. Ein Computer mit Linux
4. Der Avra-Assembler mit git: git clone https://github.com/Ro5bert/avra.git oder wenn Sie Ubuntu oder ein debian-basiertes System verwenden, geben Sie einfach "sudo apt install avra" ein und Sie erhalten sowohl den avr-Assembler und avrdude. Wenn Sie jedoch die neueste Version mit github erhalten, erhalten Sie auch alle erforderlichen Include-Dateien, dh sie enthält bereits die Dateien m328Pdef.inc und tn85def.inc.
5. avrdude
Das komplette Set meiner AVR-Assembler-Tutorials finden Sie hier:
Schritt 1: Konstruieren Sie ein Testboard
Sie können einfach Ihr Arduino verwenden und alles in diesen Tutorials dazu tun, wenn Sie möchten. Da wir jedoch über die Codierung in Assembler sprechen, besteht unsere Philosophie von Natur aus darin, alle Peripheriegeräte zu entfernen und direkt mit dem Mikrocontroller selbst zu interagieren. Meinst du nicht, es würde mehr Spaß machen, es so zu machen?
Für diejenigen unter Ihnen, die zustimmen, können Sie den Mikrocontroller aus Ihrem Arduino ziehen und dann mit dem Bau eines "Breadboard Arduino" beginnen, indem Sie den Anweisungen hier folgen:
Auf dem Bild zeige ich mein Setup, das aus zwei eigenständigen Atmega328p auf einem großen Steckbrett besteht (ich möchte in der Lage sein, das vorherige Tutorial verkabelt und auf einem Mikrocontroller geladen zu halten, während ich am nächsten arbeite). Ich habe das Netzteil so eingerichtet, dass die oberste Schiene 9 V beträgt und alle anderen 5 V vom Spannungsregler. Ich verwende auch ein FT232R-Breakout-Board, um die Chips zu programmieren. Ich habe sie gekauft und selbst Bootloader installiert, aber wenn Sie nur einen aus einem Arduino gezogen haben, ist es bereits in Ordnung.
Beachten Sie, dass Sie, wenn Sie dies mit einem ATtiny85 versuchen, den Sparkfun Tiny Programmer einfach hier herunterladen können: https://www.sparkfun.com/products/11801# und ihn dann einfach in den USB-Anschluss Ihres Computers stecken. Sie müssen zuerst einen Bootloader auf dem Attiny85 installieren und der einfachste Weg ist die Verwendung der Arduino IDE. Sie müssen jedoch auf Datei und Einstellungen klicken und dann diese URL für neue Boards hinzufügen: https://raw.githubusercontent.com/damellis/attiny/ide-1.6.x-boards-manager/package_damellis_attiny_index.json ermöglichen es Ihnen, den Bootloader zu installieren (falls Ihr ATtiny85 noch nicht mit einem geliefert wurde.)
Schritt 2: Installieren Sie den Assembler und Avrdude
Sie können nun den Assembler und avrdude über die im ersten Schritt dieses Tutorials angegebenen Links herunterladen und installieren. Wenn Sie bereits mit Arduinos gearbeitet haben, ist es wahrscheinlich, dass Sie Avrdude bereits installiert haben.
Nachdem Sie avra installiert haben, werden Sie feststellen, dass es ein Unterverzeichnis namens "sources" gibt, in dem sich eine Reihe von Include-Dateien befinden. Dies sind alle Mikrocontroller, die Sie mit avra programmieren können. Sie werden sofort feststellen, dass es keine Datei für das 328p gibt, das wir hier verwenden. Ich habe eine angehängt. Die Datei sollte m328Pdef.inc heißen und in das include-Verzeichnis oder an eine andere beliebige Stelle gelegt werden. Wir werden es in unsere Assembler-Programme aufnehmen. All dies bewirkt, dass jedem der Register in den Mikrocontrollern Namen aus dem Datenblatt gegeben werden, damit wir ihre hexadezimalen Namen nicht verwenden müssen. Die obige Include-Datei enthält "Pragma-Direktiven", da sie für die C- und C++-Programmierung entwickelt wurde. Wenn Sie es satt haben, dass der Assembler Beschwerden über "Ignorieren der Pragma-Direktive" ausspuckt, gehen Sie einfach in die Datei und löschen oder kommentieren Sie alle Zeilen, die mit #pragma beginnen
Okay, jetzt, da Sie Ihren Mikrocontroller, Ihren Assembler und Ihren Programmierer fertig haben, können wir unser erstes Programm schreiben.
Hinweis: Wenn Sie den ATtiny85 anstelle des ATmega328P verwenden, benötigen Sie eine andere Include-Datei namens tn85def.inc. Ich werde es auch anhängen (beachten Sie, dass ich es tn85def.inc.txt nennen musste, damit Instructables es mir ermöglichen würde, es hochzuladen.) Wenn Sie jedoch den Avra-Assembler von github erhalten haben, haben Sie bereits beide Dateien dabei. Daher empfehle ich, es zu besorgen und selbst zu kompilieren: git clone
Schritt 3: Hallo Welt
Das Ziel dieses ersten Tutorials ist es, das erste Standardprogramm zu erstellen, das man schreibt, wenn man eine neue Sprache lernt oder eine neue elektronische Plattform erforscht. "Hallo Welt!." In unserem Fall wollen wir einfach ein Assemblerprogramm schreiben, es zusammenbauen und auf unseren Mikrocontroller hochladen. Das Programm lässt eine LED aufleuchten. Eine LED zum "Blinken" zu bringen, wie sie es für das normale Arduino-Hello-World-Programm tun, ist in der Assemblersprache eigentlich ein viel komplizierteres Programm und wir werden das noch nicht tun. Wir werden den einfachsten "nackten" Code mit minimalem unnötigen Flaum schreiben.
Verbinden Sie zuerst eine LED von PB5 (siehe Pinbelegungsdiagramm), die auf einem Arduino auch als Digital Out 13 bezeichnet wird, an einen 220 Ohm Widerstand, dann an GND. D.h.
PB5 -- LED -- R(220 Ohm) -- GND
Schreiben Sie nun das Programm. Öffnen Sie Ihren bevorzugten Texteditor und erstellen Sie eine Datei namens "hello.asm".
;hallo.asm
; schaltet eine LED ein die an PB5 angeschlossen ist (digital out 13).include "./m328Pdef.inc" ldi r16, 0b00100000 out DDRB, r16 out PortB, r16 Start: rjmp Start
Das obige ist der Code. Wir werden es in einer Minute Zeile für Zeile durchgehen, aber zuerst stellen wir sicher, dass wir es auf Ihrem Gerät zum Laufen bringen können.
Nachdem Sie die Datei erstellt haben, bauen Sie sie in einem Terminal wie folgt zusammen:
avra hallo.asm
Dadurch wird Ihr Code zusammengestellt und eine Datei namens hello.hex erstellt, die wir wie folgt hochladen können:
avrdude -p m328p -c stk500v1 -b 57600 -P /dev/ttyUSB0 -U flash:w:hello.hex
Wenn Sie ein Steckbrett-Arduino verwenden, müssen Sie die Reset-Taste auf dem Steckbrett-Arduino drücken, bevor Sie den obigen Befehl ausführen. Beachten Sie, dass Sie möglicherweise auch ein Sudo hinzufügen oder als Root ausführen müssen. Beachten Sie auch, dass Sie bei einigen Arduinos (wie dem Arduino UNO) wahrscheinlich die Bitrate auf -b 115200 und den Port -P /dev/ttyACM0 ändern müssen (wenn Sie von avrdude einen Fehler über eine ungültige Gerätesignatur erhalten, fügen Sie einfach ein - F zum Befehl)
Wenn alles funktioniert hat, leuchtet jetzt eine LED auf….. "Hallo Welt!"
Wenn Sie den ATtiny85 verwenden, lautet der avrdude-Befehl:
avrdude -p attiny85 -c usbtiny -U flash:w:hello.hex
Schritt 4: Hello.asm Zeile für Zeile
Um dieses Einführungs-Tutorial abzuschließen, werden wir das hello.asm-Programm Zeile für Zeile durchgehen, um zu sehen, wie es funktioniert.
;hallo.asm
; schaltet eine LED ein, die an PB5 angeschlossen ist (digital out 13)
Alles nach einem Semikolon wird vom Assembler ignoriert und daher sind diese ersten beiden Zeilen einfach "Kommentare", die erklären, was das Programm macht.
.include "./m328Pdef.inc"
Diese Zeile weist den Assembler an, die heruntergeladene Datei m328Pdef.inc einzuschließen. Sie können dies in einem Verzeichnis mit ähnlichen Include-Dateien ablegen und dann die obige Zeile so ändern, dass sie dort darauf zeigt.
ldi r16, 0b00100000
ldi steht für "load unmittelbar" und weist den Assembler an, ein Arbeitsregister, in diesem Fall r16, zu nehmen und eine Binärzahl hineinzuladen, in diesem Fall 0b00100000. Die 0b davor sagt, dass unsere Zahl binär ist. Wenn wir wollten, hätten wir eine andere Basis wählen können, beispielsweise hexadezimal. In diesem Fall wäre unsere Zahl 0x20 gewesen, was hexadezimal für 0b00100000 ist. Oder wir hätten 32 verwenden können, was eine Dezimalzahl zur Basis 10 für dieselbe Zahl ist.
Übung 1: Versuchen Sie, die Zahl in der obigen Zeile in Ihrem Code in hexadezimal und dann in dezimal zu ändern und überprüfen Sie, ob es in jedem Fall noch funktioniert.
Die Verwendung von Binärdateien ist jedoch aufgrund der Funktionsweise von Ports und Registern am einfachsten. Wir werden die Ports und Register des atmega328p in zukünftigen Tutorials genauer besprechen, aber vorerst werde ich nur angeben, dass wir r16 als unser "Arbeitsregister" verwenden, was bedeutet, dass wir es nur als Variable verwenden, die wir speichern Zahlen ein. Ein "Register" ist ein Satz von 8 Bits. Das bedeutet 8 Punkte, die entweder 0 oder 1 sein können (`off' oder `on'). Wenn wir die Binärzahl 0b00100000 mit der obigen Zeile in das Register laden, haben wir diese Zahl einfach im Register r16 gespeichert.
aus DDRB, r16
Diese Zeile weist den Compiler an, den Inhalt des Registers r16 in das DDRB-Register zu kopieren. DDRB steht für "Data Direction Register B" und richtet die "Pins" auf PortB ein. Auf der Pinbelegung des 328p können Sie sehen, dass es 8 Pins gibt, die mit PB0, PB1, …, PB7 beschriftet sind. Diese Pins stellen die "Bits" von "PortB" dar und wenn wir die Binärzahl 00100000 in das DDRB-Register laden, sagen wir, dass wir PB0, PB1, PB2, PB3, PB4, PB6 und PB7 als INPUT-Pins setzen wollen, da sie 0 ist in ihnen, und PB5 ist als OUTPUT-Pin gesetzt, da wir an dieser Stelle eine 1 setzen.
aus PortB, r16
Nachdem wir die Richtungen der Pins festgelegt haben, können wir nun die Spannungen an ihnen einstellen. Die obige Zeile kopiert dieselbe Binärzahl aus unserem Speicherregister r16 nach PortB. Dadurch werden alle Pins auf 0 Volt gesetzt, außer Pin PB5 auf HIGH, das 5 Volt beträgt.
Übung 2: Nehmen Sie ein Digitalmultimeter, stecken Sie das schwarze Kabel in Masse (GND) und testen Sie dann jeden der Pins PB0 bis PB7 mit dem roten Kabel. Entsprechen die Spannungen an jedem der Pins genau denen, die 0b00100000 in PortB stecken? Wenn es einige gibt, die es nicht sind, warum denkst du, dass das so ist? (siehe Pin-Map)
Start:
rjmp-Start
Schließlich ist die erste Zeile darüber ein "Label", das eine Stelle im Code kennzeichnet. In diesem Fall beschriften Sie diese Stelle als "Start". Die zweite Zeile sagt "relativer Sprung zum Label Start". Das Endergebnis ist, dass der Computer in eine Endlosschleife versetzt wird, die einfach immer wieder zum Start zurückkehrt. Wir brauchen dies, weil wir das Programm nicht einfach beenden oder von einer Klippe fallen lassen können, das Programm muss einfach weiterlaufen, damit das Licht leuchtet.
Übung 3: Entfernen Sie die beiden obigen Zeilen aus Ihrem Code, sodass das Programm von einer Klippe fällt. Was geschieht? Sie sollten etwas sehen, das wie das traditionelle "blink" -Programm aussieht, das von Arduino als "Hallo Welt!" verwendet wird. Warum, glauben Sie, verhält sich das so? (Denken Sie darüber nach, was passieren muss, wenn das Programm von einer Klippe fällt…)
Schritt 5: Fazit
Wenn Sie so weit gekommen sind, dann herzlichen Glückwunsch! Sie können nun Assemblercode schreiben, zusammenbauen und auf Ihren Mikrocontroller laden.
In diesem Tutorial haben Sie gelernt, wie Sie die folgenden Befehle verwenden:
ldi hregister, number lädt eine Zahl (0-255) in ein oberes halbes Register (16-31)
out ioregister, register kopiert eine Zahl von einem Arbeitsregister in ein E/A-Register
rjmp label springt in die Zeile des Programms, die mit "label" gekennzeichnet ist (die nicht weiter als 204 Anweisungen entfernt sein kann - d.h. relativer Sprung)
Jetzt, da diese Grundlagen aus dem Weg geräumt sind, können wir weiterhin interessanteren Code und interessantere Schaltungen und Geräte schreiben, ohne die Mechanik des Kompilierens und Hochladens diskutieren zu müssen.
Ich hoffe, Ihnen hat dieses Einführungs-Tutorial gefallen. Im nächsten Tutorial fügen wir eine weitere Schaltungskomponente (eine Schaltfläche) hinzu und erweitern unseren Code um Eingabeports und Entscheidungen.
Empfohlen:
AVR Assembler Tutorial 2: 4 Schritte
AVR Assembler Tutorial 2: Dieses Tutorial ist eine Fortsetzung von "AVR Assembler Tutorial 1" Wenn Sie Tutorial 1 noch nicht durchlaufen haben, sollten Sie jetzt aufhören und das zuerst tun. In diesem Tutorial werden wir unser Studium der Assemblersprachprogrammierung des atmega328p u
AVR-Assembler-Tutorial 6: 3 Schritte
AVR Assembler Tutorial 6: Willkommen bei Tutorial 6!Das heutige Tutorial wird kurz sein, in dem wir eine einfache Methode entwickeln, um Daten zwischen einem atmega328p und einem anderen über zwei Ports zu übertragen, die sie verbinden. Wir nehmen dann den Würfelroller aus Tutorial 4 und das Register
AVR-Assembler-Tutorial 8: 4 Schritte
AVR Assembler Tutorial 8: Willkommen zu Tutorial 8!In diesem kurzen Tutorial werden wir eine kleine Ablenkung von der Einführung neuer Aspekte der Assemblerprogrammierung nehmen, um zu zeigen, wie unsere Prototyping-Komponenten in eine separate "gedruckte" Leiterplatte. Die
AVR-Assembler-Tutorial 7: 12 Schritte
AVR Assembler Tutorial 7: Willkommen zu Tutorial 7!Heute werden wir zuerst zeigen, wie man eine Tastatur aufräumt und dann zeigt, wie man die analogen Eingangsports verwendet, um mit der Tastatur zu kommunizieren Eingang. Wir werden die Tastatur so verdrahten, dass
AVR-Assembler-Tutorial 9: 7 Schritte
AVR Assembler Tutorial 9: Willkommen bei Tutorial 9. Heute zeigen wir, wie man mit unserem ATmega328P und AVR Assembler-Sprachcode sowohl eine 7-Segment-Anzeige als auch eine 4-stellige Anzeige steuert. Dabei werden wir Umwege in der Nutzung des Stack machen müssen