Inhaltsverzeichnis:

TEIL 2 - GPIO ARM MONTAGE - RGB - FUNKTIONSAUFRUFE - Schalter - Gunook
TEIL 2 - GPIO ARM MONTAGE - RGB - FUNKTIONSAUFRUFE - Schalter - Gunook

Video: TEIL 2 - GPIO ARM MONTAGE - RGB - FUNKTIONSAUFRUFE - Schalter - Gunook

Video: TEIL 2 - GPIO ARM MONTAGE - RGB - FUNKTIONSAUFRUFE - Schalter - Gunook
Video: 5 Schreibtisch Upgrades die alles verändern! 2024, Juli
Anonim
TEIL 2 - GPIO ARM MONTAGE - RGB - FUNKTIONSAUFRUFE - Schalter
TEIL 2 - GPIO ARM MONTAGE - RGB - FUNKTIONSAUFRUFE - Schalter

In Teil 1 haben wir gelernt, wie man eine einzelne rote LED auf dem MSP432 LaunchPad-Entwicklungsboard von Texas Instruments umschaltet, indem man Assembler anstelle von C / C++ verwendet.

In diesem Instructable werden wir etwas Ähnliches tun - eine RGB-LED steuern, die sich auch auf derselben Platine befindet.

Auf diesem Weg hoffen wir, unser Wissen über die ARM-Montage zu erweitern und nicht nur Spaß beim Anzünden einiger LEDs zu haben.

Schritt 1: Lass uns direkt reinspringen

Eigentlich sagt das erste Video alles. Nicht viel mehr hinzuzufügen.

Der Hauptpunkt dabei ist, die Idee zu verdeutlichen, dass jeder I/O-Port des MSP432 aus einem Block von "Register"-Adressen besteht, die wiederum aus jeweils mehreren Bits bestehen.

Außerdem sind die Bits orthogonal gruppiert. Das heißt, Bit 0 jeder Registeradresse bezieht sich auf denselben externen E/A-Pin.

Wir haben die Idee wiederholt, dass es mehrere Registeradressen für diesen Port braucht, um etwas mit nur einem Bit oder Pin zu tun.

Da es sich in diesem Fall jedoch um eine RGB-LED handelt, müssen wir für jede Registeradresse mit drei Bits umgehen.

Wir haben bekräftigt, dass wir mehrere Register benötigen: das DIR-Register, das SEL0-Register, das SEL1-Register und das OUTPUT-Register. Und jedes Mal drei Bits.

Schritt 2: Code verbessern - Funktion hinzufügen

Image
Image

Wie Sie im obigen Schritt gesehen haben, hatte die Hauptprogrammschleife viel wiederholten Code, nämlich wenn wir die LEDs ausschalten.

So können wir dem Programm eine Funktion hinzufügen. Wir müssen diese Funktion immer noch jedes Mal aufrufen, wenn wir die LEDs ausschalten möchten, aber es führt dazu, dass ein Teil des Codes zu einer einzigen Anweisung zusammenfällt.

Wäre unser LED-Aus-Code mit viel mehr Anweisungen involviert gewesen, wäre dies eine echte Speicherersparnis gewesen.

Ein Teil der eingebetteten Programmierung und der Mikrocontroller ist sich der Programmgröße viel bewusster.

Das Video erklärt.

Im Wesentlichen fügen wir unserem Hauptcode eine Verzweigungsanweisung hinzu, und wir haben einen weiteren Codeblock, der die Funktion ist, zu der wir verzweigen. Und wenn wir fertig sind oder am Ende der Funktion, verzweigen wir zurück zur nächsten Anweisung innerhalb des Hauptprogramms.

Schritt 3: Hinzufügen einer Busy-Loop-Verzögerung

Fügen Sie im Abschnitt Deklarationen des Codes eine Konstante hinzu, um das gewünschte Timing zu vereinfachen:

; alle Wörter nach einem Semikolon (';') beginnen einen Kommentar.

; Der Code in diesem Teil weist einem Wert einen Namen zu.; Sie hätten auch '.equ' verwenden können, aber sie sind etwas anders.; '.equ' (glaube ich) kann nicht geändert werden, während '.set' bedeutet, dass Sie es können; Ändern Sie den Wert von 'DLYCNT' später im Code, wenn Sie möchten.;'DLYCNT' wird als Countdown-Wert im Verzögerungsunterprogramm verwendet. DLYCNT.set 0x30000

