Hallo,
ich möchte einige Mikrocontroller(8-Bit AVRs & Rasperry PI) über Bus
verbinden. Allerdings müsste jeder Microkontroller eine einmalige
Adresse haben (ähnlich wie bei 1-Wire Bus, der leider zu langsam ist)SPI
und I²C währen schnell genug. I²C hat zu wenige Adressen. SPI
Adressierung leider über CS-PIN auch nicht möglich.
Der Bus muss auf im Mikrocontroller vorhandener Hardware aufbauen, es
soll keine zusätzliche Hardware verwendet werden.
Gibt es eine Möglichkeit eine vorhandene Schnittstelle (I²C, SPI, URAT
oder 1-Wire) so einzusetzen, das man vor jeder Nachricht die Adresse
über den Bus sendet, und der Empfänger mit der gesendeten Adresse die
Daten empfängt. Es müsste allerdings auf dem Geschwindigkeitsniveau von
SPI oder I²C liegen.
Danke
Marcel
Es sollen so 20 - 40 MCs auf dem Bus kommunizieren können. Es soll so
viele Adressen (48Bit)verwendet werden, das jeder MC eindeutig an seiner
Adresse zu identifizieren ist. Ich könnte mir auch vorstellen jeden MC
so eine Art MAC-Adresse zu geben.
Das wichtigste währe das man es PnP zusammenstecken kann. Der Anwender
soll keine Adressen ändern müssen. I²C würde von der Adressanzahl
reichen, es müsste nur gewährleistet sein dass bei Anschluss eines MCs
automatisch eine noch nicht benutzte Adresse zugeteilt wird.
Es sollen so 20 - 40 MCs auf dem Bus kommunizieren können. Es soll so
viele Adressen (48Bit)verwendet werden, das jeder MC eindeutig an seiner
Adresse zu identifizieren ist. Ich könnte mir auch vorstellen jeden MC
so eine Art MAC-Adresse zu geben.
Das wichtigste währe das man es PnP zusammenstecken kann. Der Anwender
soll keine Adressen ändern müssen. I²C würde von der Adressanzahl
reichen, es müsste nur gewährleistet sein dass bei Anschluss eines MCs
automatisch eine noch nicht benutzte Adresse zugeteilt wird.
@ Marcel (Gast)
>Es sollen so 20 - 40 MCs auf dem Bus kommunizieren können. Es soll so>viele Adressen (48Bit)verwendet werden, das jeder MC eindeutig an seiner>Adresse zu identifizieren ist.
Für 40 uCs reichen 6 Bit.
> Ich könnte mir auch vorstellen jeden MC so eine Art MAC-Adresse zu geben.>Das wichtigste währe das man es PnP zusammenstecken kann. Der Anwender>soll keine Adressen ändern müssen. I²C würde von der Adressanzahl>reichen, es müsste nur gewährleistet sein dass bei Anschluss eines MCs>automatisch eine noch nicht benutzte Adresse zugeteilt wird.
Kann man machen, 1 Wire macht es über eindeutige 64 Bit IDs, welche in
der speziellen Sequenz abgefragt werden. Damit kann automatisch der
gesammte Bus initialisiert werden.
40 Controller, und dann noch nahe beieinander.
Könnte man da nicht nur einen Rechner mit mehr Leistung nehmen?
40 * 16 MHz = 640 MHz. Ein zweiter Raspi reicht aus. Kommunikation über
Ethernet. Das ist alles schon fertig.
Marcel schrieb:> I²C hat zu wenige Adressen.
Für 40-50 Controller reicht es aber trotzdem. Der große Vorteil ist
halt, dass es hier echten Hardware-Support gibt. Alles andere kostet
dich Zeit, nämlich zum Entwickeln des Konzepts sowie zur eigentlichen
Programmierung. Im Rahmen eines anderen Projekt
(Beitrag "LED Tisch mit Berührungs-/Gegenstandserkennung") denke ich zur Zeit über
einen UART Ring nach. Auch hier sollen die Slaves addressiert werden
können, um z.B. einzelne Controller zu programmieren bzw. deren EEPROM
auszulesen. Allerdings hängt das alles sehr stark von den Anforderungen
ab, und darüber hast du uns nicht all zu viel verraten.
Mit freundlichen Grüßen,
Karol Babioch
Marcel schrieb:> Es sollen so 20 - 40 MCs auf dem Bus kommunizieren können. Es soll so> viele Adressen (48Bit)verwendet werden, das jeder MC eindeutig an seiner> Adresse zu identifizieren ist. Ich könnte mir auch vorstellen jeden MC> so eine Art MAC-Adresse zu geben.
Wenn Du Deine AVRs durch PIC18F67J60 ersetzt, kannst Du gleich Ethernet
und TCP/IP nehmen. Die üblichen Mechanismen wie Zeroconf, DHCP etc
existieren dort alle schon. Der genannte PIC hat Ethernet MAC+PHY gleich
mit auf dem Chip drauf, d.h. einfacher, kleiner und billiger bekommst Du
es sonst einfach nicht hin. Microchip liefert Dir die gesamte
erforderliche Software kostenlos.
Ansonsten:
(a) RS485 plus ein entsprechendes Protokoll obendrauf. Geht problemlos
mit AVR über UART.
(b) CAN: Da nimmst Du besser einen PIC18F25K80, der hat nämlich schon
den passenden CAN-Controller eingebaut. Bei einem AVR wäre das noch ein
extra Baustein mit extra Quarz, und das ist deutlich teurer als der PIC,
der alles schon eingebaut hat und nur noch den PHY (Transceiver
braucht). Du könntest auch einen LPC11U24 nehmen, aber der ist im
QFN-Gehäuse und damit schwerer zu verarbeiten.
Für längere Strecken brauchst Du ein richtiges Bussystem, das an beiden
Enden terminiert ist, damit es keine Reflektionen gibt. I2C ist nicht
für längere Strecken und höhere Teilnehmerzahlen gedacht und geeignet,
weil es nicht richtig terminiert werden kann (ist nicht vorgesehen) und
keine differentielle Übertragung nutzt. Problem: Wenn Du den Bus
auftrennst, um weitere Teilnehmer einzufügen, steht der Bus, weil zu dem
Zeitpunkt ein Ende nicht terminiert ist. Das ist bei einer Bustopologie
so. Stichleitungen sind nicht erlaubt, alle Teilnehmer hängen direkt am
Kabel. Auch das hat nachrichtentechnische Gründe.
Das heute gebräuchliche Twisted-Pair Ethernet verwendet einen
Sternverteiler (Switch) und vermeidet damit die obigen Nachteile, d.h.
hier kann man in laufenden Betrieb Teilnehmer hinzufügen oder entfernen,
ohne die anderen Teilnehmer zu stören.
fchk
Du könntest en modifiziertes I2C Protokoll nehmen. Gib allen
Mikrocontrollern die gleichen 7bit Adresse als Dummy. Damit bist Du
erstmal kompatibel zum I2C Protokoll.
Der Master sendet zuerst die Dummy Adresse mit R/W Bit auf "WRITE". Dann
sendet er die n Bytes lange Adresse des Slaves, der angesprochen werden
soll. Ein Bit davon bestimmt, ob Du lesen oder schreiben willst, es
ersetzt also das ursprüngliche R/W Bit des I2C Protokolls. Der
angesprochene Slave antwortet mit ACK, die anderen Slaves reagieren
nicht.
Andere Mikrochips können wie üblich per I2C angesprochen werden.
Stefan us schrieb:> Du könntest en modifiziertes I2C Protokoll nehmen.
An sich eine schöne Idee, die mir so noch gar nicht gekommen ist.
Andererseits verdoppelt man damit den Overhead. Hat es eigentlich einen
Grund warum das ursprüngliche R/W Bit WRITE sein soll? Solange man das
bei allen konsequent macht, sollte das doch egal sein, oder über sehe
ich etwas?
Mit freundlichen Grüßen,
Karol Babioch
Karol Babioch schrieb:> Hat es eigentlich einen Grund warum das ursprüngliche R/W Bit WRITE sein> soll?
Weil danach der zweite Teil der Adresse geschrieben wird.
Max H. schrieb:> Weil danach der zweite Teil der Adresse geschrieben wird.
Oops, wohl zu wenig Schlaf erwischt. Besonders habe ich hier ja nicht
mit gedacht :).
Danke!
Mit freundlichen Grüßen,
Karol Babioch
Karol Babioch schrieb:> Marcel schrieb:>> I²C hat zu wenige Adressen.>> Für 40-50 Controller reicht es aber trotzdem.
So wie ich die Frage verstehe, soll nicht nur jeder µC an dem einen Bus,
sondern jeder insgesamt eine eigene Adresse haben. Eben wie bei
MAC-Adressen:
Marcel schrieb:> Ich könnte mir auch vorstellen jeden MC so eine Art MAC-Adresse zu geben.
Marcel schrieb:> I²C hat zu wenige Adressen.
I²C gibt es auch mit 10-Bit Adressierung. Bei deinen max. 40 µC hättest
du gerade mal 4 Prozent des Adressraumes ausgeschöpft.
Stefan us schrieb:> Du könntest en modifiziertes I2C Protokoll nehmen. Gib allen> Mikrocontrollern die gleichen 7bit Adresse als Dummy.
Also die eigentliche Adressierung in Software?
Könnte man dann nicht besser gleich SPI ohne CS nehmen und sich damit
die ungenutzte I²C-Adressierung sparen?
Weitere ad hoc Variante, in der eine Adressierung analog der 48-Bit
Ethernet Adresse mit der Effektivität der I2C Adressierung von hier
ausreichenden bis zu 112 Slaves kombiniert wird:
Ein GENERAL CALL (Adresse 0) mit folgendem Steuerbyte 0xAA (beliebig
gewählt) versetzt alle Slaves in den adressfreien Modus, damit das
Verfahren ggf. komplett von vorne beginnen kann. Nötig beim Restart des
Masters.
Ein GENERAL CALL mit Steuerbyte 0x55 versetzt alle adressfreien Slaves
in einen Modus zur Adressvergabe. In diesem Modus wird mit der SDA
Leitung (und nur dieser) mit einem Arbitrationsschema orientiert an
1-Wire aber mit für AVRs geeigneterem exaktem Verfahren ein einzelner
Slave ausgewählt. Der kriegt dann vom Master eine eindeutige I2C-Adresse
verpasst und nimmt danach nicht mehr an diesem Verfahren Teil.
Aktivitäten auf SDA ohne Aktivität auf SCL interessiert I2C Hardware
nicht, stört also nicht. Fest adressierte I2C-Slaves bleiben einsetzbar,
solange sie sich nicht am GENERAL CALL stören (ist in AVRs abschaltbar).
Der Master kann das Vergabeverfahren, sowie ein Polling aller ihm
bereits bekannten Slaves, alle paar Sekunden durchführen, um neue und
verschwundene Slaves zu erkennen.
Genereller Nachteil aller I2C Verfahren: Es gibt keinen zuverlässigen
Mechanismus zur Absicherung gegen Fehler. Störungen auf den Leitungen
können Master wie Slave aus dem Konzept bringen, selbst wenn der Inhalt
der Frames CRC-gesichert sein sollte.
Frank K. schrieb:> ...> (b) CAN: Da nimmst Du besser einen PIC18F25K80, der hat nämlich schon> den passenden CAN-Controller eingebaut. Bei einem AVR wäre das noch ein> extra Baustein mit extra Quarz, und das ist deutlich teurer als der PIC,> der alles schon eingebaut hat und nur noch den PHY (Transceiver> braucht). Du könntest auch einen LPC11U24 nehmen, aber der ist im> QFN-Gehäuse und damit schwerer zu verarbeiten.> ...
Den AT90CAN32/64/128 kennst Du anscheinend nicht?
Frank K. schrieb:> Bei einem AVR wäre das noch ein extra Baustein mit extra Quarz,
Selbst wenn man MCP2515 statt AT90CANxx einsetzt kann man dennoch ohne
doppeltem Quarz arbeiten. Der vom AVR wird dann oft überflüssig.
Rolf Magnus schrieb:> Könnte man dann nicht besser gleich SPI ohne CS nehmen und sich damit> die ungenutzte I²C-Adressierung sparen?
Nein. SPI ist im Gegensatz zu I2C ein bidirektionales Protokoll, es
fließen also bei der Komunikation immer Daten gleichzeitig in beide
Richtungen. Das funktioniert natürlich nur mit
Punkt-zu-Punkt-Verbindungen. Ohne CS würden alle Slaves ihre Daten
gleichzeitig auf den Bus legen, und: KRAWUMM.
Wenn du SPI ungefähr in dieser Art verwenden willst, wie es dir
vorschwebt, brauchst du für alle Busteilnehmer eine unabhängig
deaktivierbare MISO-Leitung, was nicht gerade ein weit verbreitetes
Feature üblicher SPI-Hardware ist...
Du müßtest also bei jedem Busteilnehmer, der das nicht kann, mit
zusätzlicher Hardware nachhelfen (z.B. 1/4 74126) und bräuchtest dann
dort auch einen zusätzlichen Pin zur Kontrolle eben dieses Treibers.
Dazu kommt das Problem, daß der Master alle Slaves gleichzeitig treiben
können muß und zwar auf drei Leitungen, MOSI,SCK und CS. Da ist auch
schnell die Grenze des Möglichen erreicht. Also auch hier nochmal drei
Bustreiber.
Und wenn es gar eine Multimaster-Architektur werden soll, brauchen
zumindest alle Busteilnehmer, die auch Master sein sollen, den vollen
Satz von vier Bustreibern.
Von dem recht komplexen Softwareprotokoll, welches auf jeden Fall
zusätzlich nötig wäre mal ganz zu schweigen. Und normale SPI-Geräte
könnten an diesem Bus nur mitbetrieben werden, wenn sie nach wie vor
jeweils eine eigene CS-Leitung bekommen.
Martin schrieb:> Frank K. schrieb:>> ...>> (b) CAN: Da nimmst Du besser einen PIC18F25K80, der hat nämlich schon>> den passenden CAN-Controller eingebaut. Bei einem AVR wäre das noch ein>> extra Baustein mit extra Quarz, und das ist deutlich teurer als der PIC,>> der alles schon eingebaut hat und nur noch den PHY (Transceiver>> braucht). Du könntest auch einen LPC11U24 nehmen, aber der ist im>> QFN-Gehäuse und damit schwerer zu verarbeiten.>> ...>> Den AT90CAN32/64/128 kennst Du anscheinend nicht?
Doch, aber der ist für viele Anwendungen zu groß und zu teuer. Im
Bereich 20 bis 28 Pins hat Atmel nichts anzubieten. Macht aber auch
nichts, Microchip hat da eine reichhaltige Auswahl, nicht nur bei
8-Bittern, sondern auch bei 16- und 32- Bittern.
Es gibt noch ein paar Automotive-AVR-Varianten, aber die sind im freien
Handel kaum erhältlich.
fchk
A. K. schrieb:> Frank K. schrieb:>> Bei einem AVR wäre das noch ein extra Baustein mit extra Quarz,>> Selbst wenn man MCP2515 statt AT90CANxx einsetzt kann man dennoch ohne> doppeltem Quarz arbeiten. Der vom AVR wird dann oft überflüssig.
Auch dann ist der PIC (a) billiger, (b) kleiner und (c) bei der
CAN-Kommunikation schneller als die AVR+MCP2515-Kombination. Man kann
direkt auf die CAN-Register zugreifen (das sind SFRs wie alle anderen
Register auch, da ist kein SPI dazwischen), und der ECAN des
PIC18F25K80/26K80 ist eine deutlich verbesserte Version des MCP2515 mit
mehr Puffern und weniger Bugs.
fchk
Frank K. schrieb:> CAN: Da nimmst Du besser einen PIC18F25K80, der hat nämlich schon> den passenden CAN-Controller eingebaut.
Noch besser einen LPC11C22FBD48, der hat auch noch den CAN-Transceiver
eingebaut. Und ist kein PIC.
Frank K. schrieb:> Auch dann ist der PIC (a) billiger
Als ich vor einigen Jahren mal einen PIC18F258 ausprobierte war der
deutlich teurer als ein ATmega8 plus MCP2515. Jedenfalls bei Reichelt.
Nicht dass das wirklich eine Rolle spielen würde, aber es war
schliesslich dein Argument. ;-)
> (b) kleiner und (c) bei der CAN-Kommunikation schneller
Klar. Es ging mir nur um den Quarz. Dass Microchip da Atmel einiges
voraus hat ist klar - einige Bugs aber auch, die CAN Module von
Microchip waren zumindest früher mit recht bösen Bugs ausgestattet.
A. K. schrieb:> Als ich vor einigen Jahren mal einen PIC18F258 ausprobierte war der
Autsch. DAS ist ja wirklich eine alte Kamelle - in diesem Fall wundert
mich das nicht. Der wird zwar immer noch produziert für die Leute, die
alte Designs haben, aber das lässt sich Microchip auch sehr gut
bezahlen. Den Nachfolger 18F2580 gibt es so viele Jahre, dass er
inzwischen auch schon wieder überholt ist.
Ich habe mal nachgeschaut: Reichelt hat wirklich noch einiges an nicht
mehr zeitgemäßem Uraltzeugs im Angebot (alle PICs mit dreistelligen
Nummern nach dem F), aber nur wenige moderne Varianten (die mit J und K
in der Typenbezeichnung). Dafür sollte man eigentlich den zuständige
Produktmanager ins Achtung stellen. Woanders wurden solche Leute schon
aus weit geringerem Anlass gevierteilt.
fchk
Frank K. schrieb:>> Als ich vor einigen Jahren mal einen PIC18F258 ausprobierte war der>> Autsch. DAS ist ja wirklich eine alte Kamelle
Sicher - aber das war anno 2007.