Forum: Mikrocontroller und Digitale Elektronik PIC18F2550 als Slave an einer RS485 Schnittstelle (Modbus Protokoll)


von Bernd712 (Gast)


Lesenswert?

Hallo zusammen,

bin mich gerade in das Thema Modbus(RTU) am reinarbeiten.

Habe noch nicht viel Erfahrung mit Kommunikation zwischen 
Unterschiedlichen Modulen.

Ich würde die interne EUART des PIC's benutzen.
Habe nur keine Vorstellung wie die Erkennung der Adresse Funktionieren 
soll.
Master sendet Adresse zuerst -> im PIC wird bei Start Bit eine Interrupt 
ausgelöst der dann die Adresse liest und mit einer Vergleicht?? Nur dann 
würde er ja bei jedem Sendevorgang einen Interrupt auslösen auch wenn er 
nicht angesprochen werden soll.

Eine grobe Beschreibung des Sendevorgangs und was mein PIC-Programm 
machen muss
würde mir schon weiter helfen.

Wenn ich eine grobe Vorstellung habe kann ich mit dem Experimentieren 
anfangen.

Mit freundlichen Grüßen
Bernd

von knoelke (Gast)


Lesenswert?

Bernd712 schrieb:
> Nur dann
> würde er ja bei jedem Sendevorgang einen Interrupt auslösen auch wenn er
> nicht angesprochen werden soll.

Ja, genauso ist das.
Wenn Du das alles in Hardware haben willst mußt Du CAN verwenden.

Ich verstehe Deine Frage nicht so ganz.
Wenn Du das Modbus RTU Protokoll kennst und das was Dein Sender daraus 
macht, dann weiß Du doch auch wie Dein PIC darauf reagieren muß.
Da kommen in verschiedenen zeitlichen Zusammenhängen verschiedene Bytes 
über den Uart.
Es ist Deine Aufgabe das auf Richtigkeit zu überprüfen, zu verarbeiten 
und eine Antwort darauf zu erzeugen.
Steht alles ziemlich detailiert in der Modbus Spezifikation.

von Bernd712 (Gast)


Lesenswert?

Ich weiß nicht wie man das ankommende Signal mit dem PIC so auswertet 
das er nur dann liest und spricht wenn er auch angesprochen/adressiert 
wird.

Das heißt sobald der Master irgendwas egal ob Adresse oder Daten sendet 
wird ein Interrupt ausgelöst egal ob mein PIC angesprochen wird oder 
nicht wird ein Interrupt im PIC gemacht??
Oder gibt es eine Adresserkennung?
Weil wenn viel auf dem Bus los ist würde der PIC ja ständig in die 
Interruptroutine gehen oder nicht?

von Dieter W. (dds5)


Lesenswert?

Bernd712 schrieb:
> Weil wenn viel auf dem Bus los ist würde der PIC ja ständig in die
> Interruptroutine gehen oder nicht?

Sicher wird er das. Es ist dann natürlich Sache des Programms, die 
empfangenen Bytes zu analysieren und richtig zuzuordnen.

von Stephan (Gast)


Lesenswert?

Hi Bernd712
wenn du nicht gerade im MBits die Daten über die UART nach draußen 
sendest, sollte der RX-INT kein Problem sein.
Im Telegramm steht ja dann an WEN es gehen soll, bzw WAS das für ein 
Telegramm ist. Dein ModBus Handler kann dann entscheiden was gemacht 
werden soll. meistens schmeißt er es weg, da es entweder ein 
Antwort-Tel. oder eine falsche Adresse besitzt.

Also sollte das kein Hindernis sein. :-)

Wenn du es etwas schwerer möchtest und nicht unbedingt std. Konform zur 
Spec., dann kannst du das Adressbyte als 9Bit 'Byte' senden.
und alle Empfänger warten auf eine 9Bit Übertragung.
Das Gerät das die eigene Adresse erkennt, schaltet wie der Sender auch, 
auf 8Bit Betrieb um und der Master sendet den Rest.(Slave empfängt)
Nach dem Empfangen des Telegramms, schaltet der Slave wieder auf 9Bit 
Betrieb um und warte auf das nächste Adresse(Telegramm).

So kann man es auch machen, ist aber etwas schwieriger! :-|

(Datasheet: REGISTER 20-1: TXSTA: TRANSMIT STATUS AND CONTROL REGISTER
und folgende)

von Michael K. (Gast)


Lesenswert?

Bernd712 schrieb:
> Das heißt sobald der Master irgendwas egal ob Adresse oder Daten sendet
> wird ein Interrupt ausgelöst egal ob mein PIC angesprochen wird oder
> nicht wird ein Interrupt im PIC gemacht??

Rechne Dir mal aus wie oft pro Sek. neue Bytes kommmen.
Jedes mal wenn das passiert schiebt dein PIC ein paar bytes auf den 
Stack, springt in den IRQ, liest das Uart Register, vergleicht mit 
eigener Adresse, verwirft, liest Daten aus Stack zurück und springt 
wieder an die Stelle an der er voher war.

Das kostet alles nur ein paar Zyklen und fällt überhaupt nicht ins 
Gewicht.

Ich verstehe immer noch Dein Problme nicht.
Da gibt es nicht den magischen großen Helfer im PIC der Dir das alles 
abnimmt.
Der Uart ist ein relativ einfaches Stück Hardware und es liegt an Dir 
die modbus Spezifikation zu lesen, zu verstehen und deren Anforderungen 
penibel umzusetzen.

Modbus RTU verlangt ein bestimmtes Timing und es ist an Dir 
herauszufinden welche Daten gerade über den Bus kommen, ob Übertragungen 
fehlerhaft sind, unterbrochen wurden oder an Dich gerichte sind.
Ja, dazu mußt Du die ganze Zeit permanent auf dem Bus lauschen.

Das ist doch gerade die Philosophie dabei.
Nur rudimentäre Grundfunktionen werden in Hardware gelöst, alles andere 
macht die Software. Damit bleibt man schön flexibel und kann sich das so 
zurechtprogrammieren wie es einem in den Kram passt.

von Peter D. (peda)


Lesenswert?

Bernd712 schrieb:
> Weil wenn viel auf dem Bus los ist würde der PIC ja ständig in die
> Interruptroutine gehen oder nicht?

Genau dazu sind Interrupts doch da.

von tempo (Gast)


Lesenswert?

@ Bernd712:  Ich schätze, du hast kein Gefühl, was ein µC in welcher 
Zeit leisten kann.

Schreib dir mal ne kleine HP-Schleife, die nur einen Pin toggled, sieh 
dir das Ergebnis auf einem Oszi an. Da wirst du Zeiten im µsec Bereich 
sehen, oder drunter.

So ne langsame UART-Nummer langweilt den PIC.

von Bernd712 (Gast)


Lesenswert?

Danke für die schnelle Rückmeldung.

Wenn man sich genauer Gedanken drüber macht, stimmt es das der PIC 
schnell mit dem Auslesen der UART durch ist.
Habe nur kein Beispiel oder Beschreibung gefunden und wollte wissen wie 
man es in der Praxis macht.

Die Antworten haben mir aufjeden Fall weiter geholfen.

von J. Eislinger (Gast)


Lesenswert?

Es hilft sich mal den Code von anderen Implementierungen anzuschauen. 
Wir haben sogar einen Artikel über ModBus: 
https://www.mikrocontroller.net/articles/Modbus
Diese yambsiavr library habe ich mal benutzt - ist zwar für den Atmel 
aber zum Anschauen dürfts langen.

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.