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.
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, ...
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.
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
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
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.
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" ^^
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..