Hallo,
ich versuche über Bsacom ein Programm zu schreiben mit dem ich 5 AVR
(Mega8) über eine RS485 Schnittstelle vernetzen kann.
Geplant ist, dass der Master eine Abfrage auf den Bus gibt und ein
angesprochender Slave antwortet.
Mein Problem dabei ist, wie können die Slave's in den Bus hinein hören
um denn die ankommenden Abfragen aus zu werten?
Gibt es da unter Bascom Basic einen speziellen Befehl?
Vielen Dank für eure Unterstützung
Klaus
Wenn du RS485 in der 2-Draht-Variante verwendest:
Die Richtung des RS485-Treibers wird über einen Portpin umgeschaltet.
Alle Slaves lauschen gleichzeitig. Wird ein Slave angesprochen, stellt
er die Daten bereit und schaltet die Richtung um, genauso wie der
Master.
Also kein "spezieller" Befehl, sondern blos Port toggeln.
Hallo Ralf,
so weit habe ich es auch schon geschafft.
Sowohl vom Master als auch Slave kann ich Daten auf den Bus geben.
Nur:
Wie sieht der Code aus mit dem der Slave (oder Master) den Bus
abliest?
Kann man über deb Porpin vielleicht einen Interrupt auslösen? Wenn ja
wie?
Ah, jetzt wird mir dein Problem klarer...
Verwendest du die serielle Schnittstelle der AVRs für irgendwelche
speziellen Sachen? Wenn nicht, dann kannst du die serielle an die
MAX485-Treiber anschliessen... brauchst aber evtl. noch zusätzliche
Bauteile.
Wenn du es über normale Portpins machst, dann solltest du es wohl am
besten wissen, ob der Portpin einen Interrupt unterstützt... :-)
Und WIE die Daten übertragen werden, das definiert der Entwickler, also
DU!!!
Du kannst das serielle Protokoll oder auch das I2C-Protokoll verwenden,
alles was du möchtest, aber du musst es dann in Software implementieren,
was bei Verwendung der seriellen Schnittstelle entfallen würde.
Ich habe noch keine RS485-Schnittstelle gesehen, die ein anderes
Protokoll als das normale serielle verwendet. Der Unterschied zwischen
RS232 und RS485 liegt soweit ich weiss nur in den unterschiedlichen
elektrischen Eigenschaften...
Ralf
Ralf
Ja, ich hab emir eine (zwei) kleine Schaltungen zusammen gesteckt und
über RS485 verbunden.
Über eine RS485/RS232 Schnittstelle kann ich den Datenverkehr auf dem
PC Terminal beobachten.
Sowohl der Master als auch der Slave senden Daten.
Was mir fehlt ist jetzt der Code, und zwar in Bascom basic den ich
einspielen müsste um dem Slave das lesen bei zu bringen.
Da ich Einsteiger bin fehlt mir hier einfach das Wissen. Für einen
Programmierer sicher gar kein Problem
Hi,
da auch ich ein RS485 Netzwerk mit AVR plane, folgende Frage:
Mit welchem Adapter und welcher Software beobachtest Du den Datenverkehr
?
Einem einfachen Terminalprogramm (Hyperterm)?
Greets
Karlheinz
die slaves haben alle eine andere adresse
die slaves sind standard auf lauschen eingestellt
also senden nie bis sie aufgefordert werden
( so der sinn eines slaves )
in deinem datanpaket must du nun sagen welcher slave dir was liefern
soll
also sendest du in deinem protokoll
z.B. [ die adresse des slaves ; daten ; chksumme ]
dieses empfangen erstmal alle slaves
nur der slave der antworten soll . also die entsprechnde adresse
besitzt...
der master lauscht also auch .. wenn nix zu tun ist
wenn er sendet , schaltet der den TX_EN am MAX485
sendet das paket , und schaltet wieder auf empfang
der slave der sich angesprochen fühlt , schaltet auf senden und
übermittelt die daten
sobald die weg sind wieder auf empfang
da diese Frage immer wieder auftaucht hier ein kleines Codebespiel :
1
$regfile = "m16def.DAT"
2
$crystal = 8000000
3
$baud = 9600
4
$loadersize = 512
5
$hwstack = 64
6
$swstack = 48
7
$framesize = 60
8
9
'--------[Serial Output]----------
10
Sub Send_data(byval Byte1_w As Byte , Byval Byte2_w As Byte , Byval Byte3_w As Byte , Byval Byte4_w As Byte , Byval Byte5_w As Byte , Byval Byte6_w As Byte , Byval Byte7_w As Byte)
so in etwa funktioniert das Senden / Empfangen mit 9Bit.
Bitte nicht irritieren lassen. Die Auszüge sind aus einem laufendem
Projekt für einen MultiMaster Bus mit Token-Passing. Daher kann ich
leider nicht alles Posten. Aber mit etwas Googeln und nachdenken lässt
sich bestimmt das wichtigste extrahieren. Der Rest steht im Datasheet.
Wichtig ist das das ganze nur mit einem Hardware USART des At-Mega läuft
da die Register und Interrupts zwingen gebraucht werden.
Bei der Übertragung der Daten mit 9-Bit wird der Überwachungsaufwand der
Slaves deutlich verringert da nur die der richtigen Adresse folgenden
Daten beachtet werden. Alle anderen Daten werden direkt verworfen.
Nachteilig ist, das man den Bus nicht ganz so einfach mithören kann. Ich
löse das über einen RS485->Rs232 Wandler um mit einem Terminal Programm
die Daten mit zu lesen.
Bei der Master Slave Variante wird (kleiner Tip) ein Empfangstimeout
irgandwann wichtig. Da unter umständen der Master sonst endlos auf die
Antwort von einem inzwischen "verstorbenen" Slave wartet. Ein
gleichzeitiges Senden beider (Master und SLave) muss natürlich wirksam
unterbunden werden um Kollisionen zu vermeiden. Dies ist aber bei Master
Slave Betrieb recht leicht durch ein simples Protokoll (ACK ö.Ä) zu
lösen.
Gruß
Verri
Das ist genau das was im Programauszug passiert. Gut ohne das direkte
schreiben in UDR . Aber Print macht auch nix anderes, ganz im Gegenteil.
Print wartet noch so lange bis alle Daten raus sind.
Als denn
Verri
Ihr könnt auch in meinem OpenHC-Projekt abgucken. Das ist RS485
Multimaster, mit CRC und einem Toggle-Bit in den Paketen. Läuft auf AVR
Mega8, funktioniert zuverlässig.
Ich hab mir ein Kabel von FTDI gekauft, das hat einen
USB-zu-seriell-Konverter .Daran habe ich einen LTC485 angeschlossen. Die
5V kannst Du direkt aus dem Kabel verwenden. So brauchst Du nur GND,
VCC, TX und RX vom LTC 485 zum Adapterkabel verbinden. Das Kabel kostest
zwar etwas mehr (so etwa 20€) aber das hat schon eine Stiftleiste, mit
der es sehr flexibel einsetzbar bleibt. Der LTC485 kostet etwa 5 Euro.