Fügen Sie eine neue Verzögerungsfunktion hinzu:

Verzögerung:.asmfunc; der Start des Unterprogramms oder der Funktion 'Verzögern'.

MOV R5, #DLYCNT; Laden Sie das Kern-CPU-Register R5 mit dem Wert, der 'DLYCNT' zugewiesen ist. dyloop; dies markiert den Beginn der Verzögerungsschleife. Assembler bestimmt Adresse. SUB R5, #0x1; subtrahiere eine 1 vom aktuellen Wert im Kern-CPU-Register R5. CMP R5, #0x0; vergleiche den aktuellen Wert in R5 mit 0. BGT dlyloop; Verzweigen Sie, wenn der Wert in R5 größer 0 ist, zu label(address) 'dlyloop'. BXLR; Wenn wir hier angekommen sind, bedeutet dies, dass der R5-Wert 0 war. Rückkehr vom Unterprogramm..endasmfunc; markiert das Ende des Unterprogramms.

Rufen Sie dann im Hauptteil innerhalb der Hauptschleife diese Verzögerungsfunktion auf:

; Dies ist ein Codefragment des Hauptkörpers oder der Hauptfunktion (siehe Datei 'main.asm').

; Dies ist eine Schleife in 'main' und zeigt, wie wir diese neue 'delay'-Funktion aufrufen oder verwenden.; '#REDON' und '#GRNON' sind ebenfalls Deklarationen (Konstanten) (siehe oben in 'main.asm').; Sie sind nur eine einfache Möglichkeit, die angegebene Farbe der RGB-LED einzustellen. loop MOV R0, #REDON;Rot - setzt das Core-CPU-Register R0 mit dem Wert, der 'REDON' zugewiesen ist. STRB R0, [R4];Kernregister R4 wurde zuvor mit einer GPIO-Ausgangsadresse gesetzt.;schreiben Sie, was in R0 steht, in die von R4 angegebene Adresse. BL-Verzögerung;verzweigen Sie zur neuen 'Verzögerungs'-Funktion. BL ledsoff;verzweigt zur bereits vorhandenen 'ledsoff'-Funktion. BL Verzögerung;dito MOV R0, #GRNON;Grün - dito STRB R0, [R4]; und so weiter. BL-Verzögerung BL-LEDsoff BL-Verzögerung

Das Video geht ins Detail.

Schritt 4: Prozeduraufrufstandard der ARM-Architektur (AAPCS)

Es ist wahrscheinlich ein guter Zeitpunkt, um etwas vorzustellen. Es ist eine Konvention in Assemblersprache. Auch bekannt als Prozeduraufrufstandard für die ARM-Architektur.

Das hat viel zu bieten, aber es ist nur ein Standard. Es hindert uns nicht daran, Assemblerprogrammierung zu erlernen, und wir können Teile dieses Standards im Laufe der Zeit übernehmen, sobald wir uns mit einigen Konzepten, die wir lernen, wohl fühlen.

Sonst könnten wir uns fühlen, als würden wir aus einem riesigen Wasserschlauch trinken. Zu viel Information.

Kernregister

Da wir uns mit den Kernregistern des MSP432 vertraut gemacht haben, versuchen wir nun, einige dieser Standards zu übernehmen. Wir werden uns daran halten, wenn wir die nächste Funktion schreiben (eine LED ein- / ausschalten).

1) Wir sollen R0 als Funktionsparameter verwenden. Wenn wir der Funktion (Unterprogramm) einen Wert übergeben möchten, sollten wir dazu R0 verwenden.

2) Wir sollen das Link-Register für seinen beabsichtigten Zweck verwenden - es enthält die Adresse, die angibt, wohin nach Abschluss der Subroutine zurückzukehren.

Sie werden sehen, wie wir diese anwenden.

Schritt 5: Funktion mit Parameter - Verschachtelte Funktionen

Wir können unseren Code bereinigen und den von ihm belegten Speicherplatz reduzieren, indem wir wiederholte Abschnitte zu einer einzigen Funktion kombinieren. Der einzige Unterschied im Hauptschleifenkörper besteht darin, dass wir einen Parameter benötigen, damit wir die verschiedenen Farben übergeben können, die wir von der RGB-LED sehen möchten.

