Forum: Mikrocontroller und Digitale Elektronik 2 unterschiedliche Baudraten auf einem ATMEGA128


von Fabian (Gast)


Lesenswert?

Hallo Forum,
ich habe folgendes Problem. Ich bekomme DMX Daten über eine UART mit 
921.6k in einem speziellen Frame verpackt. Daraus muss ich dann ein 
gültiges DMX Signal, welches mit 250k gesendet wird, erzeugen.

Ich habe den µC derzeit mit 16 MHz getaktet, was für das Eingangssignal 
ein Fehler von ca 8% ergibt, für das Ausgangs Signal aber 0%.

Gibt es eine Möglichkeit beide Signale mit einem Quarz zu generieren, 
ohne zu hohe Fehlerquoten?!

Syncronisieren sich DMX Geräte vielleicht an jedem Byte neu, wenn ich 
eine entsprechende Inter-Byte-Gap Zeit einfüge?! (So, dass ich den 
Fehler auf das DMX Signal abwälze?!)
Ich würde mich dann für ein 14.7456MHz Quarz entscheiden und somit einen 
Fehler von 5% auf der DMX Leitung besitzen.

Hat jemand eine bessere Idee, bzw. weiß jemand, ob mein Vorhaben 
überhaupt klappt? Was wäre die Alternative? Zwei µC?! Das Eingangssignal 
könnte ich auch auf 460.8k stellen, aber da ist der Fehler identisch 
hoch... :-(

von Grrrr (Gast)


Lesenswert?

Ich habe mal gerechnet:

1. Der ggT von 921.6k und 250k ist 400.
2. Bleiben also 2304 und 625
3. Das kgV von 2304 und 625 ist 144000.

Du hast damit drei Alternativen:
1. Suche einen Quarz mit dieser resp. einer vielfachen Frequenz davon
2. Lasse Dir einen anfertigen. Das soll wohl garnich so teuer sein, wie 
man denkt. (Weiss aber nichts genaues).
3. Lass Dir die Frequenz von einem DDS erzeugen.
4. Implementiere Dir selbst einen Teiler mit gebrochenem Teilverhältnis.

von Achim M. (minifloat)


Lesenswert?

Hallo Fabian!

Deine ganzen Zahlen im Prozentbereich machen mir Sorgen.

Kannst du vllt. den Empfang auf 500k stellen?

mfg mf

von Reinhard Kern (Gast)


Lesenswert?

Hallo,

ich takte meine Systeme oft mit 9830400 Hz, das ist ein handelsüblicher 
Quarz. Daraus sollte sich alle üblichen Baudraten (die Vielfachen von 
9600) ohne Fehler und 250 kBaud mit weniger als 2% Fehler ableiten 
lassen.

Fast alle UARTs können den Baud-Takt auch woanders her beziehen als vom 
Systemtakt, z.B von einem Eingang, manche haben sogar zusätzliche 
Quarz-Oszillatoren für jeden Kanal. An den Quarzkosten kann es heute 
nicht mehr scheitern.

Gruss Reinhard

PS probiers mal mit 14745600.

von Fabian (Gast)


Lesenswert?

Vielen Dank für die hilfreichen Antworten. Ich hatte vergessen zu 
schreiben, dass ich ein ATMEGA128 verwenden. Dieser hat ja in der Tat 
einen separaten Takt-Eingang für die UART.

Wenn ich es richtig verstehe, so muss ich doch jetzt nur statt UART den 
USART Modus nutzen und an XCK0 den entsprechenden (zusätzlichen) Takt 
bereitstellen.
Wenn dem so ist, in welchem Zusammenhang steht dann die Frequenz an XCK0 
zur Baudrate?!

von Fabian (Gast)


Lesenswert?

Wenn nun der Takt von XCK0 verwendet wird, benötige ich an diesem Pin 
für 250kbps also ein 250kHz Signal?!

Wenn dem so ist, könnte ich doch mit einem 14.745600 MHz Systemtakt über 
eine Timer/Compare Funktion diesen Takt durch 59 Teilen und würde eine 
Baudrate von 249925bps erhalten.

Und stelle ich mir das nun zu einfach vor?

von Fabian (Gast)


Lesenswert?

Zumal beim ATMEGA128 "XCK0" und "OC3A" direkt nebeneinander liegen...

von Norbert (Gast)


Lesenswert?

Fabian schrieb:
> Und stelle ich mir das nun zu einfach vor?

Ja. Du willst eine Frequenz von 250kHz, Periodendauer 4µs.
Das heisst eine halbe Periode (Low|High) dauert 2µs.

Außerdem wäre der Timer im CTC Modus mit Toggle OCx am Einfachsten.
Das entspräche so ungefähr einem Compare Wert von 29 für eine halbe 
Periode von 1,9667µs. Damit bist Du dann 1,69% vom Idealwert 250kbit/s 
entfernt.
OCx mit ClockIn verbinden und fertig.

Achtung: Das geht laut Datenblatt nur bei synchroner Datenübertragung 
und die unterscheidet sich deutlich von Async. Du wist dich 
möglicherweise selbst um die Generierung von Start/Stop Bits kümmern 
müssen.

von Sascha W. (sascha-w)


Angehängte Dateien:

Lesenswert?

schau dir mal das Datenblatt an, du kannst nicht einfach ein von den 
Daten losgelöstes Signal an XCK einspeisen. Da muss dann schon vom 
USART-Sender der Gegenstelle kommen!

Sascha

von Simon K. (simon) Benutzerseite


Lesenswert?

Richtig. Wie soll das funktionieren? eine UART (also asynchron) hat noch 
eine Synchronisierungsschaltung eingebaut, beziehungsweise tastet das 
Signal mehrfach ab. Das fehlt dann.

von Norbert (Gast)


Lesenswert?

1. Auf der 250kb/s Seite will er doch nur senden, dh. die Geschichte mit 
der Abtastung ist irrelevant.

2. Auch eine synchrone Schnittstelle kann man 'missbrauchen' um einen 
asynchronen Datenstrom zu erzeugen. Man muss dann nur das Start und 
Stopbit als Teil des Datenstromes ansehen. Die Gegenstelle (empfangende 
Seite) bekommt davon gar nichts mit.

Da sich der ganze Vorgang zur Empfangsseite hin als asynchron darstellt, 
braucht's auch keinen Takt von dort.

von Simon K. (simon) Benutzerseite


Lesenswert?

Norbert schrieb:
> 1. Auf der 250kb/s Seite will er doch nur senden, dh. die Geschichte mit
> der Abtastung ist irrelevant.
Das ist allerdings ein Argument.

von Norbert (Gast)


Lesenswert?

Um es noch ein wenig deutlicher zu beschreiben:
Bei einer synchronen Übertragung werden kontinuierlich bits übertragen. 
Es gibt keine Einteilung in Datenbytes, Parity, Startbit, Stopbit.

Wenn man nun im AVR einen synchronen Modus von zb. 5Bit Breite nimmt, 
kann man im ersten 5Bit Frame das Startbit sowie vier Datenbits 
übertragen. Im darauf folgenden Frame bringt man nun die anderen vier 
Datenbits unter sowie das Stopbit. Plötzlich sieht der von der anderen 
Seite empfangene Datenstrom wie ein asynchrones Start + 8Bit + Stop aus.

von Frank K. (fchk)


Lesenswert?

Der Mega128 hat doch zwei UARTs. Da nimmst Du halt einen zum Senden und 
einen zum Empfangen, und den Sende-UART versorgst Du eben mit einem 
externen Takt.

Wenn Du den zweiten UART brauchst: Der Mega 1280/2560 hat 4 UARTs.

Oder Du realisierst den Sende-UART softwaremäßig.

Oder Du nimmst einen MAX3100 SPI-UART.

Irgendwie wirst Du garantiert zum Ziel kommen.

von Fabian (Gast)


Lesenswert?

Vielen Dank für alle Hinweise und Tipps!
Der Max3100 wäre schon eine gute Lösung, aber kostet ca. 3 bis 4 mal 
soviel wie ein Atmega 8.

Die Kommunikation über beide Uarts ist immer bidirektionel, weshalb ich 
nicht eine als USART die andere als UART laufen lassen kann.
Konkret geht es bei mir um die Ein- und Ausgabe von DMX Daten, weshalb 
ich an die 250k gebunden bin.

Mein Fazit, ist nun, dass ich meine vorhandene Leiterplatte noch einmal 
redesignen werde. Ist zwar schade drum, aber alles andere kommt mir 
derzeit wie "gewollt und nicht gekonnt" vor.

Deshalb sieht mein neues Konzept wie folgt aus:

Der Atmega128(14.7456MHz) bekommt seine Daten über eine UART mit 921.8k, 
verarbeitet diese und leitet das Ergebnis über SPI an einen Atmega8 
(16MHz) der alleine für die Ein- und Ausgabe der DMX Daten auf den Bus 
zuständig ist, weiter. Dies schafft zusätzlich den Vorteil, dass ich 
problemlos auf mehrere Universen erweitern kann. Dies kommt mir 
auserzudem zu gute, da der Atmega128 auch noch für ein Grafik-Display 
und die Benutzerführung zuständig ist und der sich über die zusätzlichen 
Resourcen freut...

Nochmal vielen Dank für eure Unterstützung!

von spess53 (Gast)


Lesenswert?

Hi

>Deshalb sieht mein neues Konzept wie folgt aus: ....

Eine andere Variante wäre ein ATMega164...1284 mit 22MHz etwas 
übertaktet. Die haben 2 UARTs und mit den 22MHz kannst du beide 
Baudraten mit ausreichend geringen Fehler erzeugen.

MfG Spess

von Reinhard Kern (Gast)


Lesenswert?

Fabian schrieb:
> Die Kommunikation über beide Uarts ist immer bidirektionel, weshalb ich
> nicht eine als USART die andere als UART laufen lassen kann.
> Konkret geht es bei mir um die Ein- und Ausgabe von DMX Daten, weshalb
> ich an die 250k gebunden bin.

Hallo,

da liegt wohl ein Irrtum vor: ein UART/USART ist eine Einheit mit Sender 
UND Empfänger, die müssen schon im gleichen Modus arbeiten - aber ein 
ATMega128 enthält 2 Uarts (also 2 Sender und 2 Empfänger), die beiden 
sind unabhängig, also kann wohl einer als asynchron und der andere als 
synchron programmiert werden. 2 Prozessoren zu verwenden, ist ziemlich 
sinnfrei, weil dann die Interprozessor-Kommunikation dazu kommt, daher 
läuft sowas genausogut auf einem. Was anderes ist es natürlich, wenn man 
unbedingt das System so kompliziert wie möglich machen will, ich wüsste 
aber nicht, mit welcher Motivation - ich würde als Lehrer dafür eine 
schlechtere Note vergeben und nicht etwa eine bessere.

Gruss Reinhard

von Norbert (Gast)


Lesenswert?

Na ja, zu den Informationen und der Frage vom 4.9. hat er wenigstens am 
(fast) 7.9. einige Feinheiten hinzugefügt, die sämtliche Hilfestellungen 
vorher ins Nichts laufen liessen. Einige Leute hier haben sich Gedanken 
gemacht, ein bisschen gerechnet und versucht Hilfestellungen zu geben 
nur um jetzt festzustellen das alles für den Sack war.

Ich muss konstatieren:
Es macht zunehmend weniger Spass hier im Forum aktiv mitzuhelfen.

von Fabian (Gast)


Lesenswert?

@Reinhard Kern und @Norbert:
Ich denke, dass ihr mich jetzt falsch versteht.
Ich muss:
  - Eine bidirektionale Verbindung mit 921.8k betreiben (RX / TX)
  - Eine bidirektionale Verbindung mit 250.0k betreiben (RX / TX)

Das heißt, dass ich nicht zwei Uarts für eine Verbindung verwenden kann. 
Die Interprozessorkommunikation über SPI erzeugt weniger Overhead als 
die direkte Ausgabe der Daten.

Ich freue mich, wenn mir hier geholfen wird. Auch die Ansätze sind sehr 
gut und hilfreich. Und genau diese Ansätze haben mir gezeigt, dass es 
nicht ohne "Krückstock" geht.

Ich verstehe daher eure jetzige Kritik nicht.

von Fabian (Gast)


Lesenswert?

Welche Möglichkeit ich im Übrigen auch noch nicht ganz ausschließe ist 
die von Spess53:

spess53 schrieb:
> Eine andere Variante wäre ein ATMega164...1284 mit 22MHz etwas
>
> übertaktet. Die haben 2 UARTs und mit den 22MHz kannst du beide
>
> Baudraten mit ausreichend geringen Fehler erzeugen.

Hier muss ich aber erst durchschauen, ob ich mit der Anzahl der IO-Pins 
und der sonstigen Peripherie auskomme, da der Professor ein paar 
Abstriche gegenüber dem 128 besitzt.

von Norbert (Gast)


Lesenswert?

Fabian schrieb:
> Ich verstehe daher eure jetzige Kritik nicht.

Ganz einfach, hättest Du im ersten Beitrag das hier geschrieben:
  - Eine bidirektionale Verbindung mit 921.8k betreiben (RX / TX)
  - Eine bidirektionale Verbindung mit 250.0k betreiben (RX / TX)

und nicht (im übertragenen Sinne) das hier:
  - Eine unidirektionale Verbindung mit 921.8k betreiben (RX)
  - Eine unidirektionale Verbindung mit 250.0k betreiben (TX)

dann hättest Du ab dem zweiten Beitrag lösungsorientierte, 
zielgerichtete Hilfe bekommen.

So haben wir uns eine nicht unerhebliche Zeit lang mit unnützen und 
nicht zielgerichteten Dingen beschäftigt.

von Fabian (Gast)


Lesenswert?

Das die Informationen nicht zielgerichtet waren halte ich für 
übertrieben.

Außerdem lebt ein solches Forum nicht davon spezielle Probleme im Detail 
zu klären, sondern grundsätzliche Möglichkeiten zu eröffnen und 
aufzuzeigen.

Da dieser Thread nicht nur mir, sondern auch anderen helfen soll, die 
nicht unbedingt genau das gleiche Problem haben, ist es vom Vorteil, 
wenn ein breites Spektrum an Lösungsvorschlägen aufgezeigt wird.

von Reinhard Kern (Gast)


Lesenswert?

Fabian schrieb:
> @Reinhard Kern und @Norbert:
> Ich denke, dass ihr mich jetzt falsch versteht.
> Ich muss:
>   - Eine bidirektionale Verbindung mit 921.8k betreiben (RX / TX)
>   - Eine bidirektionale Verbindung mit 250.0k betreiben (RX / TX)

Du hast 2 Verbindungen und dafür 2 UARTs zur Verfügung, wo ist das 
Problem?

Gruss Reinhard

von Sascha W. (sascha_w)


Lesenswert?

das er die 250k Verbindung nur mit USART nutzen könnte, aber eben nur 
als TX aber nicht als RX da er vom Sender keinen Takt bekommt (bzw. der 
keinen Takteingang hat).

Sascha

von Reinhard Kern (Gast)


Lesenswert?

Sascha Weber schrieb:
> das er die 250k Verbindung nur mit USART nutzen könnte, aber eben nur
> als TX aber nicht als RX da er vom Sender keinen Takt bekommt (bzw. der
> keinen Takteingang hat).
>
> Sascha

Ach, und das ist mit 2 ATMegas anders? Man lernt nie aus.

Gruss Reinhard

von Fabian (Gast)


Lesenswert?

Ja, ist es. Da der "Eingabe" Prozessor ein Baudraten-Quarz bekommt 
(14.7456MHz) und der "Ausgabe" Prozessor einen "graden Wert" (16.0000 
MHz). Die Datenübertragung zwischen diesen beiden Prozessoren läuft dann 
über eine synchrone SPI Schnittstelle.

von Reinhard Kern (Gast)


Lesenswert?

Fabian schrieb:
> Ja, ist es. Da der "Eingabe" Prozessor ein Baudraten-Quarz bekommt
> (14.7456MHz) und der "Ausgabe" Prozessor einen "graden Wert" (16.0000
> MHz). Die Datenübertragung zwischen diesen beiden Prozessoren läuft dann
> über eine synchrone SPI Schnittstelle.

Hallo,

das ist hirnverbrannter Quatsch und widerspricht ausserdem Saschas 
Aussage, dass es am fehlenden Takt liegt. Ich beteilige mich hier nicht 
mehr, das ist einfach zu blöd.

Gruss Reinhard

von Verwirt (Gast)


Lesenswert?

Ich verstehe die Aufregung nicht. Wenn die Verwendung eines anderen 
ATMegas nicht grundsätzlich ausgeschlossen ist, nimm doch einen ATXmega. 
Da kannst Du so ziemlich jede Baudrate mit ausreichender Genauigkeit bei 
16 bzw. 32MHz Systemtakt einstellen. Und 2 UARTs haben die meisten 
xMegas außerdem. Z.B. der ATXmega64A3 hat 2 UARTs im TQFP64 Gehäuse. 
Oder nimm gleich den ATXmega128A1 im TQFP100 mit 4 UARTs.

Ansonsten ist IMHO nur die Lösung mit 2 ATmegas mit unterschiedlichem 
Takt (18.432MHZ / 16.000 MHZ) möglich.

von Fabian (Gast)


Lesenswert?

Verwirt schrieb:
> Autor: Verwirt (Gast)
>
> Datum: 08.09.2010 14:49

Danke! Du hast es anscheind verstanden! Und genau das ist nun auch mein 
"hoffentlich" letzter Entschluss. Leider sind die XMegas nicht 
pinkompatibel. Aber dadurch, dass ich sie (auch bei 3.3V) bis 32 MHz 
Takten kann, für mich schon sehr sympathisch!

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.