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
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.
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?
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.
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)
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.
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.
@ 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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.