Hallo Forengemeinde ich beschäftige mich seit Wochen mit den RS485 Bus (mehrer Slaves an einem Master(PC) ). Ich habe die Hardware für einen RS485 (Halfduplex) soweit auf Lochraster zusammengelötet. ( MAX232 auf MAX487 (RE* und DE an Rts) -> Bus -> RS487 auf Atmega8 (PortD.2 auf MAX487 RE* und DE)) Bus ist terminiert mit 120 Ohm. Das Senden vom PC, sowie das Empfangen vom Controller am Pc funktioniert soweit ganz gut. Momentan schalte ich dabei den PC und Controller über RTS auf senden oder empfangen. Wie habt Ihr das in der Praxisgelöst? Ich möchte über VB2010 eine Software schreiben, mit der ich senden und empfangen kann. Mein Problem ist woher weiß ich wenn ich vom PC senden möchte, ob nicht gerade der Slave sendet. Und wie realisiere ich das Softwareseitig. Weiterhin habe ich noch ein Problem. Ich programmieren den Mikrocontroller (Atmega8) in Bascom. Hier ein Beispieltest-Code: $regfile = "m8def.dat" $crystal = 3686400 $swstack = 10 Open "COMD.0:1200,8,N,1" For Input As #1 Open "COMD.1:1200,8,N,1" For Output As #2 Dim E As String * 10 Config Portd.2 = Output Portd.2 = 0 Do Input #1 , E Portd.2 = 1 Print #2 , E Portd.2 = 0 Print #2 , "Test" Loop End Ich möchte ersteinmal nur sehen ob mit der Mikrocontroller das Print "Test" dauerhaft zurück gibt. Das funktioniert aber nicht! Erst wenn ich "Input #1, E" auskommentiere funktioniert es! Warum kann ich Input und Print nicht in einem Zug ausgeben und zurückschreiben? Das Programm dient nur zum Testen im Terminal! Danke schon mal vor ab für Eure Antworten! Ich komme hier jetzt nicht weiter! Gruß Tino
1. Setze RE* dauerhaft auf aktiv. Damit ist der Empfänger dauerhaft an, und jedes Zeichen, das Du sendest, empfängst Du auch wieder. Wenn Du etwas anderes empfängst als Du gesendet hast (oder gar nichts oder nur Müll), dann weißt Du, dass neben Dir noch jemand anderes auf der Leitung ist und schaltest Deine Sendeleitung sofort ab. Die andere Station sollte das gleiche machen. Nach einer zufälligen oder von der Stationsadresse abhängigen Zeit versuchst Du es erneut. 2. Arbeite nicht zeichenorientiert, sondern blockorientiert. Definiere Dir eine feste Blockstruktur mit Absender, Empfänger, Länge, Prüfsumme und Datenfeld, in die Du alle zu sendenen Daten strukturierst. Da ein Bus erstmal fehleranfälliger ist als eine Punkt-zu-Punkt-Verbindung, hast Du so die Möglichkeit, Übertragungsfehler zu erkennen. Schau Dir mal an, wie eine CRC berechnet wird. 3. Die Steuerung des Transmit Enables des RS485 Transceivers mittels RTS ist Standard bei den üblichen RS232-485 Adaptern. Leider hat das ganze einen Haken! Die PC-UARTs haben 16 Byte Sende- und Empfangs-FIFOs. Der PC kann jetzt nicht feststellen, wann das letzte Bit tatsächlich auf der Leitung gelandet ist, damit er seinen Transmitter abschalten kann. Du solltest also den Sende-FIFO abschalten, um auf der sicheren Seite zu sein. Einige USB-Seriell Adapter (z.B. die von FTDI) können die Steuerung des RS485-Transceivers automatisch durchführen, wenn man die im internen EEPROM auf RS485 einstellt. 4. Eventuell möchtest Du auch CAN verwenden. Das ist ein anderer serieller Bus, bei dem die Controller etliches an Arbeit übernehmen, was Du bei RS485 erst selber programmieren musst. Leider gibt es keine lochrastergeeigneten AVRs mit CAN, hier müsstest Du zu einem PIC18 oder PIC24 greifen (da gibts eine große Auswahl), oder einen Zusatzchip anschließen (der die Sache leider eher verkompliziert und bremst). Wird in der Automobilindustrie und der Automatisierung ganz gerne verwendet. fchk
Danke für die schnelle und ausführliche Antwort! Ich bin erst am Anfang meiner Versuche zur Datenübertragung mit dem RS485 Bus. Ich habe erst einmal versucht einen String von Master und Slave zu versenden un zu empfangen. Die Sende und Empfangssteuerung habe ich manuell betätigt. (HTTERM RTS enabled). Nun wollte ich nach jedem Sendevorgang vom PC eine Rückmeldung vom Slave erhalten, was aber nicht funktioniert. Das mit RE* dauerhaft auf aktiv werde ich morgen mal probieren. Ich denke aber dass diese Methode nur zum Testen ist! Die Fifo's werde ich ach mal aktivieren. Über ein strukturiertes Protokoll mache ich mir schon Gedanken, nur wie setze ich das um? (Softwarseitig). Ich möchte über den Bus meine Modellbahn steuern. Da fließen nicht all zu viele Daten über den Bus.Nein der CAN kommt für mich erst mal nicht in Frage. Gruss Tino
Lass dich nicht von den CAN Fans beschwafeln. CAN ist fuer Autos. Die Meldungslaenge ist ausserordentlich kurz, um nicht zu sagen unbrauchbar kurz. Also RS485. Wioe schon ge4sagt muss man blockorientiert denken. Also ein Protokoll aufsetzen mit Header(preable, Length, Source, Destination, Command), Data[..] & CRC. Jeder hoehrt mit und weiss daher wann die Meldung fertig ist, und wer nachher kommt. Dabei ist die Arbeit vereinfacht wenn die logische Struktur Master-Slave ist, im Gegensatz zu Multimaster. Im Falle von Master-Slave duerfen die Slaves nur antworten, und muessen daher nur mitbekommen wann der Master sendet.
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.