Forum: Mikrocontroller und Digitale Elektronik ATmega2560 Arduino Timer synchronisieren


von Robert (Gast)


Lesenswert?

Hallo,

ich möchte mit dem Arduino Mega (ATmega 2560) 3 Triggersignale erzeugen 
(mit bis zu 1µs Auflösung; TTL). Dazu benutze ich 2 16-bit Timer und die 
Output-Compare-Register (jeweils 3). Der erste Timer setzt mir die 
Startzeiten und der zweite Timer die Endzeiten. Die Frequenz des 
Triggersignals stelle ich im CTC-Mode über das Input Capture Register 
ein. Je nach Frequenzbereich verwende ich entsprechende Prescaler (8 
bzw. 64). Das funktioniert soweit auch schon, aber die beiden Timer sind 
nicht ganz synchron (0,5µs bzw. 4µs je nach Prescaler).

Gibt es eine Möglichkeit in Arduino (bzw. mit den Registern des ATmega), 
diese gleichzeitig zu reseten oder zumindest eine fixe 
Phasenverschiebung einzustellen, welche beim Setzen der Output Compare 
Register berücksichtigt werden kann?

Danke im Voraus.
Robert

von Thomas E. (thomase)


Lesenswert?

Robert schrieb:
> Gibt es eine Möglichkeit in Arduino (bzw. mit den Registern des ATmega),
> diese gleichzeitig zu reseten oder zumindest eine fixe
> Phasenverschiebung einzustellen, welche beim Setzen der Output Compare
> Register berücksichtigt werden kann?
Ja.

GTCCR – General Timer/Counter Control Register
• Bit 0 – PSRSYNC: Prescaler Reset for Synchronous Timer/Counters

mfg.

von Robert (Gast)


Lesenswert?

Thomas Eckmann schrieb:
> GTCCR – General Timer/Counter Control Register
> • Bit 0 – PSRSYNC: Prescaler Reset for Synchronous Timer/Counters

Wann setzte ich das PSRSYNC-Bit?

Zur Zeit setze ich zuerst den CTC-Mode, dann je nach Frequenzbereich den 
Prescaler, die Output Compare Register, Input Capture Register, die OCnX 
auf toggle.

Wenn ich jetzt am Ende das PSRSYNC-Bit setze, kann es trotzdem 
vorkommen, das ich eine Verzögerung von einen Bit habe.

lg
Robert

von Thomas E. (thomase)


Lesenswert?

Robert schrieb:
> Wenn ich jetzt am Ende das PSRSYNC-Bit setze, kann es trotzdem
> vorkommen, das ich eine Verzögerung von einen Bit habe.
PSRSYNC ist auch nur die halbe Miete. Guck' dir im selben Register das 
TSM-Bit an. Das sollte das Problem lösen.

mfg.

von Robert (Gast)


Lesenswert?

Thomas Eckmann schrieb:
> PSRSYNC ist auch nur die halbe Miete. Guck' dir im selben Register das
> TSM-Bit an. Das sollte das Problem lösen.

Ich habe jetzt am Anfang PSRSYNC und TSM gesetzt, dann die TCNT-Register 
genullt und nachdem ich alle anderen Register gesetzt habe, abschließend 
das TSM-Bit gelöscht. Jetzt sind die Timer synchron, aber dafür sind die 
OCnX Outputs der Timer abwechselnd mal phasenverschoben, mal nicht (die 
OCnX sind ja auf toggeln eingestellt). Das ist wiederum für die weitere 
Verarbeitung des Triggers nicht gut.

Danke schon mal für die Hilfe bis jetzt.

lg
Robert

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.