mikrocontroller.net

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


Autor: Edward (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin,

Ich initialisiere den Timer0 vom ATMega32:
        // Initialize 1MHz Clock on OC1A (PB5 on ATMega32)
        TCNT0 = 0x00;           // Timer/Counter register.
        OCR1A = 0x07;           // Output Compare register.
        TCCR1B = 0x09;          // Timer/Counter control register.
        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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Edward (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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/Commodor...

> 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.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Hc Zimmerer (mizch)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Edward (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Hc Zimmerer (mizch)
Datum:

Bewertung
0 lesenswert
nicht 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)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.