Sehen Sie sich das Video an, um Details zu erfahren. (sorry für die länge)

Schritt 6: GPIO-Eingang - Schalter hinzufügen

Machen wir es interessanter. Es ist an der Zeit, unserem Montageprogramm etwas Schaltersteuerung hinzuzufügen.

Dieses Instructable hat Bilder, die zeigen, wie die beiden On-Board-Schalter mit dem MSP432 verbunden sind.

Im Wesentlichen: Schalter 1 (SW1 oder S1) ist mit P1.1 verbunden und Schalter 2 (SW2 oder S2) ist mit P1.4 verbunden.

Das macht die Sache nicht nur interessant, weil wir es mit Eingängen anstelle von Ausgängen zu tun haben, sondern auch, weil diese beiden Schalter zwei Bits desselben Registeradreßblocks belegen oder belegen, wie dies die einzelne rote LED, die ein Ausgang ist, tut.

Wir haben uns damit beschäftigt, die einzelne rote LED in diesem Instructable umzuschalten, also müssen wir nur Code hinzufügen, um die Schalter zu handhaben.

Port 1 Adressblock registrieren

Denken Sie daran, dass wir diese im vorherigen Instructable behandelt haben, aber wir müssen ein neues hinzufügen:

  • Port 1 Eingangsregisteradresse = 0x40004C00
  • Port 1 Ausgangsregisteradresse = 0x40004C02
  • Port 1 Richtung Registeradresse = 0x40004C04
  • Port 1 Resistor Enable Registeradresse = 0x40004C06
  • Port 1 Wählen Sie 0 Registeradresse = 0x40004C0A
  • Port 1 Wählen Sie 1 Registeradresse = 0x40004C0C

Wenn Sie die Ports als Eingänge verwenden, sollten Sie die internen Pull-Up- oder Pull-Down-Widerstände des MSP432 verwenden.

Da das Launchpad-Entwicklungsboard die beiden Schalter mit Masse verdrahtet hat (LOW wenn gedrückt), sollten wir Pull-UP-Widerstände verwenden, um sicherzustellen, dass wir ein festes HIGH haben, wenn sie nicht gedrückt sind.

Pull-Up / Pull-Down-Widerstände

Es sind zwei verschiedene Port-1-Registeradressen erforderlich, um diese Schaltereingänge mit Pullup-Widerständen zu verbinden.

1) Verwenden Sie das Port 1 Resistor-Enable-Register (0x40004C06), um nur anzugeben, dass Sie Widerstände (für diese beiden Bits) wünschen.

2) und verwenden Sie dann das Ausgangsregister von Port 1 (0x40004C02), um die Widerstände entweder als Pull-Up oder Pull-Down einzustellen. Es mag verwirrend erscheinen, dass wir ein Ausgangsregister für Eingänge verwenden. Das Output-Register hat fast einen doppelten Zweck.

Um es anders zu sagen, kann das Ausgangsregister entweder ein HIGH oder LOW an einen Ausgang (wie die einzelne rote LED) senden und / oder es wird verwendet, um Pull-Up- oder Pull-Down-Widerstände für Eingänge zu setzen, ABER NUR, wenn diese Funktion über das Resistor-Enable-Register aktiviert wurde.

Wichtig im Obigen - Wenn Sie ein LOW oder HIGH an ein beliebiges Ausgangsbit senden/setzen, müssen Sie den Pull-Up/Pull-Down-Zustand der Eingangsbits gleichzeitig beibehalten.

(das Video versucht es zu erklären)

Lesen eines Port-Eingangsbits

  • Stellen Sie SEL0 / SEL1 für die GPIO-Funktionalität ein
  • Setzen Sie das DIR-Register als Eingang für die Schaltbits, aber als Ausgang für die LED (gleichzeitig im gleichen Byte)
  • Widerstände aktivieren
  • Stellen Sie sie als Pull-up-Widerstände ein
  • Lesen Sie den Hafen
  • Möglicherweise möchten Sie den gelesenen Wert filtern, um nur die benötigten Bits zu isolieren (Schalter 1 und 2)

Empfohlen: