ISP mit der Soundkarte
Als
mir Thomas Baum zum ersten Mal von seiner Idee erzählt hat war
ich gleich begeistert: Die Soundkarte als ISP-Programmer
verwenden! Jeder Kopfhörerausgang kann verwendet werden, egal ob am PC,
am Smartphone oder am Tablet. Wenn das funktioniert, ist es ein Hammer!
Kein Bootloader, kein Programmer, einfach nur das Stereosignal an den
Controller legen. Also gleich mal ausprobieren! Für den ersten
Versuch habe ich diese Schaltung verwendet:
Mach
einigen Versuchen hat es funktioniert! Das Problem war nur, dass die
AC-Kopplung am Kopfhörerausgang keinen ganz eindeutigen Ruhepegel hat.
Nach einigen Ladeversuchen schiebt er sich dann selbst in den passenden
Bereich. Kann sein, dass die Variante von Thomas mit zwei
Koppelkondensatoren von 100 nF schneller zu Ziel führt. Wichtig ist,
dass die Batteriespannung nur 3 V beträgt. Jedenfalls konnte ich am
Ende erfolgreich das Blinkprogramm von Thomas übertragen.
Wie
kann das überhaupt funktionieren, hat nicht die ISP-Schnittstelle immer
sechs Leitungen? Stimmt, aber drei davon, GND, VCC und Reset fallen
schon mal weg, jedenfalls wenn man Reset selbst betätigt. Und MISO ist
ein Rückkanal, auf dem der Programmer sehen kann ob alles funktioniert.
Da reicht auch eine LED. Wenn sie flackert weiß man, dass es
klappt. Bleibt also die Taktleitung SCK und die Datenleitung
MOSI. Ihre Daten werden direkt von der Soundkarte abgespielt.
Das
Signal hört sich an wie Vogelgezwitscher. Links singt ein Rotkehlchen
den Takt, rechts krächzt eine Elster die Daten. Man könnte ja mal zwei
solche Vögel mit Mikrofonen ausstatten und in den Controller singen
lassen. Nach ca. 10.000 Jahren wird zum ersten Mal ganz zufällig ein
sinnvolles Programm dabei rauskommen. So funktioniert das mit der
Evolution. Nach weiteren 10 Millionen Jahren haben die Vögel den
Controller voll im Griff. Bei uns geht das schneller, weil die Signale
per Software berechnet werden. Mit der richtigen Schaltung funktioniert
es sofort.
In
einer zweiten Schaltungsvariante habe ich die Eingangspegel mit
Spannungsteilern auf 1/3 der Betriebsspannung gezogen. Wichtig ist,
dass die Clock-Leitung bei einem Reset schon einen Low-Pegel sieht,
sonst verzählt sich der Controller mit den Taktimpulsen. Bei VCC = 3 V
liegt die Schaltschwelle bei 1,5 V. Mit 1 V liegt man dann sicher auf
der Low-Seite. Wenn die Soundkarte in beide Richtungen mindestens ca. 1
V aussteuert, sollte es passen. Und tatsächlich, mit dieser Schaltung
funktioniert das Programmieren auf Anhieb in einem
Spannungsbereich von 2,7 V bis 3,7 V.
Die
Schaltung habe ich fliegend auf der Platine zum Lernpaket
Mikrocontroller aufgebaut. Wenn die serielle Schnittstelle nicht
angeschlossen ist liegen alle Anschlüsse des Tiny13 frei. Ein
Steckboard tut es genauso, aber diese Platine liegt hier immer schon
rum und trägt eine deutliche Beschriftung der Tiny13-Pins. Die
Spannungsversorgung übernimmt ein Batteriefach. Bei diesem Aufbau kann
man relativ leicht Links und Rechts vertauschen, was auch immer wieder
passiert. Ich schaue dann mit dem Oszilloskop nach. Das Taktsignal
erkennt man an seinen regelmäßigen Impulsen. Wenn es an PB2 liegt ist
alles richtig.
Und hier kommt ein weiteres Programm zum
Testen. Es stammt aus dem Lernpaket Mikrocontroller und ist in
Assembler geschrieben. Wie man sieht ist es ein Wechselblinker an den
Ports B3 und B4.
;Blink2.asm Blinker mit Unterprogramm
.include "tn13def.inc"
rjmp Anfang
Anfang:
ldi r16,0x18 ;PB4 und PB4
out ddrb,r16 ;Datenrichtung
Schleife:
ldi r16,8 ;8 = 0x08
out portb,r16 ;PB3 = 1, PB4 = 0
rcall Warten ;Unterprogrammaufruf
ldi r16,16 ;16 = 0x10
out portb,r16 ;PB3 = 0, PB4 = 1
rcall Warten ;Unterprogrammaufruf
rjmp Schleife
Warten:
Ldi r16,250
Warten1: ;äußere Schleife
Ldi r17,250
Warten2: ;innere Schleife
dec r17
brne Warten2
dec r16
brne Warten1
ret ;Rücksprung
Übersetzt kommt folgendes Hexfile dabei heraus:
:020000020000FC
:1000000000C008E107BB08E008BB04D000E108BB62
:1000100001D0F9CF0AEF1AEF1A95F1F70A95D9F73F
:02002000089541
:00000001FF
Und das nun von Thomas übersetzt ergibt dieses Sound-File, anklicken, reinspielen, fertig: Blink2.wav
Soundkarten und Signale
So
sieht das Signal der Soundkarte in meinem Windows-PC aus. Aus dem
programmierten Rechtecksignal macht das nachfolgende Tiefpassfilter ein
angenähertes Rechteck mit runden Flanken und Überschwingern.
Entscheidend ist aber, dass ein digitaler Eingang immer noch ein
eindeutiges Rechtecksignal sieht. Wie zu erwarten war funktioniert die
Programmierung damit einwandfrei. Das Signal auf dem Oszilloskop von
Thomas Baum sieht zwar deutlich anders aus, ist aber ebenfalls digital
gesehen eindeutig. Die spannende Frage ist nun, welche Überraschungen
sind da noch zu erwarten.
Die
ist das gleiche Signal, abgespielt auf meinem Nexus 7 Tablet. Da sieht
man sofort, das Filter ist ganz ungünstig. Der digitale Eingang könnte
bis zu vier Impulse statt nur einen sehen. Das kann eigentlich nicht
funktionieren. Und tatsächlich, alle Programmierversuche sind
fehlgeschlagen.
(Nachtrag:
Inzwischen ist klar, dass diese schlechten Signale durch Übersteuerung
der Ausgangsstufe entstehen. Bei 80% Lautstärke ist alles sauber.)
Die
relativ kurzen Störimpulse müsste man eigentlich mit dem passenden
Tiefpassfilter beseitigen können. Mit 100 Ohm und 100 nF ergibt sich
laut Online-Rechner eine Grenzfrequenz von 15,9 kHz. Und tatsächlich, das Signal sieht schon viel besser aus.
Tatsächlich
funktioniert die Programmierung nun auch mit dem Nexus 7. Über Versuche
mit anderen Geräten und entsprechende Rückmeldungen würde ich mich sehr
freuen.
NRZ-Modulation, von Heinz D.
Vorschlag: Abhilfe durch NRZ-Modulation (Never Return to Zero) und Reduzierung der Geschwindigkeit Faktor 4
NRZ-Prinzip am Beispiel '1010110'
Um
die äußere Beschaltung auf ein Minimum zu reduzieren habe ich die
.wav's untersucht. Nachdem das Signal den DA-Wandler mit seinem
Tiefpass (<22050Hz) und den Hochpass, Koppel-C (>20Hz)
durchlaufen hat, sieht es (siehe andere Scope-Aufnahmen) schlimm aus.
Es müsste doch möglich sein, fast alle Probleme auf der Softwareseite
zu lösen.
'10101100' am Line-Ausgang, erstes Byte von Prog-Enable
Das
NRZ-Signal kann am Hochpass nicht mehr scheitern! Mit Vervierfachung
der Samples (Sck=1378Hz, 698Hz..1378Hz) kann der DA-Wandler-TP besser
durchlaufen werden.
'10' am Line-Ausgang, 32+32-Samples
Für
das Lead-In, Lead-Out und die Pausen kann auf dem rechten Kanal
schadlos permanent '000000...' gesendet werden (voller Spannungshub),
während Sck auf 0V ! nicht auf Minus bleibt!
Die (ISP-)
Signale habe ich, ganz primitiv, mit einem anderen T13 erzeugt,
aufgezeichnet und abgespielt. Der empfangende T13 hat, wie in Ihrem
allerersten Vorschlag 100k/200k oder wie in meinem Vorschlag, einen
Ruhepegel leicht unter Vcc/2, sonst nichts! Ab Vcc/4 = 0,75Vss -
1,25Vss (= 0,25Veff - 0,4Veff) bis zu einer leichten Übersteuerung
funktioniert es tadellos.
Zusatzinfo: Durch die Umstellung des
Sound-Konverters werden nun tatsächlich Signale nach diesem Prinzip
erzeugt. Es ist kein mittlerer DC-Pegel mehr vorhanden, was Probleme
mit einem Tiefpass ausschließt.