Forum: Mikrocontroller und Digitale Elektronik Daten Senden & Empfangen


von Sebi2020 (Gast)


Lesenswert?

Hey liebes Forum,
wollte mal nachfragen, wie man am Besten mit einem uC Daten parallel & 
seriell einliest. Sprich, wenn ich jetzt eine einfache Datenübertragung 
von uC 1 nach uC 2 realisieren möchte.
Also Als Beispiel, ich sende von Port A von uC 1 zu uC 2.
Ich kann ja jetzt nicht einfach alle Bytes nacheinander auf die Leitung 
geben. Wie stellt der Sender den sicher, das uC 2 das Byte gelesen hat?
Mir wäre dazu sowas wie eine ACK Leitung eingefallen. Quasi bestätigt 
der Empfänger jedes mal wenn er ein Byte bekommen hat und erst dann wird 
das nächste gesendet. Habe allerdings noch nie so eine ACK - Leitung bei 
anderen Parallelbussen gesehen

Das nächste wäre der serielle Empfang. wie wird der am besten 
realisiert? Wenn ich jetzt nich gerade 500 UARTS im IC verbaut habe? 
Sprich ich will einfach über eine Sendeleitung 2 Byte seriell 
übertragen. Quasi auf der selben Platine von Chip a zu Chip b....
Da hab ich wieder den Punkt ich kann ja nicht einfach alle Bits 
nacheinander auf die Leitung geben. Ich könnte zwar eine zweite Leitung 
nehmen um einen Takt vorzugeben, aber da hab ich dann wieder das 
Problem, das der Sender ja nicht wissen kann, ob der Empfänger überhaupt 
so schnell reagieren könnte, und mit dem vorgegebenen Takt mithalten 
konnte....

Ich mein muss man den jedes mal den UART nutzen für die Übertragung von 
Daten größer 1 Bit?... Das klingt für mich wie mit Kannonenkugeln auf 
Spatzen schießen....

von Christian B. (casandro)


Lesenswert?

Also erst mal durchatmen und überlegen was Du willst.

Wenn Du parallel Daten verschicken willst, schau Dir doch mal an, was 
Dein Drucker macht. Der hat ja, in aller Regel, auch eine parallele 
Schnittstelle. Bei Epson Druckern (zumindest bei meinem) ist die 
Schnittstelle sogar sehr schön im Handbuch beschrieben.
Hier ist ein brauchbares Bild mit der Erklärung:
http://www.databooks.com/tecref/parport.gif
Grob gesagt hast Du 2 Leitungen, eine Ack und eine Strobe. Der Sender 
legt die Daten auf die Leitungen, gibt dann per Strobe einen Puls raus, 
und wenn der Empfänger die Daten empfangen hat, bestätigt er sie mit 
einem Puls auf Ack.

Bei seriellen Leitungen brauchst Du, wie schon bemerkt, eine Möglichkeit 
den Takt zu übermitteln. Die UART macht das relativ einfach, sie 
synchronisiert sich immer am Start Bit. Wenn der UART nichts überträgt 
hat er eine 1 am Ausgang. Überträgt er was so kommt zuerst eine 0 
(Startbit) dann die Datenbits (z.Bsp. 8 Bits), dann 1-2 Stoppbits die 0 
sein müssen. Da die Synchronisation nur am Anfang des Datenwortes 
erfolgt müssen beide UARTS mit möglichst gleichen Takten arbeiten. 
Sprich mit einem Quarz oder einem Resonator, der RC-Oszillator reicht 
nicht zuverlässig aus.

Eine simplere Alternative ist der SPI. Der überträgt den Takt getrennt.

Willst Du mehrere Chips miteinander sprechen lassen brauchst Du 2 Dinge, 
die Arbitrierung und die Adressierung.
Die Arbitrierung bestimmt, wer denn im Moment die Leitung belegen kann. 
Wenn Du beispielsweise einen Master hat, der die anderen Teile 
nacheinander abfragt, dann ich das ganz einfach. Der Master spricht dann 
immer dann, wenn er nicht gerade auf eine Antwort wartet. Und die Slaves 
sprechen nur dann, wenn sie gefragt wurden. Das kann aber auch 
schwieriger sein.
Die Adressierung besteht aus zusätzlichen Daten, die angeben, welches 
Teil gemeint ist. Das kann mit zusätzlichen Adressleitungen bestehen, 
oder einfach das erste Byte einer Übertragung sein.

Willst Du viele Teile mit mäßiger Geschwindigkeit vernetzen empfiehlt 
sich ein Bussystem. Da gibts zum Beispiel:
I2C für die Vernetzung innerhalb von kleinen Geräten, ist in vielen µCs 
schon drin
CAN für die Vernetzung innerhalb von etwas größeren Geräten, ist aber 
nicht in jedem µC mit drin, und braucht externe Hardware
RS-485 geht über den UART, und ist auch für größere Netze geeignet, Du 
musst aber Arbitrierung und Adressierung selber machen
Ethernet skaliert bis zu vielen tausend Stationen und vielen Gigabits, 
zusätzliche Hardware notwendig, aber sehr zuverlässig

von Alex (Gast)


Lesenswert?

Schätze mal, dass SPI die beste Lösung ist. Die ist schnell, 
bidirektional und einfach zu verbinden.

von Werner (Gast)


Lesenswert?

Christian Berger schrieb:
> Wenn Du parallel Daten verschicken willst, schau Dir doch mal an, was
> Dein Drucker macht. Der hat ja, in aller Regel, auch eine parallele
> Schnittstelle.

Wann war das denn - muss wohl kurz vor Ende des letzten Jahrtausends 
gewesen sein. USB ist seriell.

von Sebi2020 (Gast)


Lesenswert?

Er hat ja auch nicht von USB gesprochen, sondern von der 
Parallelschnittstelle!

von Sebi2020 (Gast)


Lesenswert?

Sebi2020 schrieb:
> Er hat ja auch nicht von USB gesprochen, sondern von der
> Parallelschnittstelle!

EDIT:
Ich möchte eine Duplex Punkt zu Punkt verbinden, wobei, der, der gerade 
Sendet dann natürlich den Takt vor gibt... nur was ich nicht verstehe an 
der seriellen Übertragung. Es gibt meistens keine Mechanismen, um 
festzustellen, ob das Byte auch vom Empfänger gelesen wurde... Es wird 
einfach drauf los gesendet, egal ob Empfangen oder nicht. Wenn nicht 
Empfangen ist dem Sender das auch egal... zumindest hab ich bei SPI noch 
kein Statuskanal gefunden, der dem Master sagt, super, ich hab das Byte 
empfangen!

von Bastler (Gast)


Lesenswert?

Was du meinst ist eine Schicht höher.
Nennt sich Protokoll.

Sowas "bastelt" man sich selber.

Z.B.: START|LÄNGE|DATEN...|CRC|STOPP

Der Empfänger kann dann z.B. die CRC als Quittung zurücksenden damit der 
Sender weiß, dass der Empfänger etwas empfangen hat.

von Christian B. (casandro)


Lesenswert?

Werner schrieb:
> Wann war das denn - muss wohl kurz vor Ende des letzten Jahrtausends
> gewesen sein. USB ist seriell.

Naja, Drucker die man nicht nach einem Jahr weg wirft oder ohne 
funktionsfähigen Treiber wo stehen lässt sind entweder alte 
Paralleldrucker, oder bei neuen Druckern Netzwerkdrucker. USB ist toll 
innerhalb eines Gerätes, aber zwischen unterschiedlichen Geräten ist es 
einfach zu unzuverlässig, da es nicht potentialfrei ist.

von Rumpel & Stilz (Gast)


Lesenswert?

Die Applikationen auf beiden kommunizierenden Controllern muessen 
natuerlich so geschrieben sein, dass hinreichend zeit fuer das Senden 
und Empfangen vorhanden ist. Und da ist in der Regel ein UART besser als 
SPI, denn es hat je ein Byte mehr Buffer im Sende-, wie im Empfangsfall.
SPI ist auch eher geeignet um mit passiven Komponenten, die die SPI 
Hardware an Board haben zu kommunizieren. zB ADC, DAC, ...

von Sebi2020 (Gast)


Lesenswert?

Bastler schrieb:
> Was du meinst ist eine Schicht höher.
> Nennt sich Protokoll.
>
> Sowas "bastelt" man sich selber.
>
> Z.B.: START|LÄNGE|DATEN...|CRC|STOPP
>
> Der Empfänger kann dann z.B. die CRC als Quittung zurücksenden damit der
> Sender weiß, dass der Empfänger etwas empfangen hat.

Ja, aber ich kenne kein Protkoll was mit einem Byte auskommt... Und 
eigentlich solls ja die Hardware schon hergeben. Warum das in Hardware 
so kompliziert realisert ist, versteh ich nicht. Wenn ich es irgendwie 
umsetzen würde, würde ich für ne Duplex-Verbindung einfach sagen, der 
Empfänger gibt jeweils den Sendetakt vor, dann kann auch nich viel 
schiefgehn.

von P. Watcher (Gast)


Lesenswert?

@Christian Berger

Super Beiträge! Danke.

von Sebi2020 (Gast)


Lesenswert?

Bastler schrieb:
> Was du meinst ist eine Schicht höher.
> Nennt sich Protokoll.
>
> Sowas "bastelt" man sich selber.
>
> Z.B.: START|LÄNGE|DATEN...|CRC|STOPP
>
> Der Empfänger kann dann z.B. die CRC als Quittung zurücksenden damit der
> Sender weiß, dass der Empfänger etwas empfangen hat.

EDIT: Ein reiner Empfänger (Receiver) kann nichts Senden, der empfängt 
nur!

von Fabian O. (xfr)


Lesenswert?

Schau Dir mal I2C bzw. TWI an, das dürfte Deine Anforderungen erfüllen 
und ist bei den meisten Mikrocontrollern in Hardware integriert.

von Sebi2020 (Gast)


Lesenswert?

Fabian O. schrieb:
> Schau Dir mal I2C bzw. TWI an, das dürfte Deine Anforderungen erfüllen
> und ist bei den meisten Mikrocontrollern in Hardware integriert.

Naja, der knackpunkt den ich immer nich verstehe ist. Was macht ein 
Receiver wenn die CPU nicht hinterherkommt, weil z.B. zuviel 
Programmcode drinne steckt?
Ich meine, ein FIFO Buffer, was bringt der z.B.? wenn ich hinter einem 
Ausgangsregister noch mal 8 FlipFlops Schalte, kommt das Signal um 1 
Takt verzögert am IC an. Aber wenn er dann das erste Signal gelesen hat, 
und dann länger als erwartet braucht, dann hilft der Buffer auch nicht 
mehr, dann gehen die Daten trotztdem verloren. Schaltet man mehrere 
FlipFlops hintereinander, verzögert sich das eben um die Anzahl um 
Takte, aber sobald das erste Byte am Eingang erscheint, ist nach hinten 
immer nur 1 Byte Platz.
Also bräuchte man quasi einen Speicher der von hinten nach vorne 
aufgefüllt wird, und quasi nach hinten Platz lässt. Frag mich gerade 
nur, wie das entsprechend in Hardwäre gelöst ist. Nen einfaches 
Shift-Register kanns nicht sein. quasi muss der Receiver von vorn nach 
hinten auffüllen, und jedes mal wenn die CPU sagt, hey ich hab gelesen, 
dann wird alles eins weiter nach vorne verschoben und hinten ist wie 
mehr Platz für mehr daten.

von Fabian O. (xfr)


Lesenswert?

Bei I2C kann der Empfänger die Taktleitung auf low halten, bis er das 
Byte verarbeitet hat. Der Sender sendet erst wieder, wenn der Empfänger 
die Taktleitung "losgelassen" hat. Damit braucht man keine großartigen 
Pufferlösungen.

Ganz allgemein ist ein Puffer aber nur dafür da, dass er (kurze) Bursts 
aufnehmen kann, also eine gewisse Anzahl an Bytes, die schnell 
hintereinander gesendet werden. Danach muss dem Controller aber immer 
genug Zeit gelassen werden, den Puffer abzuarbeiten. Wenn die Daten 
ununterbrochen mit zu hoher Geschwindigkeit kommen, hilft auch der 
größte Puffer nichts.

In Software nimmt man dafür übrigens gerne Ringpuffer, damit man die 
Daten nicht ständig rumkopieren muss.

von Sebi2020 (Gast)


Lesenswert?

Fabian O. schrieb:
> Bei I2C kann der Empfänger die Taktleitung auf low halten, bis er das
> Byte verarbeitet hat. Der Sender sendet erst wieder, wenn der Empfänger
> die Taktleitung "losgelassen" hat. Damit braucht man keine großartigen
> Pufferlösungen.
>
> Ganz allgemein ist ein Puffer aber nur dafür da, dass er (kurze) Bursts
> aufnehmen kann, also eine gewisse Anzahl an Bytes, die schnell
> hintereinander gesendet werden. Danach muss dem Controller aber immer
> genug Zeit gelassen werden, den Puffer abzuarbeiten. Wenn die Daten
> ununterbrochen mit zu hoher Geschwindigkeit kommen, hilft auch der
> größte Puffer nichts.
>
> In Software nimmt man dafür übrigens gerne Ringpuffer, damit man die
> Daten nicht ständig rumkopieren muss.

Naja, ich Frage mich halt, wies beim UART oder bei SPI ist. Bei der 
Parallelschnittstelle sagen sich beide Seiten bescheid, ob sie was 
erhalten haben oder zu senden haben. Beim UART sendet der Transmitter 
einfach (sofern die Steuersignale nicht verwendet werden, und das hab 
ich jetzt z.B. beim AVR-GCC Tut gesehen.) drauf los, auf gut Glück ob 
der Empfänger das überhaupt verarbeiten kann. Ohne Clear to Send Signal 
ist dem Transmitter das egal... frag mich wie so eine Kommunikation 
überhaupt fehlerfrei funktionieren kann, da die Schaltung stark davon 
abhängig ist, alles in einem Taktzyklus (Baudratentakt) abzuarbeiten. 
Wenn ers nicht schafft geht das Byte einfach verloren...

von Ralph (Gast)


Lesenswert?

Sebi2020 schrieb:
> Naja, ich Frage mich halt, wies beim UART oder bei SPI ist

Bei SPI gibt es 4 verschiedene Optionen.
Basis Version ist die  3 Draht Variante.
1. Clock
2. MasterOut-SlaveIn (MOSI)
3. SlaveOut-MasterIn (MISO odr SOMI)
Dann gibt es dazu 3 mögliche Erweiterungen.
4 Draht Versionen:
1. CS Chipselsect oder auch Slave select gennant. Hiermit signalisiert 
der Master welcher Slave jetzt angesprochen ist.
2. Busy oder Enable , Hiermit sagt der Slave dem Master das er 
empfangsbereit ist.
5 Draht Version
3. CS und Busy werden beide genutzt

Uart:
Hier gint es auch zusätzliche Signale parallel zu Rx und Tx.
zb DTR, RTS,.....  da weiß ich aber jetzt nicht alle und ihrer einzelnen 
Bedeutungen im detail.
Aber auch diese Signale dienen der Synchronisation.

von spontan (Gast)


Lesenswert?

>der Empfänger das überhaupt verarbeiten kann. Ohne Clear to Send Signal
>ist dem Transmitter das egal... frag mich wie so eine Kommunikation
>überhaupt fehlerfrei funktionieren kann, da die Schaltung stark davon
>abhängig ist, alles in einem Taktzyklus (Baudratentakt) abzuarbeiten.
>Wenn ers nicht schafft geht das Byte einfach verloren...

Lies doch mal im Wiki nach, oder in einem von diesen altmodischen 
Büchern, oder in Wikipedia.

Diese einfachen Fragen, die sind doch schon tausendmal beantwortet 
worden, alles veröffentlicht und leicht im Netz zu finden. Nur lesen 
mußt Du halt selbst.

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.