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
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
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
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
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
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
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!