Post by Michael SchöberlPost by Jürgen Leeb- Brauche ich überhaupt ein Collision Detection? Reicht es nicht aus,
daß der Master ein Telegramm schickt und auf ein Ack. vom Empfänger
wartet. Erhält er es, so ist alles O.K.. Wenn nicht war etwas falsch.
ja - es gibt noch ein weiteres Verfahren das noch "primitiver" ist ...
ALOHA: einfach senden, falls kein Ack durchkommt, dann irgendwann
(random delay) nochmal senden - alles ohne Check ob Bus frei ist
... max. Auslastung des Busses bei 18% rechnerisch
wenn du also im Mittel pi mal Daumen nur 1% der max. Übertragungsrate
brauchst, dann reichts)
Der Empänger muss eine Checksumme empfangen und prüfen - falls diese
falsch ist Nachricht verwerfen - sonst Ack zurücksenden
Das entspricht meinem Vorschlag, zumal damit für die Aufgabenstellung
mit einer einzigen CRC-Prüfung alle anderen Probleme erschlagen sind.
Also volle Kollision, Überlappung und Verkabelungsfehler.
Trotzdem könnte man das verfeinern. Das Protokoll nach
Ziel-Adr, Quell-Adr, ByteCount, Daten, CRC
aufbauen.
Per einfacher Statemachine in jedem Teilnehmer kann damit ein 'Bus Frei'
einfach detektiert werden:
Ziel-Adr <> eigener Adr? Dann Bytecount rausfischen und mitzählen bis
Telegramm vollständig durch. Dann auf das ACK des Zieles warten und
schon ist der Bus frei. Letzteres mit einem TImeout, falls das Telegramm
ungültig oder zerstört war.
Post by Michael SchöberlSlotted Aloha: Die Sendestarts werden Synchronisiert - die Nachrichten
überlappen also entweder voll oder garnicht. Dadurch werden rechnerisch
36% möglich..
(die Sync herzustellen ist hier aber wohl mehr Aufwand als der Nutzen)
Das würde aber bedeuten, dass da jemand den Takt vorgeben muss, oder
alle Teilnehmer sich zozusagen in eine Liste eintragen, anhand der sie
ersehen kömnnen, wann sie an der Reihe sind. Wenn man dann auch noch mit
harten Slots arbeitet, dann müssen lange Telegramme auch noch aufgeteilt
werden, was die Software in jedem Teilnehmer ordentlich aufbläst. Denn
der muss ja zum einen speichern, was er noch zu sagen hatte und zum
Anderen auch schon wieder empfangsbereit sein.
Post by Michael Schöberlweitere Verbesserungen wurden bereits angesprochen
- vor dem Senden horchen ob der Bus frei ist (CSMA)
auch hier ist noch eine Ack-Nachricht zur Rückmeldung nötig und
erneutes verzögertes Senden falls kein Ack kam
man könnte also erst mal Aloha implementieren und dann ein "Sensing
vor dem Senden" nachrüsten ...
Das würde aber bedeuten, dass man mind. die länge eines Bytes + Start
oder Stop abwarten muss um sicher zu gehen, dass da nicht gerade viele
'0'en gesendet werden.
Post by Michael Schöberl- während dem Senden auf Kollision achten (CSMA/CD) und
ggf Abbrechen+Jam
das stelle ich mir komplizierter vor - gleichzeitig senden und wieder
empfangen? kann man dann überhaupt noch die serielle Schnittstelle im
Atmel verwenden?
Natürlich kann der AVR zeitgleich senden und empfangen. Aber die
normalen RS485 Chips sind unidirektional. Aber wenn man sucht, wird es
da auch einen Chip mit abschaltbarem Sender und immer laufendem
Empfänger geben. Dann kann man das gesendete Byte mit dem Empfangenen
vergleichen und damit eine Kollision direkt erkennen anstatt ersteinmal
alles zu senden und dann auf ein ACK zu warten.
Diese Methode zusammen mit der vorher angesprochenen StateMachine ist
sicherlich die effizienteste Methode. Wenn man dann noch eine Ppriorität
einführt wird das ganze optimal. Gemeint ist, dass man durch das
Mitlauschen der eigenen Sendung erkennen kann, ob man gestört wurde,
oder selber der Störer ist. Wurde man gestört ( vorhergehende Bytes
wurden korrekt übertragen) nimmt man sich eine kurze Wartezeit um einen
weiteren Versuch zu starten. Ist man der Störer ( erstes Byte schon
defekt), dann nimmt man eine mittellange Wartezeit und ist man Lauscher,
der was neues zu sagen hat, dann ist man mit langer Wartezeit am Start,
damit vorher Störer und Gestörter ihre Kommunikation abschließen können.
Das verhindert zudem, dass ein sehr gesprächiges Device alle langsamen
mundtot machen könnte.
Gruß,
Ulrich