Hallo Zusammen Ich will auf einer normalen PC Hardware mit INTEL Prozessor, ein PWM Signal am LPT Port ausgeben. Als Betriebssystem wird FreeDOS verwendet und Programmieren tue ich mit Basic und Assembler. Ich bin also mehr oder weniger direkt auf der Hardware Ebene. Ich habe mir gedacht das ganze mit einem Timer zu realisieren, so wie man das von einem AVR kennt. Nun meine Frage: Kann man mit dem Timer 2 irgendwie ein Interrupt erzeugen lassen ? Oder ist das einfach nicht möglich ? Mit einem Timer und dazugehörigen ISR währe das einfach zu realisieren und sehr genau. Oder kennt da jemand eine bessere Lösung ?
Wie kommst du auf den Namen timer 2, bzw steht das für eine Funktion o.ä ? Wenn du basic programmierst, kann man leicht ein timer erzeugen. Schau mal in der Doku nach timer und drucker port. Man kann das Softwareseitig leicht realisieren.
Warum sollte man mit nem timer kein interrupt erzeugen können? Dann wer der timer ja fasst sinlos... aber du darfst das nicht mit einem avr vergleichen
Nicht das ihr mich falsch versteht, ich will den Hardwaretimer/counter verwenden. Ich habe als Betriebssystem DOS, und das ist ziemlich minimalistisch, also kein Multitasking oder sowas. Ihr dürft das nicht mit modernen Entwicklungswerkzeugen wie VB vergleichen, in dem man x-beliebiege Softwaretimer erstellen kann <- geht bei mir nicht... Auch ein Intel Prozessor hat 3 Hardwaretimer, davon wird einer für die Uhr benötigt. Wenn ich also den Timer folgendermassen Konfiguriere, habe ich einen Counter, der bei jedem CPU Takt um eins kleiner wird: OUT (&H43), &b10110000 '8253 Zähler 2 auf Modus 0 setzen Wenn ich nun den Zähler mit 65535 lade, zählt dieser runter bis 0, soweit funktioniert alles, nun weis ich aber nicht genau wie ich den konfiguriere, dass ein Interrupt ausgelöst wird. Hier noch ein Link mit allen INTEL Port Adressen: http://bochs.sourceforge.net/techspec/PORTS.LST unter 0043 findet ihr den Counter
Richtig, für so etwas missbraucht man den Timer der System Beeps. Da gibt es 1001 und mehr Beispiele im Netz.
Mr Dose schrieb:
> Da gibt es 1001 und mehr Beispiele im Netz.
Genau deshalb frage ich hier... kann mir jemand ein Beispiel nennen, wie
man es anders machen kann ?
Ich finde nichts brauchbares im web...
Soweit ich weiß kann man die eingebauten Timer nicht einfach auf die Druckerpins durchreichen. Entweder Du programmierst einen der eingebauten Timer so um, dass Du ihn als Zeitbasis für eine Schleife benutzen kannst oder Du schaust mal nach, ob es mittlerweile nicht einen schnelleren Timer als den 1/18er des alten Systems gibt. Letzteren kann man zwar auch "beschleunigen", aber dabei besteht die Gefahr, dass Du das System durcheinander bringst. Je nach installierten Treibern, kann es auch sein, das es unvorhersehbare Unterbrechungen im System gibt, womit Dein schönes Timing in die Hose geht.
Michael L. schrieb: > Auch ein Intel Prozessor hat 3 Hardwaretimer, davon wird einer für die > Uhr benötigt. Nein. Ein Intel-Prozessor hat keinerlei Timer, der hat nur Zähler. Chipsätze allerdings haben Timer. > Hier noch ein Link mit allen INTEL Port Adressen: > http://bochs.sourceforge.net/techspec/PORTS.LST Du hast überhaupt keine Ahnung, von dem was du da tust. Das sind mitnichten irgendwelche "INTEL Port Adressen". Das sind die Adressen der üblicherweise in PCs der 70er und 80er Jahre des letzten Jahrtausends verbauten Peripheriechips. Jedes seitdem verstreichende Jahr hat diese Liste weiter von der Realität heutiger Hardware entfernt. Einiges gibt es zwar tatsächlich immer noch, aber das wird immer weniger. Es ist absehbar, daß die letzten vorhandene Reste der steinzeitlichen ISA-Peripherie demnächst auch noch verschwinden werden. Wie auch immer: Im Prinzip spielt es keine Rolle, ob die Hardware nun mit auf dem MCU-Die sitzt oder sonst irgendwo. Das Prinzip der Programmierung ist immer das Gleiche. Interruptausgang der entsprechenden Peripherie erlauben, Routing des Interrupts zum (oder: zu einem) Interrupteingang der CPU ermöglichen (durch Programmierung des Interruptcontrollers).
> Da gibt es 1001 und mehr Beispiele im Netz. Das ist so glaube ich grammatikalisch falsch. Es muss heißen: > Da gab es 1001 und mehr Beispiele im Netz. Fast alle Beispiele waren für eine aussterbende Spezies gedacht: Die DOSen. Zum Teil ging es noch zu Zeiten von W3.1 aber dann war Schluss mit lustig. Bei den modernen Systemen wie Windoof 95 und spätere Fenster, auch Linux, sind direkte Zugriffe auf die Hardware tabu. Höchstens Treiber- und Systemprogrammierer kommen hier noch ran. Willst Du auch noch eine zeitliche Garantie wird’s erst recht eng. Dann gibt es im PC-Bereich noch eine aussterbende Spezies: Der Druckerport. Also "gab" und nicht "gibt".
Amateur schrieb: > Bei den modernen Systemen wie Windoof 95 und spätere Fenster, auch > Linux, sind direkte Zugriffe auf die Hardware tabu. > > Willst Du auch noch eine zeitliche Garantie wird’s erst recht eng. Genau deshalb verwende ich DOS, dies ist ein absolut stabiles und echtzeit fähiges System, und weil ich keine Spezielle Grafik brauche, genügt es voll und ganz. Und bitte kommt jetzt nicht mit anderen Systemen, oder mit Diskussionen ob DOS veraltet ist. FreeDOS wird beispielsweise immer noch weiterentwickelt, auch USB wird unterstützt... Zurück zum Thema: Bis jetzt habe ich das PWM folgendermassen erzeugt: - bit am LPT auf high - Zähler mit 65535 laden (Zähler zählt nun bei jedem CPU Takt um 1 runter) - Zähler auslesen - wenn Zähler < Sollwert, gehe weiter, sonst Zähler erneut auslesen - bit am LPT auf low Diese Variante ist aber zu ungenau, da bei der Warteschleife, wo der Zähler mit dem Sollwert verglichen wird, ein paar Takte verloren gehen. Beispiel: Sollwert = 20000, Der Zähler wird ausgelesen und steht auf 20001 -> ist also zu hoch und es wird erneut geprüft, da die Prüfung aber etwa 10 Takte benötigt, steht nun der Zähler bereits bei 19990. Meine idee währe nun wie bei einem AVR: Zähler mit 20000 laden, ist der Zähler auf 0, wird eine ISR aufgerufen und das bit am LPT wird auf low gesetzt. Somit währe die Frequenz viel genauer.
Nix gefunden. Besorgte dir das Buch PC-Intern. Für DOS Systemprogrammierer ist das Pflichtlektüre. http://www4.cs.fau.de/Lehre/WS07/V_BS//Uebungen/oostubs/web/aufgaben/aufgabe5/timer.shtml http://www.icdaru.research.chula.ac.th/2102440/lecturenotes/ch10.pdf http://www.mikrocontroller.net/attachment/21298/Programmierbares_Monoflop__One-Shot__-_ab_Seite_19.pdf
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.