Forum: Mikrocontroller und Digitale Elektronik Bussystem für viele AVR


von Movergan (Gast)


Lesenswert?

Hallo Community,

ich habe mich schon viel im Netz belesen und auch hier und komme aber zu 
keiner Lösung für mein Problem.

Ich möchte einen Bus für eine beliebige Menge an µCs (vorerst AVRs) 
aufbauen. Allerdings finde ich bisher keine Lösung zu meinen Vorgaben. 
USART klingt interessant und ist in den Datenblättern gut beschrieben, 
aber es kommt wohl nicht in Frage.

Ich brauche:
- bis zu 100 µC und mehr
- alle µC gleichberechtigt, nicht unbedingt Master-Slave-System, wäre 
aber auch möglich
- ob synchron oder asynchron ist egal (ja, für synchron braucht man 
einen Master)
- jetzt kommts: adresslos, d.h. gesendete Daten gehen an jeden 
Busteilnehmer und jeder entscheidet per Software für sich selbst, die 
Daten zu verwerten oder zu verwerfen
- bis zu 1 oder 2kByte/s an Nutzdaten sollen insgesamt möglich sein
- serielle Übertragung, es sollten nicht zu viele Leitungen sein
- Fehlererkennung und Korrektur (z.B. per Parity-Bit) wäre wünschenswert

Hat jemand sowas schonmal gemacht oder kann mir Tipps oder Links geben?

Vielen Dank,
Movergan

von Philipp Co (Gast)


Lesenswert?

Mit CAN sollten sich alle Deine Wünscher erfüllen lassen

von Rene Zimmermann (Gast)


Lesenswert?

Hi,

Can Bus ?

Gruß Rene

von sechsdreizwei (Gast)


Lesenswert?

CAN kann nur kurze Packete von 6 bytes. Das sind moeglicherweise nicht 
alle Wuensche. RS485 ist da etwas weniger limitiert.

von Peter D. (peda)


Lesenswert?

sechsdreizwei wrote:
> CAN kann nur kurze Packete von 6 bytes. Das sind moeglicherweise nicht
> alle Wuensche. RS485 ist da etwas weniger limitiert.

Im Vergleich dazu, um mit RS485 nen funktionierenden Multimaster 
aufzubauen, ist der Aufwand beim CAN, längere Daten in 8Byte-Pakete zu 
unterteilen geradezu lächerlich gering.

Aber man hat den entscheidenden Vorteil, daß längere Daten nicht den Bus 
blockieren. Man kann z.B. in einen Teilnehmer ein Softwareupdate laden, 
während sich alle anderen einfach weiter unterhalten.


Peter

von Kai G. (runtimeterror)


Lesenswert?

Welche sonstigen Anforderungen gilt es denn einzuhalten? 
Echtzeitfähigkeit, Latenz, ...

Spontaner Einfall: Man kann AVRs mit zwei USARTs auch als Token-Ring 
aneinanderkabeln - stelle ich mir vom Aufwand her nicht allzu schwierig 
vor. Kannst sogar mehrere Tokens absetzen, wenn der Puffer reicht. Zum 
Ergänzen weiterer Einheiten muss das System ggf. abgeschaltet werden. 
Ein doppelter Ring wäre wahrscheinlich zu aufwändig.

Bis zu 256 AVRs lassen sich im "Multi-processor Communication Mode" auf 
einen USART-Bus aufschalten. Seite 161
http://www.atmel.com/dyn/resources/prod_documents/doc2466.pdf
Je nach Verfahren muss hier eine Kollisionserkennung implementiert oder 
auf ein verlorenes Token reagiert werden.

So lange du wir was für die Kollisionserkennung ausdenkst fällt mir 
gerade nicht ein, was dagegen spricht alles auf ein USART zu packen (mal 
davon abgesehen, dass der dafür nicht vorgesehen ist ;) ). Vielleicht 
einen zentralen µC, der die Sendefreigaben erteilt...

Was die fertigen Lösungen CAN-Bus, etc. angeht, kennen sich Andere hier 
besser aus als ich.

Gruß

Kai

von Rudolph (Gast)


Lesenswert?

>CAN kann nur kurze Packete von 6 bytes.

Es sind zwar 8 Byte Nutzdaten, macht aber keinen grossen Unterschied.
Dafür ist CAN relativ schnell mit bis zu 1 MBaud.

AVR's mit CAN gibt es aber nicht allzuviele und die Implementierung 
finde ich alles andere als gelungen, erste Gegeneration halt.

von Andreas K. (a-k)


Lesenswert?

Kai Giebeler wrote:

> Spontaner Einfall: Man kann AVRs mit zwei USARTs auch als Token-Ring
> aneinanderkabeln

Ein klassischer Ansatz bei RS485 ist daran angelehnt: Token Passing. 
physikalisch irgendwas, logisch Ring.

Wobei der physikalische Ring technische Lösungen für den Ausfall einer 
Node benötigt (vgl. optischem Bypass bei FDDI), weshalb die meisten 
logischen Ringstrukturen physikalisch anderes realisiert werden (Token 
Ring wurde als Stern verkabelt).

Alle Token-Lösungen haben einen Haken: Das Token kann verloren gehen und 
dann wird's spannend wie man zuverlässig wieder aufsetzt.

von Winfried (Gast)


Lesenswert?

Wenn nichts gegen Can spricht, würde ich das damit machen. Da gibt es 
satt Unterstützung in jeder Hinsicht: Jede Menge Chips, Dokumentation, 
Projekte etc. Ein eigenes Protokoll zu entwerfen, was wirklich 
funktioniert, kann schnell mal 1-2 Jahre Vollzeit verschlingen.

RS485 ansich ist ja auch noch kein Protokoll, sondern eher der 
Physical-Layer.

von Philipp Co (Gast)


Lesenswert?

Ich würde Dir auch weiterhin zu CAN raten und dann vielleicht einen CAN 
Controller extra nehmen. zB den MCP2515 der ist zusammen mit einem Mega8 
immernoch günstiger als ein AVR mit CAN und das funzt wenigstens gut. 
Außerdem hat CAN (genau wie RS485) noch alle Vorteile die eine 
differentielle Übertragung so mit sich bringt. Du wirst die 100 AVR ja 
nicht gerade alle auf einem Board haben.

von Movergan (Gast)


Lesenswert?

>Welche sonstigen Anforderungen gilt es denn einzuhalten?
Sonst habe ich keine Anforderungen. Latenz, Echtzeit, Leitungslängen, 
alles nicht so wichtig, da keine speziellen Wünsche.

>CAN kann nur kurze Packete von 6 bytes.
Ob 6 oder 8, wie andere sagen, ist egal. Ich habe nur kleine Datenpakete 
von evtl. 16 Byte. Kann man möglicherweise splitten, hab ich mir noch 
nicht überlegt.
Aber die CAN-Unterstütung ist bei AVR zumindest nicht gegeben, bzw. 
nicht gut wie ihr sagt.
Hab gerade mal kurz was zum CAN-Bus gelesen (später lese ich mehr) und 
auf den ersten Blick gefällt mir, dass er adresslos ist. Die Nachrichten 
enthalten einen Identifier, also eine Typenbezeichnung, und jeder 
Teilnehmer prüft, ob er damit was anfangen muss.

>Man kann AVRs mit zwei USARTs auch als Token-Ring aneinanderkabeln
Ja, aber wenn ich es physikalisch als Bus aufbauen will, dann brauche 
ich ja wieder Adressen und die will ich nicht.
Verlorene Tokens sind auch kein Problem. Bei mir würde ein Timeout 
reichen und wenn das alte Token doch noch verspätet auftaucht, wird es 
geschluckt. Daraus resultiert eine kleine Verzögerung auf dem Bus, aber 
ich habe nichts zeitkritischen.

