Hallo zusammen,
wie bringe ich obengenannten Peripheriebaustein dazu, im "Freilaufmodus" auch das (Zähler-)HiByte zu benutzen?
Vielen Dank im Voraus
Du bist in Begriff, Forum64 zu verlassen, um auf die folgende Adresse weitergeleitet zu werden:
Bitte beachte, dass wir für den Inhalt der Zielseite nicht verantwortlich sind und unsere Datenschutzbestimmungen dort keine Anwendung finden.
letzter Beitrag von cbmhardware am
Hallo zusammen,
wie bringe ich obengenannten Peripheriebaustein dazu, im "Freilaufmodus" auch das (Zähler-)HiByte zu benutzen?
Vielen Dank im Voraus
Dem Datenblatt der VIA ( http://www.zimmers.net/anonftp…nts/chipdata/6522-VIA.txt ) zufolge hat Timer 2 nur zwei Modi:
One-Shot-Mode und Pulse-Counting-Mode.
Einen Free-Run-Modus hat also nur Timer 1.
Hi Krill,
danke für die prompte Antwort.
Allerdings ist es so, daß bei der Tonerzeugung über CB2 genau dieser "Free-Run-Mode" des Shift-Registers mit dem Wert in T2 verwendet wird.
Leider ist es da scheinbar nicht möglich, das HiByte zu verwenden. Dadurch sind Notenwerte <"h" nicht realisierbar.
Gibt es dann vielleicht die Möglichkeit, das Ganze mit Timer 1 zu machen?
Tonerzeugung? In was für ner abgefahreren Hardware hast du die VIA stecken?
Oder machst du eine neue Version des Drive Composers?
Meinst du jetzt, daß 16 Bits rausgeshiftet werden sollen, oder daß die Timerintervalle nur mit 8 Bits zu steuern sind?
Hi,
es geht um die Tonerzeugung in PETs.
Der sogenannte CB2-Sound wird von vielen damaligen kommerziellen Spielen unterstützt. Nun möchte ich einen einfachen "Tracker" dafür programmieren. Das Coden ist kein Problem, nur habe ich eben besagte Probleme mit der Hardware.
Die 16 Bit dienen, wie gesagt, der Frequenzerzeugung. Mit nur 8 Bit ist der Frequenzumfang einfach zu klein.
Der Klang (Modulation) des Tons wird durch das Bitmuster im Shift-Register erzeugt und bei jedem Interrupt nach Bedarf verändert.
Ah, verstehe.
"SR Mode 4 -- Shift Out Under T2 Control (Free-Run)
Mode 4 is very similar to mode 5 in which the shifting rate is set by T2.
However, in mode 4 the SR Counter does not stop the shifting operation
(Figure 25). Since the Shift Register bit 7 (SR7) is recirculated back into
bit 0, the 8 bits loaded into the Shift Register will be clocked onto CB2
repetitively. In this mode the Shift Register Counter is disabled."
Sieht nur nach 8 Bit aus. Aber, kannst du nicht einfach alle 8 Folgebits bei jedem Interrupt setzen und somit beliebige Sachen rausshiften? Also z.b. auch 16-Bit-Werte?
Was shiftest du da eigentlich raus? Pulsbreitenmodulierte Samples?
Neinnein,
im "free-run-mode" wird das Bitmuster (Klang) nicht "rausgeshiftet", sondern rotiert.
Die Zählerbytes von T2 bestimmen eine konstante Frequenz an CB2.
Soll heißen, bei jedem Systemtakt wird der Zähler dekrementiert. Nach Erreichen der "Null" wird ein Bit des Shiftregisters über CB2 ausgegeben und gleichzeitig wieder hintenangeschoben.
Dadurch kannst Du mit dem Zähler die Frequenz und mit dem Bitmuster im Shiftregister den Klang beeinflussen.
Ja, und wo is der Unterschied zu PWM-Sample-Wiedergabe?
Und was hindert dich daran, alle 8 Bits neue Werte nachzuschieben?
Um einen tieferen Ton als "h" zu generieren, brauche ich im Zähler des Schieberegisters 16 Bit. DAS ist die Frequenz!
Danke
Hallo Rudi,
hast du eine kleine Demoschleife zum anschauen..?
Gruß Jogi
compirudi: Ah, jetzt versteh ich dein Problem. Du setzt also erst Register 8 der VIA (T2 Low-order latch) und dann Register 9 (T2 High-order counter), aber dennoch agiert der Timer so, als wäre Register 9 mit 0 beschrieben worden?
Hallihallo,
Krill: Genauso ist es! Allerdings habe ich erst Register 9 (in Basic) beschrieben. Ist hier die Reihenfolge von Bedeutung? Und falls das heißen sollte, daß der Wert in Register 9 (Hi) nicht, wie der in 8 (Lo), "selbsthaltend" ist, kann ich die Sache mit T2 vergessen, da der Interrupt für meine Zwecke viel zu selten ausgelöst wird.
Jogi: Wenn ich Dich richtig verstanden habe, meinst Du den Tracker? Der ist erst in meinem Kopf. Das ist auch nicht das Problem. Es geht darum, wie ich T2 dazu bringe, weiter als 256 zu zählen!
Viele Grüße
Ja, wie im Datenblatt steht, muß zuerst Register 8 und dann Register 9 beschrieben werden.
Und jetzt, wo du sagst, daß du das ganze in BASIC machst, is mir auch klar, wieso du nicht mit IRQs hantieren willst
Hallo Rudi,
wenn ich es richtig gelesen hab geht nur Reg. 8 also 0-256....
Maximale Frequenz clk/2/1 = ca. 500kHz
Minimale Frequenz clk/2/256 = ca. 1953Hz
lieg ich da Richtig..?
Dein Problemm ist du bekommst keine Frequenz unter ca, 1953Hz...?
Nur so eine Idee wie währe es einen externen Teiler nachzuschalten..?
Gruß Jogi
Oder das ganze einfach in Assembler programmieren und alle 8 Bits neue Daten füttern und somit beliebige Frequenzen undTöne erzeugen \o/
Hi Rudi,
habs mal am VC20 getestet mit einem nachgeschaltetem Teiler.
Habe einen Teiler 2:1 benutzt..
Wert 5 = 9,9kHz /2 = 4,9kHz
Wert 100 = 680Hz /2 = 340Hz
Wert 255 = 270Hz /2 = 134Hz
Gruß Jogi
Hallo zusammen,
ich versuchs nochmal.
Der Timer zählt im Systemtakt den vorher eingegebenen Wert herunter, behält den Ausgangswert aber im Latch. (Free-run-mode)
Danach wird das Schiebereister um ein Bit rotiert.
Jetzt fängt der Timer wieder an zu zählen........u.s.w. Nach 8 rotierten Bit ist diese "Welle" des Tons beendet.
Dann folgt die nächste "Welle" u.s.w..
Daraus folgt: je höher der eingegebene Wert, desto tiefer die Frequenz. Da der IRQ mit einer Frequenz von 50Hz ausgelöst wird, bringt ein "Nachschieben von den nächsten 8 Bits" nichts.
Ein Mensch der nur bis 256 zählen kann, kann eben nicht auf 65536 zählen!
Zum Thema ML:
Mein Problem liegt nicht in mangelnden Programmierkenntnissen!
Hier nun das Listing des Trackers: (es ist leider noch nicht auf seine Funktionstüchtigkeit getestet, ich bin aber zuversichtlich)
Der Tracker spielt Tunes ab, die ab $0400 im Speicher liegen.
Diese beinhalten der Reihe nach die Werte für HiByte(Frequenz), LoByte(Frequenz) und Bitmuster im Schieberegister(Modulatin/Klang des Tons).
Sonderfälle sind:
Der Wert $FF im HiByte des Tons. Er signalisiert, daß bis zum nächsten Interrupt die bestehenden Werte konstant bleiben. (Hilft Bytes zu sparen)
Der Wert $FF im "Klang-"Byte signalisiert das Ende des Tunes.
Viele Grüße
Kennt wirklich niemand die Lösung meines Problems?
Hallo Rudi,
hab mich mal kurz mit deinem Problem befasst,
und nun zu meinem Ergebniss..
CB2 ist im Grunde als Rechteckgenerator zu sehen
in register=$e84b setzt du den Free run Modus.... Bit 4
in loton=$e848 gibst du den Teiler an 0-255 System-Takt /2/ inhalt von $e848
in klang=$e84a gibst du einen weiteren Teiler an 85(01010101) = /2, 51(00110011) = /4, 15(00001111) = /8
hiton=$e849 hat bei mir keine Auswirkung....
Also Systemtakt 1Mhz /2 (immer) / inhalt von e848 / Bitmuster (85,51,15) Inhalt von e84a
Beispiel
e848=255
e84a=15 (00001111) Teiler durch 8
Systemtakt 1Mhz
1Mhz/2=500000kHz /255(e848 ) = 1961kHz / 8 (e84a 00001111) = 245Hz
Also ist die tiefste ereichbare Frequenz mit CB2 ca. 245Hz
Anderes Bitmuster in e84a verändern die Frequenz nicht mehr sie versauen höchtens den Rechteck, was warscheinlich den klang ändert aber dazu fehlt mir das Gehör...
Willst du tiefer entweder über einen externen Teiler oder über normale I/O Pins ausgeben, ist halt mehr Arbeit...:)
Mehr kann ich dazu nicht sagen, hab mich noch nicht so oft mit dem CB2 befasst...der VC20 hat einen mageren Sound aber er hat einen..:)
Gruß Jogi
Nun beschreib doch einfach mal zuerst Register 8 und dann erst Register 9, wie ich es schn mehrmals vorgeschlagen habe