|
|
SOUNDRXVon Robert und Frank M. (ukw) [Bearbeiten] SOUNDRX - Datenübertragung/Bootloader PC -> µC über PC-SoundkarteNicht jedem Otto-Normal-Endanwender von µC-Schaltungen steht ein Flashgerät oder eine serielle Schnittstelle (UART) zur Verfügung, um Daten zum Mikrocontroller zu übertragen oder gar ein Firmware-Update durchzuführen. Was aber ein jeder PC-Anwender hat, ist eine Soundkarte. Das Programmpaket SOUNDRX kann Daten mit ca. 2000 Zeichen pro Sekunde über die Soundkarte vom PC an einen ATMega übertragen. Dazu wandelt es die Daten in eine interne WAVE-Datei und spielt diese über die Soundkarte ab. Das Paket enthält dafür ein Beispielprogramm sowohl für den µC als auch PC. Ebenso ist ein Bootloader für den µC und das dazugehörige PC-Programm enthalten, um ATMegas mit mind. 2 KB Bootloadergröße über ein simples Audiokabel zu flashen. Das zugrundeliegende Prinzip ist eigentlich schon 30 Jahre alt. Damals hat man in den C64/ZX-Spectrum die Programme oder Daten mit einem Kassettenrecorder geladen. Hier passiert eigentlich genau dasselbe: Die Daten werden in (hörbare) Töne gewandelt und dann an den µC übertragen. Zur Übertragung wird ein flankencodiertes Protokoll verwendet. Folgende Pegel-Längen werden verwendet:
Ein zu sendender Datenblock besteht aus:
Im Empfängermodul ist eine Fehlererkennung enthalten. Es werden erkannt:
In diesen Fällen wird der Empfang abgebrochen. Dieses Programmpaket ist hauptsächlich für Endanwenderschaltungen gedacht, um Firmware-Updates zu ermöglichen, ohne dass sich der Endanwender eine komplette Entwicklungs-Hardware bzw. USB->Seriellwandler anschaffen muss. SOUNDRX kann aber auch zur einfachen Übertragung von Anwendungsdaten an einen µC dienen, die der µC weiterverarbeiten soll. Der Anwender braucht lediglich ein simples Audiokabel mit zwei 3,5mm Klinkenstecker. Dazu zieht er sein Audiokabel einfach aus dem PC-Lautsprecher heraus und steckt es in die entsprechende Audio-Buchse der untenstehenden Schaltung, welche idealerweise mit auf der Anwendungsschaltung integriert ist. Da die Daten als WAVE auf der PC-Soundkarte ausgegeben werden, ist kein spezieller Treiber für die Soundkarte notwendig. Es reicht sogar aus, dem Endanwender einfach die erzeugte WAVE-Datei zuzuschicken. Diese Datei kann dann von einem beliebigen WAVE-Player (unter Windows/Linux/Apple oder auch vom Billigst-MP3-Stick) an den µC gesendet werden. Die gegenwärtige Übertragungsgeschwindigkeit beträgt ca. 2.000 Zeichen pro Sekunde. Das ist vergleichbar mit einer UART-Übertragungsrate von über 19200 Bd. [Bearbeiten] SchaltplanDer Schaltplan ist sehr einfach gehalten. Man benötigt lediglich einen Kerko als Kondensator und ein Poti. Verwendet man am Eingang eine 3,5mm Klinkenbuchse, kann man ein Standard-Audiokabel, was jeder Soundkarte beiliegt, verwenden. Die Bauteile kosten in der Summe nur einige Cent. [Bearbeiten] Stückliste der einfachen Schaltungsvariante:
Die einfache Schaltungsvariante benötigt eine Kalibrierung, um das Poti exakt auf die Schaltschwelle des verwendeten ATmega einzustellen. Die Luxusvariante benötigt dagegen keine Kalibrierung. [Bearbeiten] Stückliste der "Luxusversion"
Beide Schaltungen wurden ausführlich im Thread Schaltschwelle bei Atmega digital Eingang diskutiert. Vielen Dank an Klaus De lisson (kolisson) für den Entwurf der OpAmp-Schaltung. Die Lautstärke der PC-Soundkarte sollte auf einen Pegel zwischen 75% und 100% eingestellt werden. [Bearbeiten] DownloadVersion 1.5.1, Stand vom 22.08.2011: SoundRxTx.zip [Bearbeiten] Source-CodeDer Source-Code lässt sich einfach kompilieren, indem man die Projekt-Datei sndrx.aps in den WinAVR, bzw. die sndtx.sln in Microsofts Visual Studio lädt. [Bearbeiten] Quellcode-Dateien auf der µC-Seite:
[Bearbeiten] KonfigurationDie Konfiguration besteht lediglich aus dem Anpassen der Preprozessor-Konstanten in soundrxconfig.h. Diese sind: [Bearbeiten] Samples pro SekundeDieser Wert sollte normalerweise nicht geändert werden, siehe auch Wahl der Samples/sec:
[Bearbeiten] Größe des RingbuffersDieser Wert kann zwischen 0 und 255 eingestellt werden:
Mit dem Wert 0 wird der Ringbuffer deaktiviert. Dies ist bei zeitkritischen Anwendungen nicht zu empfehlen, da sonst Zeichen verloren gehen können und SOUNDRX dann die Übertragung mit einem Overflow-Error abbricht. [Bearbeiten] Konfiguration des Eingang-Pins
[Bearbeiten] Konfiguration der KalibrierungSiehe auch Kalibrierung
[Bearbeiten] LoggingNur zum Debuggen notwendig, nicht ändern.
[Bearbeiten] TaktfrequenzDie Taktfrequenz des AVR µCs sollte mindestens 8 MHz betragen. Das Projekt ist eingestellt auf einen ATMega168 mit 8 MHz. [Bearbeiten] Demo-ProgrammIm Programmpaket ist eine einfache Main-Funktion als Demo-Programm enthalten, um die Funktion von SOUNDRX zu demonstrieren. Hier ein Auszug:
Die Schleife liest die über die Soundkarte gesendeten Zeichen ein und gibt sie hier über den UART mit 38400Bd wieder aus. Der ausführliche Code inkl. Fehlerbehandlung steht in main.c. Auf dem PC kann man nun eine beliebige Textdatei an den µC senden mit folgendem Befehl: sndtx.exe Dateiname Dabei wandelt sndtx.exe die Daten zunächst intern in eine WAVE-Datei im Speicher um und spielt diese dann über die Soundkarte ab. Wenn man die Datei nur wandeln, aber nicht senden möchte, ruft man sndtx.exe folgendermaßen auf: sndtx.exe Dateiname Dateiname.wav Dann kann man anschließend die Datei Dateiname.wav mit einem x-beliebigen WAVE-Player unter Windows/Linux/Apple oder über einen Billigst-MP3-Stick abspielen und somit an den µC übertragen. Beispiel: sndtx.exe README.txt Möchte man eine niedrige Übertragungsrate benutzen, kann man die Anzahl der Samples pro Sekunde einstellen. Der Standard-Wert ist 41667. Beachte hierzu Wahl der Samples/sec Beispiel: sndtx.exe -s 31250 README.txt Mit einem einfachen Terminalprogramm (z.B. PuTTY) kann man sich nun beim µC-Demoprogramm den Inhalt der Textdatei anschauen, welcher vom µC über den UART als echo wiedergegeben wird. Da die Übertragungsgeschwindigkeit von SOUNDRX mit über 2.000 Zeichen pro Sekunde die übliche UART-Baudrate von 19200 Baud übersteigt, muss das Terminalprogramm auf 38400 Baud eingestellt werden. Sonst kommt es zu einem Buffer-Overflow in SOUNDRX beim Einlesen der Daten. Ein solcher Buffer-Overflow wird von SOUNDRX zuverlässig erkannt. Der Status kann dazu vom Anwendungsprogramm ausgewertet werden. Im Beispiel wird dann "overflow error" auf dem UART ausgegeben. Bricht der Anwender die Übertragung von sndtx.exe durch Drücken der Tastenkombination STRG-C ab, wird auch dies von SOUNDRX erkannt und als Buffer Underrun bzw. Timeout gemeldet. Hier als Auszug die Fehlerbehandlung aus main.c, also dem µC-Beispiel-Programm:
[Bearbeiten] Quellcode-Dateien für den PC:
Das main-Modul kann einen beliebigen Buffer an SOUNDRX übergeben, welcher dann auf der Soundkarte als PCM-WAVE ausgegeben wird. Aufruf der WAVE-Abspiel-Funktion:
Argumente:
Die Beispiel-Main-Funktion liest dazu die angegebene Datei in einen Buffer ein und übergibt sie an die obige Funktion, welche die Daten dann über die Soundkarte ausgibt. Beispiel-Kommando: sndtx.exe README.txt Das PC-Programm zeigt dann auf der Eingabeaufforderungs-Konsole beispielsweise folgendes: buffer size: 27014 wave size: 1104938 time: 00:25 speed: 1080 bytes/sec TIME: 00:01 ETC: 00:24 4% Die letzte Zeile wird dann auf der Konsole fortlaufend aktualisiert. Der allgemeine Aufruf von sndtx.exe lautet: sndtx.exe [-s samples] Dateiname [Dateiname.wav] wobei die in Klammern angegebenen Argumente optional sind. Standardwert für samples ist 41667. [Bearbeiten] KalibrierungVerwendet man die einfache Schaltungsvariante mit 1 Kerko und 1 Poti, muss das Potentiometer exakt auf die Schaltschwelle des verwendeten Mikrocontrollers eingestellt werden. Dafür ist folgendes Vorgehen nötig:
sndtx.exe -c Die LED wird nun mehr oder minder hell leuchten. Nun stellt man das Timmpotentiometer so ein, dass ein Maximum an Helligkeit angezeigt wird. Die Schaltschwelle des ATmega liegt knapp unterhalb der halben Betriebsspannung. Damit ist die Kalibrierung auch schon beendet. Man kann das PC-Programm dann mit STRG-C abbrechen. Bei der Verwendung der "Luxusversion" der Schaltung ist kein Abgleich notwendig. [Bearbeiten] Hello World für SOUNDRXHier noch als einfaches Beispiel die Version von "Hello World" für SOUNDRX:
[Bearbeiten] Wahl der Samples/secDer aufmerksame Leser wird sich schon gefragt haben, wie der Standardwert von 41667 Samples/sec zustandekommt. Die Antwort: Der Timer 1 des ATmega läuft mit einem Prescaler von 64. Damit kommt man auf eine Grundfrequenz F = 8MHz / 64 = 125kHz. Damit möglichst ganzzahlige Werte beim Messen der Pegellängen herauskommt, sollten Samplefrequenzen gewählt werden, die ein ganzzahliges Verhältnis zu F = 125kHz (bei F_CPU = 8MHz) haben. Hier eine Tabelle für verschiedene Werte von F_CPU und F_SAMPLES:
Der Wert 41667 Samples/sec ist also optimal für Atmegas mit 8MHz und 16MHz. Der höchstmögliche Wert, der für alle 4 oben aufgeführten CPU-Frequenzen gut funktioniert, liegt bei 31250 Samples/sec. Alledings sinkt dann die mittlere Übertragungsgeschwindigkeit auf 1563 Zeichen/sec. Man sollte bedenken, dass die angegebenen Übertragungsgeschwindigkeiten lediglich Mittelwerte sind. Enthalten die zu übertragenen Daten viele binäre Nullen, erhöht sich die Geschwindigkeit um den Faktor 1,25. Umgekehrt kann sich die Geschwindigkeit um den Faktor 0,83 ändern, wenn die Daten sehr viele binäre Einsen enthalten. Die oben angegebene mittlere Geschwindigkeit von 2083 ch/sec schwankt in Wirklichkeit zwischen 1736 ch/sec und 2605 ch/sec. [Bearbeiten] BootloaderEbenfalls enthalten ist ein Bootloader, mit dem sich der µC per Sound flashen lässt. Dazu muss die sndrx-bootloader.aps kompiliert und geflasht werden. Nach Resetten des µCs hat man 3 Sekunden Zeit, um unter Windows das Flashprogramm zu starten. Allgemeiner Aufruf: sndflash.exe [-s samples] Dateiname.hex [Dateiname.wav] wobei die in eckigen Klammern angegebenen Argumente optional sind. Im einfachsten Fall reicht: sndflash.exe Dateiname.hex sndflash liest die Hex-Datei ein, überprüft die Daten auf Plausiblilität (Checksums etc.) und überträgt anschließend die Daten binär. Aufbau:
Mit sndflash.exe kann man auch eine WAVE-Datei erzeugen, statt die HEX-Datei direkt "abzuspielen". Dies geht folgendermaßen: sndflash.exe Dateiname.hex Dateiname.wav Die erzeugte WAVE-Datei kann dann vom Endanwender mit einem beliebigen WAVE-Player abgespielt und somit an den µC übertragen werden. Möchte man eine niedrige Übertragungsrate benutzen, kann man die Anzahl der Samples pro Sekunde auf einen niedrigeren Wert einstellen. Der Standard-Wert ist 41667. Beispiel: sndflash.exe -s 22050 Dateiname.hex WICHTIG: In diesem Fall muss sndrxconfig.h auf der Empfängerseite (µC) entsprechend konfiguriert werden. Auf der µC-Seite kann über eine LED der Status beim Flashen angezeigt werden. Dazu muss in sndrx-bootloader.c gesetzt werden:
Darunter kann der Port konfiguriert werden, wo die LED angeschlossen ist. Im Beispiel-Code steht folgendes:
In diesem Beispiel handelt es sich also um PD6. Beim Start des µCs leuchtet dann die LED für 3 Sekunden auf, bevor der Bootloader-Vorgang abgebrochen wird und ins normale Anwendungsprogramm gewechselt wird. Startet man innerhalb dieser 3 Sekunden das Flash-Programm auf dem PC, flackert die LED während der Übertragung auf, um anzuzeigen, dass die Daten angenommen und im Flash gespeichert werden. Nach dem Flashen erlischt die LED und es wird ins Anwendungsprogramm gesprungen. Tritt allerdings ein Übertragungsfehler auf, leuchtet die LED dauerhaft auf, um anzuzeigen, dass man nun das flash-Programm auf der PC-Seite neu starten muss, um den Flash-Vorgang zu wiederholen. [Bearbeiten] Weitere EntwicklungGeplant sind momentan folgende Änderungen bzw. Verbesserungen
Derzeit ist es lediglich möglich, eine LED im Falle eines
Übertragungsfehlers aufleuchten zu lassen.
Dies soll durch eine Callback-Funktion ersetzt werden, um dem Anwender
die Fehlerbehandlung durch eigene Routinen zu ermöglichen.
Test, ob RS485-Transceiver sich auch als Eingangsschaltung eignen.
Durch den Anschluss eines Mikrofons nebst Verstärkerschaltung
könnte man die Daten auch drahtlos übertragen. Dafür wäre evtl. dieses
Kondensatormikrofon geeignet.
Weitere Vorschläge zur Verbesserung des Programms oder der Schaltung können gerne in http://www.mikrocontroller.net/topic/224911 gemacht werden. [Bearbeiten] Versionshistorie10.07.2011 V 1.0.0
10.07.2011 V 1.1.0
14.07.2011 V 1.2.0
17.07.2011 V 1.3.0
20.07.2011 V 1.4.0
22.08.2011 V 1.5.0
[Bearbeiten] Literatur |