Im Grunde will ich eine Steuerung aufbauen, bei der mehrere AVRs (nicht 
auf dem gleichen Board aber in kurzen Entfernungen) selbstständig 
arbeiten und Messwerte oder Verarbeitungsaufträge weitergeben, die 
mehrere andere AVRs betreffen können. Daher soll es adresslos sein, weil 
kein AVR weiß, wer noch so zuhört und man soll leicht im Betrieb weitere 
AVRs anschließen oder bestehende abklemmen können. Einen Master kann es 
meinetwegen geben, bei dem sich ein frisch angeschlossener AVR bei der 
Initialisierung anmeldet (mit seinem Typ und nicht mit einer Adresse).
Das Bussystem soll ausbaubar sein, deswegen will ich erstmal bis 100 
AVRs möglich machen. Die Datenraten sind sehr gering, es werden nur 
kleine Codes versendet. Es ist nichtmal wichtig, dass Datenpakete 
bestätigt werden. Wenn ein Busteilnehmer ausfällt, ist er weg und keiner 
merkt es. Das ist ok.
Außerdem soll der Bus leicht nachbaubar sein, d.h. 
Multicontroller-Lösungen würde ich nicht gerade bevorzugen, z.B. AVR + 
jeweils CAN-Controller.

Welche anderen µCs können denn besser mit CAN umgehen?
Was ist von I2C zu halten?
Oder doch noch andere Ideen? Gibts eine Webseite, auf der jemand einen 
geeigneten Bus vorstellt?

Danke euch schonmal!

von Movergan (Gast)


Lesenswert?

Korrektur: Meine Datenpakete umfassen 16 Bit, nicht 16 Byte. Mehr wäre 
aber auch nicht schlecht, z.B. 4 Byte.

von Andreas K. (a-k)


Lesenswert?

Movergan wrote:

> Welche anderen µCs können denn besser mit CAN umgehen?

Unterhalb der 40/64-Pin-Klasse ist beispielsweise Microchip etwas 
rühriger. Gibt 28pinner mit CAN, z.B. PIC18F258[0] und dsPIC30F4012. 
Nachteilig sind freilich die Bugs, der MCP2515 ist ziemlich sauber, die 
integrierten Versionen oft nicht.

Interessanterweise ist ein Mega8/168 mit MCP2515 erheblich billiger als 
beispielsweise der PIC18F258 mit integriertem CAN. Zumindest bei R&Co, 
in 100er Stückzahlen mag das anders sein.

8051er mit CAN dürfte es recht viele geben. Auch von Atmel 
(AT89C51CC...).

von Hauke R. (lafkaschar) Benutzerseite


Lesenswert?

Mei den AVRs kann man die Adressierung umgehen, man kann eine Feste 
Adresse verwenden und jeder µC antwortet auf diese Adresse. Jetzt kannst 
du per software auswerten, ob der jeweilige µC etwas damit anfangen 
kann.

Der Vorteil wäre jetzt noch, du könntest den Bus doch noch segmentieren, 
d.h. wenn du datenpakete hast die nur eine spezielle gruppe etwas 
angehen kannst du diese Paket an diese spezielle Adresse schicken. (Eine 
Art Broadcast, Multicast lässt sich also so realisieren)

von Movergan (Gast)


Lesenswert?

>Der Vorteil wäre jetzt noch, du könntest den Bus doch noch segmentieren,
>d.h. wenn du datenpakete hast die nur eine spezielle gruppe etwas
>angehen kannst du diese Paket an diese spezielle Adresse schicken. (Eine
>Art Broadcast, Multicast lässt sich also so realisieren)
Die Idee mit dem Identifier wäre ja das gleiche, beides kann erst nach 
Empfang per Software ausgewertet werden.

Wie machen Busse (ohne Master und adresslos) das eigentlich generell, 
dass nicht zwei Teilnehmer gleichzeitig quatschen? Ich könnte eine 
Besetztleitung definieren, die von einem sendewilligen Teilnehmer auf 
einen definierten "Besetzt"-Pegel gesetzt werden muss, bevor er senden 
darf. Andere Teilnehmer müssen warten, bis die Leitung wieder auf den 
"Frei"-Pegel gewechselt hat, bevor sie selbst wieder auf "Besetzt" 
umschalten und dann senden. Aber damit habe ich nicht den 
unwahrscheinlichen Fall abgedeckt, dass zwei Teilnehmer genau 
gleichzeitig die Leitung auf "Besetzt" schalten. Ansonsten gibts da noch 
die Möglichkeit mit dem Selbsthilfegruppengesprächsball, auch Token 
genannt. Wer den Ball hat, darf erzählen. Das erfordert aber Adressen 
oder eine physikalisch definierte Reihenfolge. Was anderes fällt mir 
dazu nicht ein. (für den Fall, dass ich mir doch selber einen Bus 
bastel)

von mehrfacher STK500-Besitzer (Gast)


Lesenswert?

Im Falle von CAN gibt es ein dominantes Bit.
Der Sender empfängt gleichzeitig seine gesendeten Daten. Wenn der 
Empfang nicht mit dem Gesendeten übereinstimmt, stellte der Sender mit 
dem nicht dominanten Bit seine Sendung erst mal ein.

von Hauke R. (lafkaschar) Benutzerseite


Lesenswert?

Könnte man so realisieren: nach dem belegen der Besetzt leitung wartet 
jeder der schreiben will eine (Zufällige!!!) Zeit ab und liest während 
dessen den bus, wenn nichts ankommt, kann er schreiben. Natürlich muss 
die Zeit entsprechend klein sein, um den Bus nicht extrem auszubremsen.

von Stefan (Gast)


Lesenswert?

>Selbsthilfegruppengesprächsball

Oder auch Medienzugriffssteuerung genannt. Ich arbeite selbst derzeit an 
so etwas, so dass n RFM12 Funkmodule sich zivilisiert unterhalten. 
Google nach CSMA/CA (Carrier Sense Media Accesscontrol / Collision 
Avoidance) bringt viel Infos zutage. So etwas könnte man auch auf RS485 
als physikalische Übertragungsschicht implementieren (was ich wohl 
demnächst auch mal in Angriff nehmen muss).

Grüße
Stefan

von Uwe B. (Firma: TU Darmstadt) (uwebonnes)


Lesenswert?

Ethernut unterstuetzt den AT90CAN128 recht gut.

von Movergan (Gast)


Lesenswert?

>jeder der schreiben will eine (Zufällige!!!) Zeit ab und liest während
>dessen den bus, wenn nichts ankommt, kann er schreiben.
Das war ja auch mein Gedanke, aber da die Busteilnehmer nicht 
synchronisiert senden, kann prinzipiell jederzeit ein Teilnehmer eine 
Kommunikation starten.
Wenn also ein sendewilliger Teilnehmer den Bus prüft, ob der gerade frei 
ist, kann in der Zwischenzeit ein anderer Teilnehmer anfangen zu senden, 
bevor der oben genannte Teilnehmer nun beginnt. Das Zeitintervall 
zwischen "Bus prüfen" und "mit Senden beginnen" ist sehr klein, aber ich 
frage mich, wie statistisch wahrscheinlich es ist, dass genau zwischen 
den beiden Vorgängen jemand anderes zu senden beginnt und dann senden 
zwei Teilnehmer gleichzeitig. Nicht, dass dann nur Datenmüll ankommt, es 
ist ja auch elektronisch ein Problem, wenn ein AVR den Pegel der Leitung 
anhebt und der andere ihn gleichzeitig senkt.

Aber ihr habt mich auf eine Idee gebracht. Ich werde mir nochmal USART 
ansehen und jedem Teilnehmer einfach die gleiche Adresse geben. Das 
könnte vielleicht gehen. Über eine Art Subnet kann ich mir ja auch noch 
Gedanken machen, bzw. eine logische Aufteilung wie beim VLAN.

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.