AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

low-level timer-programmierung

Ein Thema von sancho1980 · begonnen am 21. Nov 2006 · letzter Beitrag vom 21. Nov 2006
Antwort Antwort
sancho1980

Registriert seit: 7. Feb 2006
429 Beiträge
 
#1

low-level timer-programmierung

  Alt 21. Nov 2006, 10:50
hi

ich versuche grad, den timer in meinem rechner zu programmieren (nur mal schauen wie sowas geht)

das sieht folgendermaßen aus:

in al, 61h
and al, 11111110b ; timer 2 gate aus
out 61h, al
mov al, 0b6h ; mode = 3 (periodisches rechteck), binärcount, read/write zuerst zu "tiefem" dann zu "hohem" byte
out 43h, al

startvalue: ;anfangswert = 1000h
mov al, 00h
out 42h, al
mov al, 10h
out 42h, al

in al, 61h
or al, 00000011b ; timer 2 gate an, gate pc-speaker
out 61h, al

polling:
in al, 61h
and al, 00100000b
jz zero
mov al, '1'
mov ah, 0eh
int 10h
jmp jump
zero:
mov al, '0'
mov ah, 0eh
int 10h
jump:
jmp polling

wer sich damit auskennt, erkennt sicher was das ganze soll: timer 2 soll ein rechteck mit 291 hz erzeugen, damit soll dann der pc-speaker gegatet werden und das ganze soll obendrein gepollt werden und auf dem bildschirm ausgegeben werden..wenn ich das ganze assembliere und in ms-dos prompt ausführe, dann bekomme ich einfach nur ganze viel mal die ausgabe: 10101010101010101010...
-auf dem pc-speaker ist nichts zu hören
-wenn ich den anfangswert (angegeben bei label startvalue) ändere, dann ändert sich die ausgabe des programms nicht..erwartet hätte ich, damit beispielsweise das rechteck "langsamer" zu machen, also dass dann beispielsweise die ausgabe wäre: 1100110011001100..
mir ist ja durch die "1010"-folge klar, dass ich hier tatsächlich den timer lese, aber irgendwie sehe ich nicht, wie ich auf das "was" und "wie" einen einfluss habe

auch wollte ich mal fragen, ob man so in etwa eine wait-funktion implementiert..wenn ja, wie geht das? ich hab versucht die bios-wait-funktion nachzubauen aber es ist mir nicht gelungen...vielen dank für hilfe

martin
Um Rekursion zu verstehen, muss man zunächst Rekursion verstehen.
  Mit Zitat antworten Zitat
Benutzerbild von OldGrumpy
OldGrumpy

Registriert seit: 28. Sep 2006
Ort: Sandhausen
941 Beiträge
 
Delphi 2006 Professional
 
#2

Re: low-level timer-programmierung

  Alt 21. Nov 2006, 11:47
Direkte Hardwarezugriffe unter Windows NT und aufwärts funktionieren nur selten so wie man das aus DOS-Zeiten erwartet. Boote Deinen Rechner mal z.B. mit FreeDOS und führe Dein Programm dort aus. Die NTVDM (Dein "DOS-Prompt") unterstützt eine ganze Reihe Portzugriffe indem beim Portzugriff eine hochrangige Exception generiert wird und eine Emulation den Rest erledigt. Damit landen Deine Portzugriffe aber natuerlich nicht direkt auf der Hardware sondern nur in der NTVDM (NT Virtual Dos Machine) - daher kein Ton aus dem Speaker und seltsame Polling-Werte. Ich vermute dass das Auslesen immer Dummywerte liefert (egal was man setzt, immer abwechselnd 0 und 1) weil manche DOS-Programme sonst einfach nur gar nichts machen würden weil sie auf den Timer warten. Und eine echte Emulation wäre nur aufwändig ohne echten Nutzen zu haben - ergo wird bei jedem Auslesen ein Bit geflippt und fertig.
"Tja ja, das Ausrufezeichen... Der virtuelle Spoiler des 21. Jahrhunderts, der Breitreifen für die Datenautobahn, die k3wle Sonnenbrille fürs Usenet. " (Henning Richter)
  Mit Zitat antworten Zitat
sancho1980

Registriert seit: 7. Feb 2006
429 Beiträge
 
#3

Re: low-level timer-programmierung

  Alt 21. Nov 2006, 13:56
cool danke
daran hat das gelegen
bleibt nur noch meine andere frage: wie schreibt man eine timer-funktion?
danke,
martin
Um Rekursion zu verstehen, muss man zunächst Rekursion verstehen.
  Mit Zitat antworten Zitat
Benutzerbild von OldGrumpy
OldGrumpy

Registriert seit: 28. Sep 2006
Ort: Sandhausen
941 Beiträge
 
Delphi 2006 Professional
 
#4

Re: low-level timer-programmierung

  Alt 21. Nov 2006, 20:15
So allgemein lässt sich die Frage nicht wirklich hilfreich beantworten. Es kommt vor allem auf die Plattform an, und was Du genau machen willst. Das BIOS programmiert z.B. einen der Timer auf ca. 18,2 Takte pro Sekunde (Stichwort TickCount), der Timer löst dann jedes Mal wenn er auf Null ist einen Interrupt aus der vom Bios so behandelt wird, dass TickCount um eins erhöht und der Timer anschliessend neu gestartet wird (und als letztes wird dann aufgeräumt und die Interruptroutine verlassen damit der Rest des Rechners auch mal weiterarbeiten kann *g*) - Die Taktquelle ist hierbei in der Hardware des PCs verankert, so dass kein weiterer Aufwand entsteht. Du kannst natuerlich einen der unbenutzten Timer ebenfalls dazu bringen, Interrupts für Dich zu generieren, auf die Du dann mittels einer eigenen Interruptroutine entsprechend reagieren kannst. Nur - so bequem wie die Timer in Delphi zum Beispiel ist das ganze beileibe nicht. Beispiele dürfte es in so ziemlich jedem Tutorial für fortgeschrittene Programmierung unter DOS geben, Interruptroutinen waren unter DOS noch viel relevanter für den Programmierer als unter modernen Betriebssystemen wo ganz andere Mechanismen zur Verfügung stehen. In der Schule hatten wir z.B. mal ne Uhr "gebaut", die unten rechts auf dem Bildschirm eingeblendet wurde - mittels Einklinken in den Timer-Interrupt. Das ist jetzt aber auch schon ne halbe Ewigkeit her, selig seien die Tulip XTs an denen wir mit TP 4.0 arbeiteten
"Tja ja, das Ausrufezeichen... Der virtuelle Spoiler des 21. Jahrhunderts, der Breitreifen für die Datenautobahn, die k3wle Sonnenbrille fürs Usenet. " (Henning Richter)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:41 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz