Ultraschall-Rekorder

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:
Schaltplan und Bestückung
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:
AlternativeFull Speed (12 Mbit/s)High Speed (480 Mbit/s)
0, EP2:Bulk, 64-Byte-PaketeBulk, 512-Byte-Pakete
1, EP2:Isochron, 1020 Byte pro RahmenIsochron, 512 Byte pro Mikrorahmen
2, EP2:nicht verfügbarInterrupt, 512 Byte pro Mikrorahmen
Abtastrate250 kSa/s (USB-Maximum)1 MSa/s (etwa ADU-Maximum)
Nettodatenrate1000 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: