Forum: Mikrocontroller und Digitale Elektronik ATMega32 Timer0 1MHz generieren und synchronisieren


von Edward (Gast)


Lesenswert?

Moin,

Ich initialisiere den Timer0 vom ATMega32:
1
        // 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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Edward (Gast)


Lesenswert?

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.

von spess53 (Gast)


Lesenswert?

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

von Hc Z. (mizch)


Lesenswert?

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.

von Edward (Gast)


Lesenswert?

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.

von Hc Z. (mizch)


Lesenswert?

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)

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.