Forum: Mikrocontroller und Digitale Elektronik Wie viele Software UART's mit Atmega?


von Markus (Gast)


Lesenswert?

Hallo

Ich möchte mit dem Atmega Serielle Geräte abfragen. 12 Stück um genau zu 
sein. In dem Wiki steht das das alles kein Problem ist da man das ja in 
Software realisieren kann.
Ich dachte an z.b. den Atmega32. Meine Frage ist hat jemand sowas schon 
einmal gemacht? Hat der Atmega32 genug "Power" um dich um 12*9600bit/s 
zu kümmern und das dann noch z.b. an einen PC zu senden?

gruss

Markus

von Fritz (Gast)


Lesenswert?

> Hat der Atmega32 genug "Power" um dich um 12*9600bit/s zu kümmern und
> das dann noch z.b. an einen PC zu senden?

Nein, auf keinen Fall gleichzeitig. Da eine Soft-UART Timer braucht, 
werden wohl max. 2 UARTs per Software realistisch sein.
Letztlich mußt Du Dein Problem wohl mit einem anderen Ansatz lösen 
(sequentielle Abfrage).

von Rahul, der Trollige (Gast)


Lesenswert?

>Hat der Atmega32 genug "Power" um dich um 12*9600bit/s
>zu kümmern und das dann noch z.b. an einen PC zu senden?

Das bezweifle ich.
In solcheinem Fall sollte man eher auf externe UART ausweichen.
Man könnte ein paar mega8 per SPI, TWI oder sonst wie an einen 
Master-Controller (könnte auch ein Mega8 sein...) anbinden. Die 
UART-Controller könnten dann auch Datenzwischenspeichern, falls der 
Master gerade etwas anderes tut und nicht auf etwaige Daten reagieren 
kann.

von Stefan K. (_sk_)


Lesenswert?

>Ich dachte an z.b. den Atmega32. Meine Frage ist hat jemand sowas schon
>einmal gemacht? Hat der Atmega32 genug "Power" um dich um 12*9600bit/s
>zu kümmern und das dann noch z.b. an einen PC zu senden?

Ich denke schon, dass das geht.
Du brauchst nicht für jeden UART einen Timer, Du kannst alle UARTs 
innerhalb eines Timer-IRs bedienen. Jedenfalls wenn die Baudraten alle 
gleich sind (wie Du geschrieben hast).

Auch von der Rechenleistung sollte der ATmega reichen. Voraussetzung ist 
natürlich eine effektive Programmierung.

Gruß, Stefan

von Peter D. (peda)


Lesenswert?

Markus wrote:

> Ich dachte an z.b. den Atmega32. Meine Frage ist hat jemand sowas schon
> einmal gemacht? Hat der Atmega32 genug "Power" um dich um 12*9600bit/s
> zu kümmern und das dann noch z.b. an einen PC zu senden?

Ja, sollte gehen.

Du mußt die Bits mindestens 3-fach abtasten, d.h. etwa 500 Zyklen pro 
Timerinterrupt sind verfügbar.

Kannst Du sie aber nacheinander abfragen, ist es überhaupt kein Problem.


Peter

von Rahul, der Trollige (Gast)


Lesenswert?

>Das bezweifle ich.
... nicht mehr...

>Ja, sollte gehen.
1. Wenn Peter das schreibt, ist da was dran.
2. Ich bin vom Standard-Soft-UART mit einem Timer und Startbit-Interrupt 
auf fallende Flanke ausgegangen.

von Fritz (Gast)


Lesenswert?

> Auch von der Rechenleistung sollte der ATmega reichen. Voraussetzung ist
> natürlich eine effektive Programmierung.

Die möchte ich dann gerne sehen !

von Falk (Gast)


Lesenswert?

@Fritz

>> Auch von der Rechenleistung sollte der ATmega reichen. Voraussetzung ist
>> natürlich eine effektive Programmierung.

Naja, wo gilt der Satz nicht? ;-)

>Die möchte ich dann gerne sehen !

Me too!

Hmmm, mal überschlagen. Nehmen wir 9K6, macht 1041,6666 us / Bit. 
Normale UARTs arbeiten mit 16 facher Überabtastung, manchmal auch im 
High Speed Modus mit  nur 8facher. Wenn man nen Baudratenquarz benutzt, 
geht sicher auch 8fache, ggf. sogar nur x4. Bei x8 braucht man einen 
Timerinterrupt von 13,02 us. Ein MEGA@16MHz hat da 208 Takte. Mit diesen 
208 Takten muss er 12 Pins einlesen (easy), auseinanderfummeln (gehtmal 
noch), 12x in eine Statemachine gehen und auswerten (uiuiuiui). Das wird 
ENG!

Sinnvoller ist hier sicherlich die Verwendung des Hardware-UART, eines 
MAX232 + 12fach MUX für die einzelnen Schnittstellen.

MfG
Falk

von A.K. (Gast)


Lesenswert?

Wenn diese seriellen Geräte "abgefragt" werden - müssen die alle 
gleichzeitig aktiv sein, oder reicht es aus, wenn der Controller sie 
alle nacheinander abfragt? Dann wird's nämlich nahezu trivial.

von Stefan K. (_sk_)


Lesenswert?

Also gut, mit 16-facher Überabtastung wird es nicht gehen. Mir bekannte 
Soaftware-UARTs arbeiten mit 3-facher Überabtastung. Dabei z.B. der 
SW-UART von HITEX, nicht gerade eine Bastlerklitsche. Auch Beispiele von 
Atmel sind meines Wissens mit 3-facher Überabtastung (habe jetzt aber 
nicht genauer nachgeschaut).

Möchte man mehr als 3-fach verwenden, sollte man sich erstmal fragen, 
was man dadurch gewinnt. Bei 16-fach kann man einen Voter realisieren 
und "Noise" feststellen. Nur ... selbst bei den Hardware-UARTs benutzt 
die meiste Software diese Flags nicht.

Mit 3-facher Überabtastung erhält man 555 Zyklen bei 16Mhz und 9600 
Baud. Aber mal ehrlich: was hat denn die State-Machine so viel zu tun? 
Wenn pro State mal mehr als 10 Assemblerbefehle stehen, dann ist das 
viel. Ich sehe keinen State, der mehr als 20 Zyklen benötigt. Dazu die 
Zyklen, die die State-Machine braucht, das sind auch unter 20 Zyklen, 
worstcase.

Viele Grüße, Stefan

von Falk (Gast)


Lesenswert?

@Stefan Kleinwort

>Atmel sind meines Wissens mit 3-facher Überabtastung (habe jetzt aber
>nicht genauer nachgeschaut).

Wieso 3. Die Zahl ist mir in diesem Zusammenhang ein wenig suspekt. 
Besser doch 4. Macht auch USB bei 12 Mbit so.

>Baud. Aber mal ehrlich: was hat denn die State-Machine so viel zu tun?

Programmiers mal. Dann wirst du schon sehen. Ausserdem braucht es ja 
noch ein wenig Rechenzeit für die Hauptschleife.

MFG
Falk

von Philipp S. (philipp)


Lesenswert?

> Wieso 3. Die Zahl ist mir in diesem Zusammenhang ein wenig suspekt.

Immer ungerade bei Software-UART! Wenn Du einen Wechsel zum Startbit 
hast, weißt Du nie genau, ob Deine Abtastung zufällig sofort nach dem 
Wechsel war oder zufällig haarscharf vor dem nächsten Wechsel. In beiden 
Fällen kann es passieren, daß die Abtastung genau 1/Baud später eben 
gerade ins falsche Bit rutscht.

Du kennst also nur einen Zeitraum, in dem der Wechsel stattgefunden hat. 
Wenn Du mit einem Abtastzeit/punkt/ maximalen Abstand von einem 
Zeit/raum/ haben willst, brauchst Du eine ungerade Anzahl von 
Abtastungen pro Zyklus, mindestens drei. In der Praxis zeigt sich, daß 
drei meistens auch reicht.

Aber ist vier nicht besser? Nein! Denn man kann nicht entscheiden, 
welchem Abtastwert man trauen kann. Wenn bei 4 noch Passivlevel war und 
bei 1 schon das Startbit abgetastet wurde, soll man dann 2 oder 3 
nehmen? Jeder von denen könnte nur ein Viertel Zyklus vom Bitwechsel 
entfernt sein; ein Viertel bekommt man aber ja nachdem schnell zusammen. 
Auf jeden Fall schneller als das Drittel, das man bei nur dreifacher 
Überabtastung hat. (Um fair zu sein: kleiner Vorteil der vierfachen 
Überabtastung ist eine gewisse Fehlererkennung, wenn mal 2 und 3 
unterschiedlich sind.)

Wenn's noch nicht klar ist, mal Dir mal ein Diagramm (Eingang und 
Abtastung über Zeit), dann ist es ganz anschaulich.

von Falk (Gast)


Lesenswert?

@Philipp Sªsse

>Immer ungerade bei Software-UART! Wenn Du einen Wechsel zum Startbit
>hast, weißt Du nie genau, ob Deine Abtastung zufällig sofort nach dem
>Wechsel war oder zufällig haarscharf vor dem nächsten Wechsel. In beiden

Nur mal zur Info, USB Tranceiver arebiten EXAKT mit 4facher 
Überabtastung bei LOW/Full Speed. Und das funktioniert wunderbar. Man 
muss nur die Logik ein wenig richtig interpretieren.

>Fällen kann es passieren, daß die Abtastung genau 1/Baud später eben
>gerade ins falsche Bit rutscht.

Denke ich nicht. Der Algorithmus muss nur passen. Von daher 
unterscheiden sich Software- und Hardware UART nicht.

MFG
Falk

von Stefan K. (_sk_)


Lesenswert?

@Stefan Kleinwort

>Wieso 3. Die Zahl ist mir in diesem Zusammenhang ein wenig suspekt.
>Besser doch 4. Macht auch USB bei 12 Mbit so.

Durch die asynchrone Abtastung des RXD-Signals musst Du damit rechnen, 
dass die erste Abtastung des Startbits nicht direkt bei dessen Start 
erfolgt. Bei 2-fach ergibt sich:

Abtast-Nummer:       1         2
Sample-Position:     0 - 49%   50 - 99%

Der ideale Sampingpunkt ist 50% (Mitte einer Bit-Zeit).
Wie man sieht, ist sowohl Abtast-Nummer 1 als auch 2 nicht sicher (0% 
bzw 99% worstcase).

Bei 3-fach ergibt sich:

Abtast-Nummer:       1         2          3
Sample-Position:     0 - 32%   33 - 65%   66% - 99%

Abtast-Nummer 2 ist mit einer Sampe-Position zwischen 33% und 65% in der 
Praxis verwendbar.


>Programmiers mal. Dann wirst du schon sehen. Ausserdem braucht es ja
>noch ein wenig Rechenzeit für die Hauptschleife.

Etwas habe ich mir das Problem schon angeschaut, bevor ich geschrieben 
habe ;-)

Lass es meinetwegen worstcase 70% CPU-Belastung werden. So what? Die 
Rest-Rechenleistung entspricht einem ATmega mit 5Mhz-Quarz. Viele meiner 
Projekte takten nicht schneller (3,0V und/oder um Strom zu sparen).

Gruß, Stefan

von Falk (Gast)


Lesenswert?

@Stefan Kleinwort

>>Programmiers mal. Dann wirst du schon sehen. Ausserdem braucht es ja
>>noch ein wenig Rechenzeit für die Hauptschleife.

>Etwas habe ich mir das Problem schon angeschaut, bevor ich geschrieben
>habe ;-)

Und wo ist der getestete, lauffähige Code? Bis jetzt ist alles nix als 
Konzept und Planung.

MFG
Falk


von Stefan K. (_sk_)


Lesenswert?

>Und wo ist der getestete, lauffähige Code? Bis jetzt ist alles nix als
>Konzept und Planung.

Ich helfe ja gerne. Aber nur um Dir zu zeigen, dass das funktioniert, 
setze ich mich nicht hin und programmiere etwas, was ich selbst nie 
brauchen werde.

Und wenn Du mir nicht glaubst, dann halte es einfach wie Rahul:

>1. Wenn Peter das schreibt, ist da was dran.


Stefan

von Mathias G. (mgiaco)


Lesenswert?

Hallo, ich habe nicht alles gelesen.

Aber du könntest alle TX zusammen und die RX jeweils mit einem 
Transister zusammen schalten. ==>  Weisst du was ich meine?

Dann ein Protokoll machen die Nachricht immer an alle schicken und 
denjenigen, der gefragt ist, antwortet. So reicht dir 1 Serielle 
Schnittstelle.

mfg mathias

von Rahul, der Trollige (Gast)


Lesenswert?

>Aber du könntest alle TX zusammen und die RX jeweils mit einem
>Transister zusammen schalten. ==>

Laaaaaaaaaaaaaaaaaaaangweilig...

Was ist eigentlich ein Transister?
Vielleicht ein Transsexueller Kanister?
(Vielleicht auch eine Mischung aus TransistOr und Kanister?

von A.K. (Gast)


Lesenswert?

Ich glaub wir sollten den Original-Poster mal wieder zu Wort kommen 
lassen. Seit der ursprünglichen Frage hat er sich nämlich nicht mehr 
reingetraut.

von mgiaco (Gast)


Lesenswert?

@ Raul lustig lustig, wenigstens habe ich eine sinvollen Beitrag 
geleistet

mfg

von Rahul, der Trollige (Gast)


Lesenswert?

>@ Raul lustig lustig, wenigstens habe ich eine sinvollen Beitrag
>geleistet

Sinnvoll? Darüber lässt sich streiten.
Lesen und schreiben ist auch nicht deine Stärke...

das
>Laaaaaaaaaaaaaaaaaaaangweilig...
bezog sich auch nur darauf, dass diese Lösung inzwischen sooo häufig 
hier gepostet wurde, dass mal ein anderer Weg interessant wäre.

von Zossi (Gast)


Lesenswert?

Aeh, der mit den 16 Statemschinen zum Abtasten leuchtet nicht ein. Die 
Statemaschinen laufen nicht seriell, sondern parallel. Die kann man alle 
zusammen in einem Word oder zwei laufen lassen.

Z.

von Falk (Gast)


Lesenswert?

@Stefan Kleinwort

>Und wenn Du mir nicht glaubst, dann halte es einfach wie Rahul:

>>1. Wenn Peter das schreibt, ist da was dran.

Weder Peter, noch ich, noch sonstwer hat die Weisheit für sich 
gepachtet. Auch Peter haut mal daneben. Und am Ende zählt nur eine 
lauffähige Lösung, kein "Das Problem ist lösbar" Gerede.

@Zossi

>Aeh, der mit den 16 Statemschinen zum Abtasten leuchtet nicht ein. Die

Bei 12 Kanälen sind es "nur" 12 State Machines.

>Statemaschinen laufen nicht seriell, sondern parallel. Die kann man alle
>zusammen in einem Word oder zwei laufen lassen.

Und du denkst das wird einfacher? Denk dran, die laufen nich alle 
parallel im gleichen State.

MFG
Falk

von mgiaco (Gast)


Lesenswert?

Na ja ich mach mir nix aus rechtschreibung, in Deutsch hatte ich immer 
die schlechtesten Noten. ... aber es geht ja um was anderes.

Man könnte vielleicht auch nur Dioden nehmen. Oder UND-Gatter


mfg mathias

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.