Hallo allerseits, ich baue gerade an einem Projekt, bei dem mehrere AVR ATmega8 Mikrocontroller über eine Leitung Daten austauschen. Dabei sollen in einem dreiadrigen Kabel zwei Leitungen für die Versorgung zuständig sein und auf der Dritten die Daten hin- und herflitzen. Es ist also kein typischer 1-Draht-Bus mit einem auf die Versorgungsspannung aufmodulierten Datensignal. Während V+ und V- durchgeschleift werden, soll die Datenleitung DL zerstückelt von einem Client zum nächsten gehen und von dem wieder zum nächsten, also keine durchgehende Leitung. Ich hoffe meine ASCII-Zeichnungen sind verständlich! |----------| |----------| |----------| | Client 1 |~~~ DL ~~~| Client 2 |~~~ DL ~~~| Client 3 | V+ ~~~+~~~~~~~~~~+~~~ V+ ~~~+~~~~~~~~~~+~~~ V+ ~~~+~~~~~~~~~~+ V- ~~~+~~~~~~~~~~+~~~ V- ~~~+~~~~~~~~~~+~~~ V- ~~~+~~~~~~~~~~+ |----------| |----------| |----------| Das Prinzip soll wie "Stille Post" funktionieren, jeder gibt die von der einen Seite erhaltene Daten an die Andere Seite weiter und dichtet ggf. Daten dazu, die für die Anderen interessant sind. Client 1 ist fest definiert und fängt an. Er gibt Daten an Client 2 weiter: |----------| |----------| | Client 1 |Tx ~~~~ Rx| Client 2 | |----------| |----------| Client 2 verarbeitet die Daten und reicht sie an Client 3 weiter bis zum Client n. Client n weiß, dass er der Letzte ist und reicht die verarbeiteten Daten wieder zurück -> Client 3 -> Client 2 -> Client 1. Nun haben alle die aktuellen Daten erhalten und der Vorgang beginnt von vorne. Die Clienten 1 und n spielen eine gewisse Sonderrolle. Sie erkennen, dass vor bzw. hinter ihnen kein weiterer Client vorhanden ist. ################################################## So, ich denke ich habe das Prinzip nun genug (versucht) zu erklären, nun meine eigentliche Frage. Die meisten AVR-Mikrocontroller besitzen ja einen USART, so auch der mega8. Könnte man diesen nicht zu einem 1-Draht-Bus umbauen? Bzw., da ja meist nur ein USART vorhanden ist, wie setzt man softwaretechnisch soetwas in C um? Gibt es da ggf. bereits Lösungen, die ich nicht gefunden habe? Alles, was ich bisher gefunden habe, war viel zu komplex, es muss wirklich nur der Datenstrom wie ein Lauflicht hin- und herwandern, es geht nicht um Geschwindigkeit und Effektivität... ;) Danke für eure Antworten und Ideen! Gruß Flo
Warum nicht eher sowas wie ein "unipolarer" RS485-Bus? Also so, dass alle Teilnehmer an der einen Strippe hängen und per Protokoll aushandeln, wer gerade senden darf? Das geht per Pullup und einer Diode relativ einfach:
1 | o |
2 | | |
3 | - |
4 | | | |
5 | |_| |
6 | | |
7 | ---o-----o-------------o-----o--------------o-----o----- |
8 | | | | | | | |
9 | | V | V | V |
10 | | - | - | - |
11 | | | | | | | |
12 | .---------. .---------. .---------. |
13 | | RX TX | | RX TX | | RX TX | |
14 | uC1 uC2 uC3 |
Hallo Lothar, Danke für Deine Antwort! Die Sache ist, dass ich die Einzelverbindungen benötige, um die physische Position der Module in der Kette bestimmen zu können. Ich lege durch äußere Einflüsse einen Clienten als Client 1 fest, dieser spricht das nächste Modul an und gibt ihm die Bezeichnung Client 2. Dieser spricht dann Client 3 an und so weiter, bis Client n keinen Nachfolger mehr hat. Dann gibt der Client n die Anzahl der Clienten zurück bis hin zu Client 1. Somit weiß schließlich jeder, wie viele Clienten es insgesamt gibt und der wievielte Client sie sind. Ich hoffe das war verständlich!? Gruß Florian
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.