Der Martin: 8254 - Counter 1

Beitrag lesen

Hallo,

hat jemand von euch mal unter C was mit 8254 Countern programmiert ?

nö, nicht direkt, eher in Assembler - aber ich kann mich aus der DOS-Programmiererzeit noch dunkel an den Keks erinnern.

Ich habe da so ein Verständnisproblem.
Der 8254 hat ja drei Counter (0,1,2,3), wobei das dritte
das control register ist... BLA BLA BLA.

Irgendwas ist an diesem Satz verunglückt.
Der PIT hat drei Counter (bis hierher richtig) und vier Register (0,1,2,3).

Wer sich auskennt, sollte wissen was ich meine :-).

Ja. Ich warte noch auf die Stelle, wo's spannend wird. ;-)

So, das Problem ist folgendes. Ich habe ein fertiges Kontrollwort das so lautet :
0111 0110 = 0x76

Okay. Also Counter 1, LSB vor MSB, generiere Rechtecksignal am Ausgang (Mode 3), und arbeite als 16bit-Binärzähler (nicht BCD).

outp(0xAC + 3, 0x76); // init Control Word
outp(0xAC + 1, 100); // Reloadwert "100" wird LSB geschrieben
outp(0xAC + 1, 0); // Reloadwert "100" wird LSB geschrieben

Beim zweiten Mal ist es das MSB, nicht das LSB. Du lädst den Zähler also mit dem Startwert 100 = 0x0064.

outp(0xAC + 3, 0x40); // latch

Vorsicht: Hier programmierst du den Zähler gleichzeitig auf Mode 0 um! Willst du nicht 0x46 nehmen und den Zähler im Hintergrund unabhängig vom Latch weiterlaufen lassen?[1]

z = _inp(0xAC + 1)); // read LSB
z += _inp(0xAC + 1) << 8; // read MSB

Okay.

1010 1100 = 0xAC. Ich glaube das so richtig oder ?

Ja, das ist richtig.

Woher kommt die Basisadresse 0xAC, die normale Basisadresse fangen doch bei 300H an oder ? ?

Das kommt drauf an. ;-)
Mir ist die Portadresse 0x00AC auch etwas "strange"; im alten PC/AT-Design der 90er Jahre wäre dieser Bereich noch dem zweiten Interruptcontroller zugeteilt (0x00A0..00BF), obwohl der eigentlich nur zwei Register hat und daher keine 32 Bytes Adressraum braucht. Die typischen Portadressen der später hinzudefinierten zusätzlichen Komponenten auf ATX-Boards kenne ich nicht, dafür habe ich mich zu lange nicht mehr mit Hardwareprogrammierung auf dieser Ebene befasst. Also kann 0x00AC durchaus richtig sein.

Was du vielleicht meinst, ist der Bereich 0x0300..031F, der offiziell für Prototypen und Experimentierkarten reserviert ist. Allerdings arbeiten auch einige uralte Netzwerk- und Soundkarten für den ISA-Bus in diesem Bereich.

Tatsächlich haben x86-CPUs einen Port-Adressraum von 64k, können also Ports von 0x0000..FFFF ansprechen. Im alten PC/AT-Design[2] war davon nur der Bereich bis 0x03FF vollständig ausdecodiert, höhere Portadressen wurden da gar nicht verwendet. Ein großer Teil dieses 1k großen Bereichs war für die Standardhardware reserviert.
Heutige PCs können über den PCI-Bus den gesamten 64k großen Port-Adressraum nutzen.

So long,
 Martin

[1] http://heim.ifi.uio.no/~stanisls/helppc/8253.html
[2] http://heim.ifi.uio.no/~stanisls/helppc/ports.html
[3] Du plenkst!

--
Solange der Nagellack nicht trocken ist,
ist eine Frau praktisch wehrlos.
  (Burt Reynolds, US-Schauspieler)