[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Programmierproblem



Hallo Michael, Hasan, Kurt und alle anderen!
 
Weil's schon eine Weile her ist, kurz zur Erinnerung: Ich hatte ein
"Programmierproblem" geschildert, die Erzeugung von Toenen ueber den
PC-Lautsprecher betreffend. Vielen Dank fuer die Antworten und Hinweise,
die ich daraufhin von Euch bekommen habe.
 
Kurt (uebrigens: schoen, auf diese Weise wieder einmal mit einem "alten
Marburger" in Kontakt zu kommen!) erwaehnte die Befehlsfolge:
 
	sound(frequenz);
	delay(millisek);
	nosound;
 
Klar, genau so habe ich es gemacht, aber eben mit einem alten Compiler,
dessen Laufzeitroutinen nicht fuer die heutigen
Prozessorgeschwindigkeiten konzipiert sind. Nun werdet Ihr sagen: "Dann
nimm doch einen neueren Compiler!" Das werde ich bei einer Neufassung
meines Terminprogramms moeglicherweise in dem Sinne tun, dass ich es in
C++ umschreibe, nur kann so eine Aktion natuerlich etwas laenger dauern.
Dem bestimmt sehr wertvollen Hinweis von Michael auf die Turbo
Professional Toolbox werde ich vermutlich aus demselben Grunde nicht
nachgehen. Pascal ist ja eine sehr schoene Programmiersprache, aber noch
schoener ist es, wenn man nicht mehrere Sprachen parallel verwenden muss.
 
Sehr interessant war fuer mich die Schilderung des Divisionsproblems und
dessen Behebung, die uns Hasan eingespielt hat. Nun habe ich in der
Zwischenzeit die Quelle der Laufzeitroutine delay() in Turbo C studiert
(man bekommt diese Quellen mitgeliefert). Die loesen das Problem etwas
anders, und ich denke, ich verstosse gegen kein Copyright, wenn ich den
folgenden Kommentar aus der Quelldatei zitiere (Beschreibung der
Startup-routine timer_init):
 
Description     Determine the multiplier required to convert milliseconds
                to an equivalent interval timer value.  Interval timer 0
                is normally programmed in mode 3 (square wave), where
                the timer is decremented by two every 840 nanoseconds;
                in this case the multiplier is 2386.  However, some
                programs and device drivers reprogram the timer in mode 2,
                where the timer is decremented by one every 840 ns; in this
                case the multiplier is halved, i.e. 1193.
 
                When the timer is in mode 3, it will never have an odd value.
                In mode 2, the timer can have both odd and even values.
                Therefore, if we read the timer 100 times and never
                see an odd value, it's a pretty safe assumption that
                it's in mode 3.  This is the method used in timer_init.
 
Das Dilemma ist demnach, dass der Timer in verschiedenen Modi arbeiten
kann, aber keine Moeglichkeit zur direkten Abfrage des eingestellten
Modus vorgesehen ist (ob sich Intel dabei wohl etwas gedacht hat?).
 
Michael meinte, das Problem muesse man wohl in Assembler angehen. Genau
das habe ich inzwischen gemacht, d.h. ich habe die Routine des
Laufzeitsystems von C fuer Pascal nachgeschrieben. Ein erster Test auf
einem schnelleren Rechner ist positiv ausgefallen. Ich werde daher
versuchen, in naechster Zeit das Terminprogramm nochmals zu
ueberarbeiten, und bei dieser Gelegenheit die neue Routine "warte" (statt
"delay") einbauen. Eure Erfahrungen werden dann sicher zeigen, ob diese
Loesung etwas taugt. Bei noch schnelleren Rechnern koennte ich mir
jedenfalls vorstellen, dass es nicht genuegt, den Timer 100mal
abzufragen, denn schon bei 133 MHz verstreichen in den ominoesen 840
Nanosekunden bereits knapp hundert Zyklen. Vielleicht wird's doch darauf
hinauslaufen, dass auch ich einen Kommandozeilenparameter einfuehren
muss, wie es Michael empfiehlt.
 
Bezueglich der Tonfrequenz habe ich mich uebrigens offenbar geteuscht.
Der Lautsprecher des PCs, auf dem ich die kurzen Zeiten beobachten konnte,
gibt die Toene so schrecklich quaekend wieder, dass ich bei dem kurzen
Antippen nur die klirrenden Obertoene hoeren konnte.
 
Eine schoene Weihnachtszeit und ein gutes neues Jahr Euch allen!
Eberhard
 
------------------------------------------------------------------------------
Dr. Eberhard Hahn
Universitaet Tuebingen                                  Tel. +49 7071 29-76954
Zentrum fuer Datenverarbeitung      E-mail: eberhard.hahn_bEi_zdv.uni-tuebingen.de
Brunnenstrasse 27                                        Fax: +49 7071 29-5912
D-72074 Tuebingen (Germany)
------------------------------------------------------------------------------