Hallo,
ich möchte gerne einige AVRs über eine gewisse Entfernung miteinander
kommunizieren lassen und suche ein simples Bussystem um dies zu
realisieren. SPI wäre für diesen Zweck eigentlich schon ganz gut
geeignet, jedoch das Problem ist, dass es schon über grössere
Entfernungen (bis ca. 40m) gehen soll. Da bei SPI die Signale teilweise
auf den selben Leitungen in beide Richtungen gehen, scheiden
irgendwelche Transceiver (z.B. MAX232 usw.) aus. Ich habe auch schon an
CAN gedacht, aber das wäre wohl für meine Zwecke schon ein ziemlicher
Overkill. Es wäre nett, wenn ihr mir vielleicht ein paar Ideen geben
könntet, wie ich sowas am besten realisieren kann. Also es soll nicht zu
aufwendig sein und einen einfachen Datentransfer zwischen einem Master
und einigen Slaves in beide Richtungen über die oben genannte Entfernung
ermöglichen. Und das über möglichst wenig Leitungsadern.
Vielen Dank schon mal
Gruss, Peter
Einfachste Möglichkeit ist RS485. Schnell, billig und große Reichweiten.
Sinnvollerweise sollte man aber einen der neuen Megas einsetzten. Mit
den neuen USART's geht das besser weil die einen Multiprozessor Mode
kennen.
Hoffe geholfen zu haben
Hi Peter,
natürlich ist RS485 ein Bussystem. CAN ist von der Hardware fast
identisch. Nur das CAN einen unheimlichen Protokolloverhead hat. Bei
RS485 kannst Du Dein eigenes Protokoll implementieren. Außerdem brauchst
Du für CAN spezielle Treiber IC's, für RS485 kannst Du statt eines
MAX232 einfach einen MAX485 verwenden. Laut Spezifikation kann man an
einen Standart RS485 Bus bis zu 32 Geräte hängen, bei manchen
Treiberbausteinen auch mehr. Das ist aber nur abhängig von der Kapazität
und der Belastung des Busses durch dir Treiber.
Ich habe schon mal einen einfachen Bus mit 3 Controllern aufgebaut,
leider noch mit den alten AVR. Musste desshalb jedes Byte mithören, aber
es ging.
Also wenn Du nicht gerade 100 Devices an den Bus hängen willst ist das
denke ich die optimale Lösung.
Hallo Markus,
ich war bislang der Annahme, RS485 ist im Prinzip das selbe wie RS232,
nur mit bipolarer Übertragung auf 2 gegenphasigen Leitungen pro Richtung
wegen der Leitungslänge bzw. der Störungsunempfindlichkeit. Aber dass
das ein Bussystem sein soll, ist mir neu. Hast Du mal ein Beispiel in
Form eines Schaltplans hier irgendwo im Internet?
Danke!
Gruss, Peter
Hallo Markus,
vielen Dank!
Das hilft mir nun schon ein gutes Stück weiter. Und mal wieder etwas
dazugelernt! Also nun muss ich nur noch eine geeignete Software dazu
stricken. Wenn ich das richtig sehe, sind die Slaves sozusagen nur
lesend am Bus und dürfen nur dann etwas mitteilen, wenn der Chef es
erlaubt. Ich wühle mal etwas im Netz herum, vielleicht finden sich ja
sogar Code-Beispiele in C, wie man so etwas dann am geschicktesten
steuert.
Also, nochmals vielen Dank an Dich, ich werde Dich dafür auch in mein
Nachtgebet einschliessen ;-)
Gruss, Peter
Hallo Markus,
noch eine letzte Frage, benutzt Du zur Kommunikation den UART des MC
oder wird das alles Softwaremässig gemacht?
Danke für die Auskunft!
Gruss, Peter
Hi Peter, danke für das nachtgebet :)
Also zur Kommunikation solltest Du sogar den UART einsetzen.
Ich würde Dir sogar dringend raten einen der neuen ATmegas zu verwenden.
Nur die haben den sog. USART und nur der beherscht den Multi Prozessor
Mode. Es geht zwar auch ohne, aber dann mußt du wie gesagt jedes Byte
durch die Software analysieren lassen.
Kurze Erklärung: Im Multi Prozessor Mode werden die Daten nucht mit 8
sondern mit 9 Bit versendet. Ist das neunte Bit gesetzt handelt es sich
um eine Adresse, ansonsten um Daten. Der USART (der neue) ist jetzt so
intelligent das er erst mal nur einen IRQ auslöst wenn ein Byte mit
gesetztem neunten Bit reinkommt, den Rest ignoriert er. Kommt ein
Adressbyte kann die Software schauen ob der Controller gemeint war. Wenn
ja schaltet die Software den USART um und jedes empfangene Byte wird
empfangen.
So, hoffe die Infos reichen.