Zweck: Der Zweck dieses Projekts ist die Verwendung von Assembly-Programmen, die in die Arduino C-Umgebung eingebettet werden, aber auch die Einführung in die Eingabe und Ausgabe von der Arduino-Platine. Der Eingang ist ein Schalter zum Starten des Programms mit einem Pull-Up- oder Pull-Down-Widerstand und der Ausgang steuert eine LED, die im Morsecode ein SOS blinkt. Es sieht so aus, als ob es kompliziert sein wird, aber Sie erhalten bei jedem Schritt Hinweise. Und Sie können die bisherige Laborverzögerungsfunktion und R16 für die verschiedenen Verzögerungszeiten verwenden.
In der Zeit des Telegramms und der Funktelegraphie, vor und sogar nach der Verschlüsselung der Stimme, erfolgte die Kommunikation mit einem „Tapper“ oder einem schick aussehenden Schalter unter Verwendung des Morsecodes, wobei der Absender eine Nachricht in Lang- und Kurzform abtippen konnte Dauern oder „Taps“. Auf der Empfangsseite wäre ein Relais oder ein Ton, der das Klopfen wiederholt, sodass man es hören und wieder in Worte übersetzen kann. Im Morsecode wird der Buchstabe S mit drei kurzen Punkten oder Dauern kodiert und das O mit drei langen Strichen oder Dauern. Der Morsecode für Mayday oder Help ist SOS und sieht aus wie …---… …---… und so weiter.
Dieses Labor sendet SOS im Morsecode an eine LED, wenn ein Schalter eingeschaltet ist, und stoppt nach dem Senden des vollständigen SOS, wenn der Schalter ausgeschaltet ist.
Hier ist ein Beispiel dafür, wie es klingen sollte: https://www.youtube.com/watch?v=Zsb7stKelq4
Einen Eingang für einen Schalter erstellen. Solch ein scheinbar einfacher Vorgang erfordert einige Überlegungen, wenn er auf einem Mikroprozessor ausgeführt wird.
Hier sind einige allgemeine Schritte, um eine Eingabe vorzunehmen:
Informationen zu I/O-Ports finden Sie im AVR-Datenblatt, Abschnitt 14. Beachten Sie unten die Hardware für einen I/O-Pin im AVR.
Interne Hardware für einen I/O-Pin im AVR
Diese gesamte Hardware ist erforderlich, um den Pin als Eingang oder Ausgang konfigurieren zu können, sowie einige weitere Funktionen wie interne Pullup-Widerstände, Schlafmodi und Synchronisierung mit der Uhr. Offensichtlich sind I/O-Pins nicht einfach, aber wir werden uns in dieser Übung nur mit einem einfachen Ein- oder Ausgang befassen. Dazu benötigen wir das DDR-Register und den Port für den Ein- oder Ausgang, den wir verwenden werden.
Zuvor haben wir gesehen, wie Ausgänge so konfiguriert wurden, dass die LED an PORTB Bit 5 blinkt.
Sie können jeden dafür verfügbaren Port-Pin auf Ihrem Arduino auswählen, müssen dann aber dessen Port und Bit bestimmen.
Ausgang: PORTB, Register 5, Bit 5, wird intern für die LED verwendet und auch an einen Anschluss (Pin 13 am UNO) ausgegeben, aber nicht extern verwenden – es verfügt nicht über genügend Stromkapazität, um zwei LEDs anzusteuern.
• Vorschlag: Verwenden Sie PORTB, registrieren Sie 5 Bit 4 (Pin 12 am UNO) für den Ausgang
Eingabe: Es gibt viele andere Optionen, die Sie verwenden können (außer, dass Sie nicht die I/O-Pins 0 oder 1 verwenden, da diese für die Kommunikation mit dem Computer benötigt werden). • Vorschlag: PORTB, Register 5 Bit 3 (Pin 11 am UNO) kann als Eingang verwendet werden.
Typisches Setup: Sie wählen die Pins für den Ein- und Ausgang.
Einen Eingang lesen: Um einen Eingang unter Kenntnis des Ports zu lesen, verwenden Sie den unten gezeigten IN-Befehl und die Pin-Adresse für den von Ihnen verwendeten Port. Um beispielsweise PORTB, Bit 4 (Pin 18 von UNO) zu lesen, würden Sie diesen Befehl verwenden, um den Port zu lesen.
Schleife:
IN r17, 0x03; //PORTB-Pins in Register 17 einlesen
Jetzt müssen Sie Bit 4 auswählen, indem Sie es mit 0x10 UND-verknüpfen, um alle anderen Bits auszublenden. Danach hängt es von Ihrer Eingabekonfiguration ab und davon, ob Sie ein Pull-Up oder ein Pull-Down verwenden. Hier verwenden wir einen Pulldown-Widerstand.
Wenn Sie einen Pull-up-Widerstand verwenden, führt das Schließen des Schalters zu einer 0, andernfalls zu einer 1. Sie können also den AND-Befehl ausführen und dann verzweigen, wenn er Null ist.
ANDI r17, 0x08; //UND r17 mit 08h
BRNE-Start; //Wenn der Schalter nicht geschlossen ist (z. B. 1), dann gehe zurück und schleife
Bei Verwendung eines Pulldown-Widerstands führt das Schließen des Schalters zu einer 1, andernfalls zu einer 0:
ANDI r17, 0x08; //UND r16 mit 08h
BREQ-Start; //Wenn der Schalter nicht geschlossen ist (dh 0), dann gehe zurück und schleife
Das Erstellen einer Ausgabe ist dem Erstellen einer Eingabe sehr ähnlich. Sie müssen den Port-Pin als Ausgang festlegen. Dann können Sie den CBI oder SBI verwenden, um daraus eine Null oder eine Eins zu machen.
Hier sind einige allgemeine Schritte zum Erstellen einer Ausgabe:
Entwerfen des Programms Diese Übung ist der vorherigen Übung für die blinkende LED sehr ähnlich. Diese Skizze ist als Grundlage für den Anfang beigefügt. Sie müssen lediglich die Struktur ändern, um das SOS gemäß den oben genannten Regeln zu erstellen, und einen Eingang für den Schalter zum Ausführen des SOS und einen Ausgang zum Ansteuern der LED verwenden. Verwenden Sie die Verzögerungsunterroutine, um verschiedene Verzögerungen für die Punkte, Striche usw. einzurichten, wie unten im Feld gezeigt.
Sehen Sie sich das Dokument zur Definition der Zeitbeziehungen an und befolgen Sie diese Regeln, wenn Sie Ihr Programm für den SOS-Morsecode entwerfen.