Forum: Mikrocontroller und Digitale Elektronik Timer Interrupt


von Michael L. (nightflyer88)


Lesenswert?

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 ?

von rino (Gast)


Lesenswert?

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.

von rino (Gast)


Lesenswert?

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

von Michael L. (nightflyer88)


Lesenswert?

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

von Mr Dose (Gast)


Lesenswert?

Richtig, für so etwas missbraucht man den Timer der System Beeps. Da 
gibt es 1001 und mehr Beispiele im Netz.

von Michael L. (nightflyer88)


Lesenswert?

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...

von Amateur (Gast)


Lesenswert?

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.

von c-hater (Gast)


Lesenswert?

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).

von Amateur (Gast)


Lesenswert?

> 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".

von Michael L. (nightflyer88)


Lesenswert?

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.

von Mr Dose (Gast)


Lesenswert?


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
Noch kein Account? Hier anmelden.