AVR USART wartet auf die Antwort von AVR, um den Textstrom fortzusetzen

AVR USART wartet auf die Antwort von AVR, um das Protokoll fortzusetzen

Ich mache ein Senior-Projekt und muss eine große Textdatei Zeile für Zeile an einen AVR (atmega32) senden, der ein Klavier mit ~ 36 Solenoiden und Schieberegistern steuert. Dies muss automatisch und sehr schnell erfolgen. Ich kann den Text nicht manuell im Terminal eingeben. Ich muss 3 Zeichenfolgen Zeile für Zeile an einen AVR senden und zwischen jeder Zeile auf eine Bestätigung warten, um vom AVR fortzufahren.

  • Die Textdatei ist eine konvertierte Midi-Datei, die 3 nützliche Informationen enthält (die Zeit des Ereignisses, die Notiz und den Status (Notiz drücken oder nicht drücken). Die Textdatei sieht folgendermaßen aus:

    213, 25, EIN
    321, 25, AUS
    521, 36, EIN --> was das Spielen der Note C zur Zeit = 521 ms darstellt

Wobei die erste Zeichenfolge die Zeit des Ereignisses ist, die zweite die Note und die dritte der Status der Note

Das Protokoll müsste wie folgt aussehen:

  • Der PC sendet 3 Strings an den AVR. Also insgesamt 3 USART-Transfers.
  • Der PC wartet darauf, dass AVR eine Bestätigung sendet, um mit der Übertragung der nächsten Textzeile fortzufahren
  • Der AVR spielt das „Ereignis“ auf dem Klavier ab und sendet am Ende eine Bestätigung an den PC, um die nächsten Textzeilen zu senden

Wie ist dies zu erreichen?

Warum mache ich das?

Das Problem ist, dass ich nicht alle Textdateien in einem Array speichern kann, da der AVR zu klein ist (der größte atmega ist 512 KB, wenn ich mich recht erinnere). Ich muss die Textdatei mit dem Terminal (Hyperterminal) Zeile für Zeile streamen . ABER wie sendet man eine Zeile über das Terminal, wartet, bis der Atmega den Vorgang beendet hat -> sendet eine Bestätigung zurück an den PC, um die nächste Zeile zu streamen?

Warten Sie, bis Sie eine vollständige Zeile erhalten, bevor Sie sie bearbeiten? Und wenn ja, warum?
Warum wandelst du MIDI in Text um? Warum nicht den AVR die MIDI-Daten direkt interpretieren lassen, was wohl viel einfacher wäre? Schließlich ist das Senden von Musik über eine serielle Schnittstelle genau das, wofür MIDI entwickelt wurde!
Ja, denn 1 Zeile gibt mir genug Informationen, um Bit in ein Schieberegister zu streamen. Zum Beispiel repräsentiert die Note C 000000100 in der zugeordneten Solenoid-Konfiguration.
@DaveTweed Weil ich kein MIDI an den AVR sende. Der AVR steuert MAGNETE
@DaveTweed Wollen Sie damit sagen, dass ich MIDI --> USART --> AVR --> MAGNETE machen kann???
Was ist der Unterschied zwischen MIDI→text→USART→AVR→solenoids und MIDI→USART→AVR→solenoids außer dem zusätzlichen Umwandlungsschritt? Und Sie brauchen keine vollständige Zeile, bevor Sie mit der Verarbeitung beginnen; tun Sie es stattdessen Byte für Byte.
Ja, wenn Sie ein Sequenzer-Programm verwenden, um die Musik über den MIDI-Port des Host-Computers zu senden, können Sie diese Daten über den USART des AVR empfangen. Sie müssen lediglich die USART-Datenrate auf 31.250 kbps einstellen und eine einfache Hardwareschnittstelle erstellen . (Ich weiß, dass Sie Arduino nicht speziell verwenden, aber Sie können den Schaltplan des benötigten Teils hier erhalten.) Außerdem übernimmt der Computer automatisch das Notentiming (Flusssteuerung) für Sie. Darüber hinaus können Sie auch jedes andere MIDI-fähige Gerät verwenden, um Ihr Klavier zu steuern.
Wenn Sie hypterminal verwenden möchten, müssen Sie etwas implementieren, das es unterstützt, wie z. B. XON/XOFF (Software) oder möglicherweise RTS/CTS (Hardware). Beachten Sie, dass Sie bei Verwendung eines USB-Seriell-Konverters durch ein antworterforderliches Protokoll erheblich verlangsamt werden. Eine andere Option ist jedoch die Verwendung von nativem USB (anstelle von USB-seriell). In diesem Fall können Sie die Bestätigung eines USB-Pakets ablehnen, bis Sie es verbraucht haben und für ein weiteres bereit sind. Wenn Sie ein bekanntes serielles USB-Protokoll implementieren, können Sie Hyperterminal als Sender verwenden. Aber erwägen Sie, Hyperterminal fallen zu lassen und Ihr eigenes Sendeprogramm zu schreiben.
Oder Sie könnten ein USB-MIDI-Gerät implementieren und es einem Software-Sequenzer überlassen.
@IgnacioVazquez-Abrams Ich habe kein MIDI-Gerät zum Steuern. Die Solenoide sind für das Projekt hausgemacht, deshalb muss ich MIDI in Text umwandeln. Verwenden Sie dann diesen Text, um Schieberegister zu steuern
Deshalb verwandeln Sie die MCU in ein MIDI-Gerät.
@IgnacioVazquez-Abrams, aber unsere Eingabe ist kein MIDI-Signal. Es ist eine Midi-Datei. Wie mache ich das?
Sie verwenden einen MIDI-Sequenzer, um die MIDI-Datei in ein MIDI-Signal umzuwandeln.
@IgnacioVazquez-Abrams, OK, wie kann ich dann dieses Signal verwenden, um die Solenoide zu steuern?
Sie lassen den AVR das MIDI-Signal interpretieren und entsprechend bestromen.
@IgnacioVazquez-Abrams das ist das Problem, ich kann keinen MIDI-Interpreter finden. Beliebt ist nur das Gegenteil.
Dann müssen Sie den Aufwand hinzufügen, um es in Ihr Budget zu schreiben.
@DaveTweed, Ok, aber wie kann ich dann das eingegebene MIDI interpretieren? Ich möchte kein MIDI ausgeben, ich gebe Bits aus.
Was @IgnacioVazquez-Abrams gesagt hat. Und was ich zu Beginn gesagt habe, vor 2 Stunden. Sie schreiben einen MIDI-Interpreter, was viel einfacher ist als das Schreiben eines Textinterpreters. Sie müssen nicht die gesamte MIDI-Spezifikation implementieren , sondern nur „Note On“- und „Note Off“-Nachrichten.

Antworten (1)

Was Sie brauchen, ist "Flow Control" oder "Handshaking".

Für USART können Sie Hardware-Flusskontrolle mit RTS/CTS verwenden , aber viele USART-Implementierungen lassen sie heute weg. Wenn Sie Ihre Hardware fertig haben und diese Pins nicht angeschlossen sind, können Sie " Software-Flusskontrolle " mit "XON/XOFF" versuchen, da diese beiden Codes nicht in Ihrer Textdatei erscheinen (es handelt sich um nicht druckbare Zeichen). Verwenden Sie sie also, da eine Flusskontrolle möglich ist. Aber im Vergleich zur Hardware-Flusskontrolle ist letztere möglicherweise etwas langsamer.

Die Hauptbeschränkung bei Ihnen ist, dass Ihre MCU nicht stark genug ist, um die gesamte Datei zu verarbeiten, daher ist es sinnvoll, die Datei auf dem PC-Ende zu analysieren.

Wenn Sie nicht in ein kompliziertes USART-Programm auf dem PC eintauchen möchten, können Sie Tera Term ausprobieren , einen Open-Source-, programmierbaren, praktischen „Hyperterminal“-Killer.

Bietet Tera Term eine Funktion zum Lesen einer Textdatei? Denn wenn ich mich recht erinnere, erfordern Terminals eine manuelle Eingabe für die Zeichenübertragung, oder? Danke übrigens für die Info!
Ja, Sie können in Tera Term einfach programmieren und es unterstützt das Lesen von Dateien. Benötigt Hyperterminal manuelle Eingaben?