Auf Basis eines CY7C68013A wurde ein
2-Kanal-Rekorder mit 1 MSa/s und 16 Bit Breite erstellt.
Zusätzlich kann dieser per DDS einen Sinuston generieren.
Ich nehme mal an, dass damit Wildtiere beobachtet
und beeinflusst werden sollten.
Ist aber bestimmt im Sande verlaufen.
Hardware
Sie besteht aus:
2 A/D-Wandler 16bit ADS8402 mit je 1 MSa/s
als „Oszilloskop“ oder „Transientenrekorder“ mit direkter
Datenübertragung zum PC.
1-Kanal-D/A-Wandler 16bit
TDA1543 mit 48 kSa/s
als frequenzmäßig fein einstellbarer Sinusgenerator (Hilfsfunktion)
Die Eagle-Quelle ist nicht mehr auffindbar.
Software
Das Beispielprogramm
(Firmware und Windows-Software) steuert dieses USB-Gerät an.
Das Beispielprogramm bearbeitet die USB-Interrupts im Abfrage-Verfahren
in der Hauptschleife. Alle Requests, inklusive String-Deskriptoren,
werden bearbeitet, inklusive zweier Alternativen (Alternate Settings).
Folgende Einstellungen gelten:
Alternative
Full Speed (12 Mbit/s)
High Speed (480 Mbit/s)
0, EP2:
Bulk, 64-Byte-Pakete
Bulk, 512-Byte-Pakete
1, EP2:
Isochron, 1020 Byte pro Rahmen
Isochron, 512 Byte pro Mikrorahmen
2, EP2:
nicht verfügbar
Interrupt, 512 Byte pro Mikrorahmen
Abtastrate
250 kSa/s (USB-Maximum)
1 MSa/s (etwa ADU-Maximum)
Nettodatenrate
1000 kByte/s (1000 Byte pro Rahmen)
4000 kByte/s (500 Byte pro Mikrorahmen)
Das GPIF (General Purpose InterFace), die programmierbare Zustandsmaschine,
arbeitet hier ganz ohne Entscheidungspunkte (decision points), sondern
im "langen Transfermodus" (long transfer mode), wobei die Anzahl
der (noch) zu übertragenden Bytes permanent auf 4 GB hochgehalten wird.
Der FX2 bremst automatisch, wenn die FIFO voll ist.
Die FIFO ist 4x gepuffert und die Blöcke leicht größer gewählt als
notwendig, um Abtast-Jitter zu vermeiden.
Dafür gibt es ab und zu abgelehnte (NAK) isochrone Transfers.
Der Bulk-Transfer ist hier nur als Feigenblatt und Test-Option für eine
stets vorhanden zu seiende Alternative ohne Bandbreiten-Allokation.
Nach üblicher Manier gibt es eine LED, welche permanent leuchtet,
sobald der USB-Baustein "konfiguriert" ist, also vom System aktiviert
wurde - und nicht schläft. Sie blinkt langsam bei EP0-Transfers
und schnell bei eigentlicher Datenübertragung.
Eine zusätzliche (blaue) Leuchtdiode zeigt den aktivierten High-Speed-Modus
an und blinkt bei USB-Fehler (habe ich noch nicht blinken sehen).
Beim Betrachten des
Quelltextes werden Sie sich über die fehlende
USB-Interruptserviceroutine wundern. Das ist Absicht und letztlich
genau so wie es Cypress vorgemacht hat.
Die dortigen Interruptroutinen setzen einfach ein Bit, das im
Hauptprogramm (siehe main, mainloop) zyklisch abgefragt wird.
So wie in diesem Quelltext dargestellt geht es aber noch einfacher.
Die simplen Makros LD und ST,
definiert in
MAKROS.I51 ersparen Schreibarbeit beim Zugriff auf's XRAM.
Dabei wird das Register R0 (und nicht DPTR) zur Adressierung benutzt;
MPAGE ist auf 7Eh fixiert, wo fast alles adressierbar ist.
Die symbolischen Parameter NEXT (=nächste) und PREV
(=vorherige) verkörpern den Zugriff auf das nachfolgende bzw.
vorherige Byte mit etwas kürzerem und schnelleren Code.
Nachtrag
Warum ich nicht auf die USB-Audio-Klasse gesetzt habe,
um mir den Klassentreiber zu ersparen?
Ich wusste damals nichts von diesem moderneren Vorgehen!
Dazu mehr: