Forum: Mikrocontroller und Digitale Elektronik Datenübertragung (Eigenbau)


von FewKinG (Gast)


Lesenswert?

Hallo erstmal.

Ich bin noch relativ neu im Gebiet der Mikrocontroller, habe mich aber 
schon etwas eingearbeitet und bin auch im Gebiet der Programmierung 
schon erfahren.
Allerdings stehe ich gerade vor einem Problem:

Ich will eine Datenübertragung von einem mC zu einem anderen 
realisieren.
Dazu wird nur ein Pin benutzt, der erste mC soll mit einer festgelegten 
Frequenz (interner Timer mit Prescaler und Counter) ein Signal senden. 
Der Empfänger erkennt das Startbit, liest die Nachricht aus und wertet 
sie aus.
Natürlich müssen dazu beide exakt mit derselben Frequenz arbeiten.
Das Problem ist eben diese Synchronität. Da die beiden mCs durchaus 
leicht versetzt arbeiten können, funktioniert das mit der Übertragung 
scheinbar nicht so (wenn Empfänger und Sender ein und derselbe mC sind, 
funktioniert es sehr gut).

Hat da jemand eine Idee wie das normalerweise realisiert wird/werden 
kann?
Ich dachte daran, die Lesefrequenz des Empfängers zu erhöhen, um so 
schneller auf das Signal zu reagieren. Aber dann stehe ich vor dem 
Problem wie ich trotz der schnelleren Geschwindigkeit die richtigen 
Daten auslesen kann.

Bei den mCs handelt es sich um einen ATMega16 und einen ATMega8, beide 
mit 16MHz Taktung. Der Timer läuft mit 1/8 CPU Speed und zum Testen habe 
ich den Sende/Empfangstakt auf 50*5000 Timertakte gesetzt.

Die Verbindung der beiden mCs scheint inzwischen gut zu funktionieren, 
habe den Inputpin des einen jeweils mit dem Inputpin des anderen 
verbunden und jeweils mit einem Pulldown-Widerstand gegen GND gezogen.

Danke für jede Hilfe.
Few

von Stefan (Gast)


Lesenswert?

One-Wire?
I²C?
UART?
CAN?

von Michael U. (amiga)


Lesenswert?

Hallo,

daß, was Du hier beschreibst, klingt nach simpler serieller Übertragung. 
Also UART TX als Sender, UART RX als Empfänger, Startbit, 8 Datenbits, 
Stoppbit mit machbarer Baudrate. Wo ist jetzt genau das Problem?
Geht natürlich auch komplett in Software, wenn kein UART frei ist.
Empfang mit der Startbit-Flanke starten, 1,5 Bitzeiten warten und dann 
abtasten, ob 1 oder 0, eine Bitzeit warten und nächstes Bit einlesen.
Auf nächstes Startbit warten und wieder von vorn.

Wenn es störfester werden soll, muß die Baudrate eben runter und 
mehrfach-Abtastung gemacht werden. Also z.B. bei 1/4, 1/2, 3/4 der 
Bitzeit und dann eine 2 aus 3 Entscheidung, ob 1 oder 0.

Macht jeder UART bei RS232 schon ewig und 3 Tage so. ;)

Gruß aus Berlin
Michael

von Fred S. (Gast)


Lesenswert?

Hallo Few,

Deine Schilderung klingt so, als ob Du das Rad (in diesem Fall die 
serielle Datenübertragung) neu erfinden möchtest. Beide von Dir 
genannten Prozessoren haben UARTs, mit denen sich eine solche 
Datenübetragung (Eindrahtleitung) problemlos (nötigenfalls auch mit > 
115200Bd) realisieren lässt (Voraussetzung: Quarzbetrieb beider 
Prozessoren). Wenn Du wesentlich höhere Übertragungsraten benötigst, 
wirst Du um eine zweite Leitung (Taktsignal zur Synchronisation) nicht 
herumkomme -- dann könntest Du auch I2C oder SPI nehmen.

> Hat da jemand eine Idee wie das normalerweise realisiert wird/werden
> kann?
Es würde sicher reichen, das Signal 2-3x innerhalb eines Bits 
abzutasten; das hängt auch vom Protokoll ab.

> Problem wie ich trotz der schnelleren Geschwindigkeit die richtigen
> Daten auslesen kann.
Um welche Datenübertragungsrate geht es denn?

> Die Verbindung der beiden mCs scheint inzwischen gut zu funktionieren,
> habe den Inputpin des einen jeweils mit dem Inputpin des anderen
> verbunden und jeweils mit einem Pulldown-Widerstand gegen GND gezogen.
Wieso Du *Ein*gänge miteinander verbindest und diese dann auf GND 
ziehst, ist mir rätselhaft.

Viele Grüße

Fred

von Markus B. (wolframator)


Lesenswert?

Wie weit sollen die µCs denn auseinander sein? Für welchen Zweck?

Um mal 2 der Beispiele detailierter zu nennen:

I²C:
- kurze Strecken
- 100kbit/s (400 kbit/s)
- 120 Knoten (1017 Knoten) pro Bus
- 2 Pins am µC benötigt

CAN:
- bis 1000m
- bis 1000mbit/s (dan jedoch nur noch ca. 30m Kabellänge)
- 32/64/110 Knoten pro Bus (je nach Bustreiber)
- i.d.R. 5 Pins am µC benötigt

von Fred S. (Gast)


Lesenswert?

Hi Few,

wenn Du lernen möchtest, wie man Software UARTs schreibt, findest Du auf 
der folgenden Seite mehrere entsprechende Application Notes von Atmel:

http://www.atmel.com/dyn/products/app_notes.asp?family_id=607

Gruß

Fred

von FewKinG (Gast)


Lesenswert?

Hallo

Erstmal danke für die vielen Antworten! Das so schnell soviel kommt 
hätte ich nicht gedacht.

Ich mache das Ganze, weil der µC soweit ich weiß nicht jeden Pin für die 
UART-Übertragung nutzen kann. Ich möchte einen µC aber nutzen, um 
mehrere weiter anzuschließen.
Außerdem wollte ich nicht einfach nur eine vorgefertigte Funktion 
benutzen. Da mich die Hardware allgemein interessiert, wollte ich sowas 
selbst realisieren, eben um die Grundlagen (nicht nur in der Theorie) zu 
verstehen.

Dass es nach dem Empfangen eines Startbits sinnvoll ist nicht nur eine 
sondern 1 1/2 Bitzeiten zu warten, hab ich ehrlich gesagt noch gar nicht 
bedacht, werd ich auf jeden Fall einbauen. Da könnte eine Fehlerquelle 
liegen.

> Problem wie ich trotz der schnelleren Geschwindigkeit die richtigen
> Daten auslesen kann.
> Um welche Datenübertragungsrate geht es denn?
Ich glaube, das hast du falsch verstanden, bzw. es war schlecht 
formuliert. Ich wusste nicht genau, wie ich die richtigen Bit-Signale 
erkennen soll, wenn ich dreimal so schnell (oft) lese, wie ich sende. 
Zwei-aus-Drei klingt logisch...wenn von 3 Abtastungen zweimal eine 1 
empfangen wurde, die 1 nehmen, sonst die 0. Werd ich auch testen.


> Die Verbindung der beiden mCs scheint inzwischen gut zu funktionieren,
> habe den Inputpin des einen jeweils mit dem Inputpin des anderen
> verbunden und jeweils mit einem Pulldown-Widerstand gegen GND gezogen.
> Wieso Du *Ein*gänge miteinander verbindest und diese dann auf GND
> ziehst, ist mir rätselhaft.
Das eine war ein Schreibfehler, ich habe den Inputpin natürlich mit dem 
jeweils anderen OUTputpin verbunden. Und die Verbindung auf GND gezogen, 
weil der µC, wenn kein Gerät angeschlossen ist (was in der späteren 
Verwendung u.a. der Fall sein wird), keinen festen Zustand am Eingang 
hat und er dort deshalb wahllos wechselnd 0 und 1 ausliest.

Auf jeden Fall Danke, für die Hilfe.
Tolle Seite und Forum. Werd dann mal weiter probieren.
Few

von Fred S. (Gast)


Lesenswert?

Hi Few,

> Ich mache das Ganze, weil der µC soweit ich weiß nicht jeden Pin für die
> UART-Übertragung nutzen kann. Ich möchte einen µC aber nutzen, um
> mehrere weiter anzuschließen.
OK -- dann würde man alle Hardware-UARTs nehmen und den Rest per 
Software-UART realisieren; klingt eigentlich aber immer noch eher nach 
einer Aufgabe für I2C oder SPI!

> Das eine war ein Schreibfehler, ich habe den Inputpin natürlich mit dem
> jeweils anderen OUTputpin verbunden. Und die Verbindung auf GND gezogen,
> weil der µC, wenn kein Gerät angeschlossen ist (was in der späteren
> Verwendung u.a. der Fall sein wird), keinen festen Zustand am Eingang
> hat und er dort deshalb wahllos wechselnd 0 und 1 ausliest.
Pull-down Widerstände werden meist nur dann eingesetzt, wenn man FETs 
ansteuert und sicher sein muss, dass diese nicht während der 
Prozessor-Initialisierung durchgesteuert werden. So wie Du es 
beschreibst, würde ich empfängerseitig den internen Pull-up Widerstand 
aktivieren.

Viel Erfolg

Fred

von FewKinG (Gast)


Lesenswert?

Hallo mal wieder.

Auf jeden Fall Danke für die Unterstützung. Das Fehlschlagen meiner 
Übertragung hatte mehrere Gründe. Der technische Ansatz war schon etwas 
falsch. Außerdem habe ich als Grundzustand Low und nicht High gewählt, 
deshalb brauchte ich auch die Pull-Downs.

Danke vielmals an Fred! Das Tutorial von Atmel ist sehr hilfreich und 
detailliert. Ich habs jetzt hinbekommen, musste das Timing noch etwas 
verfeinern und nun klappts!

Danke!

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.