Forum: Mikrocontroller und Digitale Elektronik Bussystem avr-gcc mehrere AVRs in Reihe


von Paul Panzer (Gast)


Lesenswert?

Hallo ich suche eine Möglichkeit,

mehrere AVRs mit einander zu verbinden.
Hier bei ist die Verbindung im Ring oder mit offenen Ende erwünscht. 
Also ein Master sendet alle Daten und die Slaves picken sich ihre Werte 
heraus.

Wenn mäglich sollen alle Slaves gleich programmiert sein. Ohne Adresse. 
Wie gehe ich da am besten vor, hat jemand dazu vielleicht ein effizentes 
Code Schnippsel?

Übertragungsrate < 2kb/s. Zur Verfügung steht 1x SPI, oder 2x UARTs mit 
zusäztlichen CLK. (synchron UART?!?). Am besten würde ich etwas in 
Hardware machen um den Code möglich einfach zu halten.

Die Avrs müssen nicht viel machen. Hauptsächlich wird über 1-2 Eingängen 
die Temp gemessen (alle 10s) und dauerhaft FastPWM auf 4 Pins erzeugt 
mit einem 15kHz Signal.

von dunno.. (Gast)


Lesenswert?

Das nennt sich inhaltsadressierung. Passiert zB im auto per can.
Wie lang werden denn die Verbindungen..?

von (prx) A. K. (prx)


Lesenswert?

Gleich programmiert bedeutet wörtlich verstanden nicht, dass sie keine 
Adresse haben können. Man kann Adressen auch anderswo unterbringen als 
im Programm. Beispielsweise im EEPROM. Aber man kann Adressen auch 
extern anbringen, mit Schaltern, individuell eingestelltem 
Spannungsteiler (ADC), ID-Device, ...

von (prx) A. K. (prx)


Lesenswert?

dunno.. schrieb:
> Das nennt sich inhaltsadressierung. Passiert zB im auto per can.

Gibt es im Auto CAN Devices, die in Programm und Hardware 
ununterscheidbar sind und bei denen beim Start ausgewürfelt wird, wer 
heute die Rolle des linken und des rechten Blinkers übernimmt, 
bildhaft gesprochen?

Ich verstehe unter Inhaltsadressierung, dass jede Node ihre Rolle kennt. 
Ob diese Selbsterkenntnis nun als Adresse bezeichnet wird, oder anders, 
halte ich für sekundär.

von wendelsberg (Gast)


Lesenswert?

Paul Panzer schrieb:
> Wenn mäglich sollen alle Slaves gleich programmiert sein. Ohne Adresse.
> Wie gehe ich da am besten vor, hat jemand dazu vielleicht ein effizentes
> Code Schnippsel?

Das koennte man realisieren, indem die Daten immer ausgewertet und zum 
naechsten uP geschickt werden, vor dem Weiterschicken wird ein Byte 
inkrementiert. Vom letzten uP geht es dann wieder zum Master, der das 
Byte auf korrekte Anzahl der Slaves kontrolliert.

wendelsberg

von Martin L. (maveric00)


Lesenswert?

Hallo,

angenommen die Slaves sind nicht nur vom Programm, sondern auch von der 
Aufgabe ununterscheidbar. Sie haben also alle die gleiche Aufgabe, z.B. 
Lüftersteuerung nur auf Grund lokaler Temperaturen mit zentraler 
Überwachung der Lüfterdrehzahl und der Temperaturen, aber ohne sagen zu 
können, welche physikalische Temperatur bzw. Lüfter nicht mehr o.k. ist.

Dann kann man tatsächlich die Adresse jedesmal auswürfeln, z.B. indem 
per (echter) Zufallszahl nach Power-On eine bestimmte Zeit gewartet 
wird, bevor sich ein Slave am Bus anmeldet. Diesem wird dann vom Master 
eine Adresse zugewiesen, die bis zum nächsten Power-Off Gültigkeit hat. 
Dazu braucht man entweder ein Bus, der Kollisionen erkennt und behandelt 
oder aber eine ziemlich ausgefuchste Buserkennungsphase die recht lange 
dauern könnte.

Eine weitere Alternative besteht darin, dass die Slaves beim erstmaligen 
Anmelden (gekennzeichnet z.B. durch eine Anmeldeadresse) oder während 
einer Konfigurationsphase eine eindeutige Adresse zugeordnet bekommen 
und diese z.B. im EEprom abspeichern. Dies funktioniert natürlich nur 
dann, wenn der Bus Schritt-Für-Schritt in der im Master hinterlegten 
Reihenfolge in Betrieb genommen wird (funktioniert bei Hausbussen sehr 
gut, so wird es z.B. bei KNX gelöst).

Ist dies nicht möglich und müssen die Slaves trotzdem eindeutig 
zugeordnet werden, bleibt nur eine Art von Dasy-Chain (z.B. wie oben 
schon beschrieben, geht auch mit durchgereichten Select-Leitungen oder 
durchgereichten Datenleitungen wie bei den WS2812-LEDs) oder eine 
"mechanische" Kodierung durch 
Mikroschalter/Lötbrücken/Jumper/Widerstand, wie sie z.B. bei I2C gerne 
gemacht wird. Dies könnte natürlich auch außerhalb des Slave-Bords 
realisiert werden (z.B. bei einem Lüfter-Tachosignal den Pullup am 
Lüfter anbauen und je nach Bauort variieren. Benötigt dann aber 
zusätzlich noch eine A-D-Auswertung des Signals)

Irgendwie muss man in diesen Fällen ja dem Slave seinen Einbauort 
mitteilen.

Schöne Grüße,
Martin

von (prx) A. K. (prx)


Lesenswert?

Paul Panzer schrieb:
> Hauptsächlich wird über 1-2 Eingängen
> die Temp gemessen (alle 10s)

Nicht zufällig mit DS18x20? Da wär das ID-Device gleich mit dabei.

von Karl (Gast)


Lesenswert?

Wie wäre es mit I2C?

von christian s. (soulcatcher)


Lesenswert?

Paul Panzer schrieb:
> Wenn mäglich sollen alle Slaves gleich programmiert sein. Ohne Adresse.

i2c hab ich mir auch als Erstes gedacht - aber ohne die Länge der 
Leitung zu wissen ... ;)

aber: alle slaves mit selber Adresse ergibt bei i2c eine Art 
"Kaffeehaus-Atmosphäre" ^^

von dunno.. (Gast)


Lesenswert?

A. K. schrieb:
> dunno.. schrieb:
> Das nennt sich inhaltsadressierung. Passiert zB im auto per can.
>
> Gibt es im Auto CAN Devices, die in Programm und Hardware
> ununterscheidbar sind und bei denen beim Start ausgewürfelt wird, wer
> heute die Rolle des linken und des rechten Blinkers übernimmt, bildhaft
> gesprochen?
>
> Ich verstehe unter Inhaltsadressierung, dass jede Node ihre Rolle kennt.
> Ob diese Selbsterkenntnis nun als Adresse bezeichnet wird, oder anders,
> halte ich für sekundär.

Wenn Hardware und Software genau gleich sind, gibts keinen linken und 
rechten Blinker. Dann gibts nur Blinker, und alle Blinken, wenn der 
Befehl zum blinken kommt. Wenn dich der verbauort des blinkers 
interessiert, muss das schon codiert sein, in irgendeiner Form.

Der to muss mal genau sagen was für Daten von wo nach wo über welche 
Distanz übertragen werden sollen. Selbst temperaturdaten sind ohne info 
über den verbauort doof..

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.