// Initialize 1MHz Clock on OC1A (PB5 on ATMega32)
2
TCNT0 = 0x00; // Timer/Counter register.
3
OCR1A = 0x07; // Output Compare register.
4
TCCR1B = 0x09; // Timer/Counter control register.
5
TCCR1A = 0x40; // Timer/Counter control register.
Damit will ich erreichen, dass der Timer0 an PORTD5 (OC1A) ein
1 MHz ausgibt.
Nun wollte ich fragen, wie ich das Clock-Signal zusätzlich auch noch
abfragen kann, um Datenübertragung zu synchronisieren.
Es geht dabei darum, einen PIN (/CS für den MOS6581) zu Toggeln,
sobald CLK seinen state ändert, dann Adresse + Daten anzulegen
etc.
Danke schon mal im vorraus.
Edward schrieb:> Damit will ich erreichen, dass der Timer0 an PORTD5 (OC1A) ein> 1 MHz ausgibt.
Soweit so gut.
Ich habe die Einstellung nicht überprüft. Wenn du der Ansicht bist, dass
es schwierig war, die Bits aus dem Datenblatt zusammenzusuchen, dann ist
das deine Sache. Aber ich werde jetzt nicht hergehen und deine
Hex-Zahlen aufdröseln und mir aus dem Datenblatt zusammensuchen, was du
da konfiguriert hast.
> Nun wollte ich fragen, wie ich das Clock-Signal
Welches Clock-Signal?
Wo taucht das jetzt plötzlich auf der Bühne auf?
> zusätzlich auch noch> abfragen kann, um Datenübertragung zu synchronisieren.
Hä?
> Es geht dabei darum, einen PIN (/CS für den MOS6581) zu Toggeln,> sobald CLK seinen state ändert, dann Adresse + Daten anzulegen> etc.
Und wie denkst du jetzt, dass dir der Timer dabei hilft?
Vielleicht fängst du erst mal ganz von vorne zu erzählen an.
Wenn's so besser leserlich ist, hier noch mal als Binäre Variante:
TCNT0 = 0b00000000;
OCR1A = 0b00000111;
TCCR1B = 0b00001001;
TCCR1A = 0b01000000;
Karl heinz Buchegger schrieb:> Welches Clock-Signal?> Wo taucht das jetzt plötzlich auf der Bühne auf?
Ich generiere mit dem Timer0 ein 1MHz-Signal, dass als Clock (ø2)
für den Commodore SID (MOS6581) genutzt wird. Dieses Signal wird
sowohl für die Datenübertragung, alsauch für die Tonerzeugung
genutzt.
> Hä?
Der MOS6581 erfordert ein akkurates Timing. Das toggeln von /CS
muss mit dem Clock synchronisiert werden.
Die Timing-Informationen habe ich u.a. von
http://www.waitingforfriday.com/index.php/Commodore_SID_6581_Datasheet#6581_.28SID.29_Timing> Und wie denkst du jetzt, dass dir der Timer dabei hilft?
Ich dachte, dass der Timer in diesem Fall geeignet wäre, wenn
ich die F_CPU-Frequenz von 16MHz durch 16 teile und dieses
Signal am Pin OC1A des ATMega32 als Clock für den SID nutze.
Oder ich könnte in diesem Fall auch einen 1MHz Quarzoszillator
nehmen und an einen Interrupt-Pin anschliessen. Allerdings
stellt sich da bei mir die Frage, ob der Interrupt schnell
genug ist.
Hi
>Wenn's so besser leserlich ist, hier noch mal als Binäre Variante:>TCCR1B = 0b00001001;
Auch nicht besser.
TCCR1B = 1<<CS0|....
>Der MOS6581 erfordert ein akkurates Timing. Das toggeln von /CS>muss mit dem Clock synchronisiert werden.
Irgendwie um die positive Flanke des Clocksignals herum, ist für mich
nicht sonderlich akkurat.
Ein Output-Compare-Interrupt reicht für dein Timimg.
MfG Spess
Soweit ich das Timing noch im Kopf habe (65er-Serie hatte ja dasselbe
wie die 68xx, mit denen ich zu tun hatte), würde das wie folgt aussehen:
Du wartest, bis E (Dein Clk) auf 0 geht (eine Flanke gemacht hat). Dann
legst Du die Signale an (Daten, niedrigste Adressbits, /CS) und wartest
auf die positive Flanke und dann auf die negative Flanke. Danach
schaltest Du die Signale wieder inaktiv (/CS auf 1, Daten tristate).
Soviel zum Schreiben.
Beim Lesen machst Du dasselbe, nur dass Du die Daten auf Input schaltest
und auf der abschließenden negativen Flanke von E einliest (Hold-Time
sollte reichen, bitte überprüfen) oder indem Du die Daten im letztem
Takt vor dem Schalten von E einliest (dann bist Du auf die Hold-Time
nicht angewiesen, musst aber TNCT auf Endwert prüfen).
In jedem Fall müssen die Interrupts in dieser Zeit gesperrt sein.
Hc Zimmerer schrieb:> Soweit ich das Timing noch im Kopf habe (65er-Serie hatte ja dasselbe> wie die 68xx, mit denen ich zu tun hatte), würde das wie folgt aussehen: ..
Danke für die gute Beschreibung!
> In jedem Fall müssen die Interrupts in dieser Zeit gesperrt sein.
Würde das nicht bedeuten, dass das Clock-Signal in dem Moment
wo die Interrupts gesperrt werden (cli();), auch stoppt?
Das würde für den MOS6581 (SID) ein Problem darstellen, da
dieser auch den 1 MHz Clock für die Klangerzeugung verwendet.
Edward schrieb:>> In jedem Fall müssen die Interrupts in dieser Zeit gesperrt sein.>> Würde das nicht bedeuten, dass das Clock-Signal in dem Moment> wo die Interrupts gesperrt werden (cli();) auch stoppt?
Nein. Ich habe jetzt Deine Initialisierung nicht überprüft¹, aber wenn
es CTC-Modus ist, brauchst Du keine Interrupts. Das läuft alles
automatisch in Hardware ab.
__
(¹ kein Bock, die Zahlen in Bitnamen aufzudröseln - bleib' bitte
zukünftig gleich bei Bitnamen und widerstehe der Versuchung, das im Kopf
zusammen zu zählen und statt der Namen eine Zahl hinzuschreiben. Das
macht es auch Dir später leichter, es nachzuvollziehen)