MAX485 antwortet nicht mit Loop Test

Moin in die Runde,

Aufgrund meiner Encoder (RS485) Auswertung mit Arduino musste ich mir einen Max485 zulegen. Da ich auch nach 1000 Versuchen keine Kommunikation hinbekommen habe, dämmerte mir, dass da irgendetwas nicht passt.

Also wollte ich mal den Max485 an sich testen. Chat GBT schlägt hier den loop test vor:
#define RE_DE_PIN 5 // Pin für RE/DE Steuerung des MAX485 (Senden/Empfangen)
#define TX_PIN 6 // Pin für DI (Daten senden) des MAX485
#define RX_PIN 10 // Pin für RO (Daten empfangen) des MAX485

void setup() {
// Seriellen Monitor starten
Serial.begin(9600);

// RE/DE Pin als Ausgang definieren und auf LOW setzen (Empfangsmodus)
pinMode(RE_DE_PIN, OUTPUT);
digitalWrite(RE_DE_PIN, LOW); // Setze auf LOW, um den Empfangsmodus zu aktivieren

// TX-Pin als Ausgang definieren
pinMode(TX_PIN, OUTPUT);

// RX-Pin als Eingang definieren
pinMode(RX_PIN, INPUT);

// Kurze Verzögerung für Stabilität
delay(500);

// Test-Nachricht senden und Empfang testen
Serial.println("Starte den Test...");
sendTestMessage();
delay(1000); // 1 Sekunde warten, bevor wir mit dem Empfangen fortfahren
}

void loop() {
// Schritt 1: Testnachricht senden
Serial.println("Sende Testnachricht...");
sendTestMessage();

// Schritt 2: Warten und Empfang prüfen
if (Serial.available()) {
byte receivedByte = Serial.read();
Serial.print("Empfangenes Byte: ");
Serial.println(receivedByte, HEX); // Zeige das empfangene Byte als Hex an
} else {
Serial.println("Keine Daten empfangen.");
}

delay(1000); // Warte eine Sekunde, bevor der Test wiederholt wird
}

void sendTestMessage() {
// RS485-Treiber in den Sende-Modus versetzen (DE/RE auf HIGH setzen)
digitalWrite(RE_DE_PIN, HIGH); // Setze auf HIGH, um den Sende-Modus zu aktivieren
Serial.println("Wechsel in den Sende-Modus...");

// Sende ein Testbyte (z.B. 0xAB)
byte testByte = 0xAB;
Serial.print("Sende Nachricht: ");
Serial.println(testByte, HEX);

// Sende das Testbyte über den DI-Pin
digitalWrite(TX_PIN, testByte);

// RS485-Treiber wieder in den Empfangsmodus versetzen (DE/RE auf LOW setzen)
digitalWrite(RE_DE_PIN, LOW); // Setze auf LOW, um den Empfangsmodus zu aktivieren
}

Leider bekomme ich auch hier keine Rückmeldung.

wo ist mein Fehler?

Gruß,
Robin




Setze Deinen Code bitte in Codetags. Wie das geht, steht hier.
Das kannst Du auch noch nachträglich ändern.

Gruß Tommy

Danke für die Info, Korrektur erfolgt sowie ich am PC bin

Wie auch? Überbrückte a und b können dir nix senden , und der Sketch ist Schrott.
Beschäftige dich mal mit RS485.

Wie kann ich den MAX485 am besten testen?

Mit einem zweiten...

mit einem Arduino+MAX485 und einem RS485-USB Adapter.

Ansonsten brauchst zwei MAX485 und zwei Arduino und hast ZWEI potentielle Probleme.

Bei Max485 bestimmt die A- und B-Leitung durch einen Polaritätswechsel zwischen ihnen einen HIGH- oder LOW-Logikpegel. Die Idee besteht darin, zwei verdrillte Adernpaare anzuschließen und am anderen Ende die Polarität zu messen. Das Magnetfeld des verdrillten Paares wirkt der Kapazität der Drähte entgegen, was die Überbrückung größerer Entfernungen ermöglicht. (google translate)

Das weiß ich.

Genau, aber OP vielleicht nicht.

Hallo,

es wäre hilfreich dem TO zu erklären warum der Looptest mit RS485 nicht funktioniert.

Der Controller, dein UNO, muss den MAX485 auf senden umschalten, dann kann der Controller seine Daten mittels Bus rausschicken. Alle anderen angeschlossenen Geräte mit ihren MAX485 sind auf Empfang eingestellt. Das ist die Grundeinstellung. Hat der Master, dein UNO, sein Protokoll gesendet, schaltet er wiederum seinen MAX485 auf Empfang um und kann Antworten erwarten. Der Looptest kann demzufolge nicht funktionieren, weil der Controller nicht zeitgleich senden und empfangen kann. Der MAX485 muss ja erst umgeschalten werden. Praktisch gesehen ist die Datenleitung aus A+B nur 'eine Leitung' mit Einbahnstraße. Wobei die Einbahnstraße je nach senden/empfangen ihre Richtung wechselt. Aber erst nachdem das Protokoll komplett übertragen wurde. Nennt sich Halb-Duplex.
Deswegen wird ein 2. Uno + MAX 485 benötigt. Er muss das Protokoll empfangen, verarbeiten und kann daraufhin erst antworten oder irgendwas zurücksenden.

Für zeitgleich senden und empfangen würden an allen angeschlossenen Controllern jeweils 2x MAX485 erforderlich. Dann funktioniert Full-Duplex.

Desweiteren hat dein Uno nur eine Hardware Serial. Du möchtest Pin 6 und 10 verwenden, dafür benötigst du Software Serial. Mit delay() geht dabei auch nicht viel los. Desweiteren muss vorm umschalten von Senden auf Empfangen der serielle Buffer geleert sein. Dafür gibt es Serial.flush(). Du siehst schon, an dem Vorhaben hängt leider etwas mehr dran wie man denken könnte.

Verwende auf dem UNO erstmal Software Serial, brücke diese Rx und Tx, programmiere ohne delay einen Looptest mit diesen Pins ohne das irgendwas anderes an diesen Pins angeschlossen ist. Umsichtiges Handeln ist angebracht wegen der Drahtbrücke. Die Konfiguration der Pins übernimmt die Serial.begin(x) Methode. Manuelle Pin-Konfigurationen sind nicht notwendig. Die Bsp. der IDE sind bestimmt hilfreich.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.