Audiosignalverarbeitung mit M-Unit 2.0
eDjango: Hast Du Erfahrung mit dem Bootloader, kannst Du uns dazu was erzählen?
Eigentlich wäre mir lieber, wenn Conrad den Assembler ganz normal weiterunterstützen würde, mit Support und ohne das grosses Häckmäck nötig ist. Die sollten doch an der Kundenzufriedenheit interessiert sein und nicht an so einem Gezerfe!
Ich bin ein Stück weiter gekommen mit der Erforschung der M-Unit 2.0 für die Audio Signalverarbeitung, allerdings wieder mit negativem Ergebnis. Während man mit der M-Unit 1.0 in Assembler die systeminternen Interrupts abschalten konnte um ein zeitgetreues, äquidistantes Abtasten und Verarbeiten von Audiosignalen zu erreichen, ist dies nun bei der M-Unit 2.0 wegen des Fehlen des Assemblerzugangs nicht mehr möglich. Benutzt man anstelle von Assemblerroutinen unten stehendes simples Programm in CCBasic 2.0 erkennt man zwar, dass die M-Unit 2.0 von der Geschwindigkeit durchaus einige kHz erreichen könnte, aber durch die systeminternen Unterbrechungen nicht in der Lage ist, konstant in einem festen Zeitraster dem Eingangssignal Abtastwerte zu entnehmen. Das untenstehende Programm soll das Eingangssignal mit dem AD-Wandler abtasten und es gegen einen Schwellwert in der Mitte vergleichen. Das Vergleichsergebnis wird dann als Digitalsignal wieder ausgegeben (Minimalprogramm). Speist man nun mit einem Sinusgenerator ein Signal im Bereich von einigen 100Hz ein sollte es theoretisch zu einem Rechtecksignal mit ca. 50% Tastverhältnis am Ausgang umgeformt werden, solange der Controller folgen kann. Sobald der Controller nicht mehr folgen kann, sollte sich das Tastverhältnis verändern. Schließt man nun ein Oszi an, sieht man jedoch sofort das unstetige Abtasten, selbst bei niedrigen Frequenzen, am instabilen Ausgangssignal. Schließt man über einen Vorwiderstand einen Kopfhörer an, kann man direkt das Gezappel sogar direkt hören. Schuld daran ist vermutlich das unstetige Abarbeiten der CCBasic 2.0 Routinen mit internen Interrupts vom Timer usw. das man nun nicht mehr in Griff zu bekommen ist. Damit ist auch jede andere Art niederfrequenter Echtzeit-Signalverarbeitung unmöglich !
Oder hat jemand eine Idee wie das unter CCBasic doch irgendwie stabil gehen könnte?
DEFINE Eingang AD[1]
DEFINE Ausgang Port[8]
DEFINE Wert Byte
DEFINE Schwelle 128
#Loop
Wert = Eingang
IF Wert > Schwelle THEN Ausgang = 1 ELSE Ausgang = 0
GOTO Loop