Hallo Außerirdischer, ;-)
Ich lese aus deinen Worten heraus, das du dich auskennst.
ja, ein bisschen. Digitaltechnik, Microprozessortechnik und Assembler-Programmierung waren mir mal so vertraut, dass ich die meisten Details auswendig kannte, hab das mal studiert. Inzwischen bin ich aus der Materie etwas raus, aber gelegentlich holt mich das Thema noch mit irgendeinem Wochenend-Hobbyprojekt ein.
MOV AL, 11100010B ;Read Back, Modus ermitteln, Zähler 0
OUT 43H,AL ;Steuerwort schreiben
IN AL, 40H ;Modus von Zähler 0 lesen
Nur ein Beispiel in Assembler ? Richtig oder ?
Sieht plausibel aus.
Welche vier Register meinst du ? :-)
Na die vier Register des PIT 8253/54. Register 0..2 für die Zählerstände von Timer 0..2, und Register 3 ist das Command Register.
Cool, du weisst wovon du sprichst. Ein Square Wave wird erstellt. So wie beim PWM.
Ja, nur dass dein PWM ein konstantes Tastverhältnis von 50% hat. Eben ein symmetrisches Rechtecksignal. Irgendwie langweilig. ;-)
Beim zweiten Mal ist es das MSB, nicht das LSB. Du lädst den Zähler also mit dem Startwert 100 = 0x0064.
Richtig, wieso muss man den MSB also das zweite 8-Bit-Wort
nochmal schreiben, wenn es sowieso 0 ist ?
Ich bin mir bei den Interna des Timerbausteins nicht mehr ganz sicher, aber ich meine, dass der Zähler erst geladen wird, wenn _beide_ Bytes geschrieben wurden. Auch wenn das MSB 0 ist.
Willst du dir den Portzugriff für das MSB sparen und nur das LSB lesen oder schreiben, dann verwende XX10XXXX als Command Word.
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]
Wie meinst du das ? Counter-Latch verursacht, das der 8254 nicht
unterbrochen werden muss und gelesen werden kann oder ?
Das ist richtig, aber in den Bits [321] wird ja gleichzeitig der Counter Mode neu gesetzt - in diesem Fall auf Mode 0, vorher war's Mode 3.
Das 0xAC kommt von dieser Zeichnung die ich vorher gezeichnet habe.
Also ist das nur ein willkürliches Beispiel, das das Prinzip verdeutlichen soll? Ich weiß es echt nicht, aber das Adressmuster in der Skizze könnte ja ein beliebig gewähltes sein. Eben nur ein Beispiel.
In dieser Zeichnung sind die Eingänge A0 und A1 auf "write into counter 0" gesetzt. Das verstehe ich auch nicht ? Der &-Gatter hat erstmal alles auf eins (schätze ich) und durch die Negation ist das dann zwei Nullen enthalten.
Jaja, die Interpretation ist vollkommen richtig - nur ob die Grundannahme stimmt, wissen wir nicht. Außerdem wissen wir auch nicht, mit welcher CLK-Frequenz der Timerbaustein zählt. Beim ersten PIT (Port 0x40..43) ist es übrigens etwa 1.193MHz. Dividiere das durch 2^16, und du bekommst was? Ja, richtig: etwa 18.2, das ist die Anzahl der Timer-Interrupts pro Sekunde. Klingelt da was? ;-)
Das mit 300H habe ich von hier :
http://www.decisioncards.com/io/tutorials/8254_tut2.html
Ah ja, so wie ich das lese, gehen die tatsächlich von einer selbstgebauten universellen ISA-Steckkarte aus und wählen den Bereich 0x0300+, um (wahrscheinlich) keiner anderen Komponente in die Quere zu kommen.
Also ich will folgendes erzielen :
Init einen 8254 Counter 1, Mode 3 als Binärzähler, so das immer 16 Bit gelesen und geschrieben werden. Reloadwert -> 100. Danach den Leserstand lesen. Basisadresse nicht bekannt, sondern nur die gegebene Zeichnung....
Dann vermute ich mal ganz stark, dass du den Standard-Timerbaustein im PC verwenden willst, und der hat die Basisadresse 0x40. Timer 2 dieses Bausteins steuert im üblichen PC-Design den Mainboard-Lautsprecher an, kann aber ansonsten nach Belieben verwendet werden.
Im großen und ganzen habe ich alles verstanden, aber warum ist z.B. "write counter 0 gesetzt" ??
Wie gesagt: Weil's vermutlich nur ein Beispiel ist.
Außerdem hast du die Bit-Werte doch vermutlich zur Verdeutlichung selbst dazugeschrieben, oder? Die Skizze sagt ja nur, dass A0 und A1 direkt auf den PIT gehen, die Adressbits A2,A3,A5,A7 direkt auf ein AND-Gatter, und die Adressbits A4 und A6 invertiert.
Ciao,
Martin
PS: Du plenkst immer noch.
Heutzutage gilt ein Mann schon dann als Gentleman, wenn er wenigstens die Zigarette aus dem Mund nimmt, bevor er eine Frau küsst.
(Barbra Streisand, US-Schauspielerin)