MAX 485 Problem beim umschalten

OP #318472
Lesenswert?

Hallo,

folgendes mir nicht erklärbares Problem. Mein Programm sendet jede
Sekunde ein J zu einem anderen Controller, der das empfangende Zeichen
auf einem Display ausgibt.Funktioniert super.

Wenn ich VOR der for(;;) Schleife den Max auf senden schalte klappt
es.

Problem :

Wenn ich Ihn in der for Schleife auf senden schalte, klappt es NICHT
!!
Ich verstehe es einfach nicht !?

Danke im vorraus !
Gruß
Thorsten
Angehängte Dateien:
OP #318473
Lesenswert?

So glaube ich habe es gefunden. Aber verstehen tue ich es noch immer
nicht !?

Es ist die Delay Routine. Wenn ich diese NACH dem umschalten aktiviere,
dann sendet er nix.Warum auch immer !? Ohne die Delay Routine klappt es
wunderbar.

Was ist an der Delay Routine so schlecht, das diese den Programmablauf
so stört !?

Probiere es einmal per Timer, aber da es ein RS485 Protokoll werden
soll, dachte ich das die Delay Routine ok wäre.Nummer 1 sendet und
wartet ein paar Sekunden.Dann gibt Nummer 2 Antwort. naja.....

Nutze diese Delay Routine auch bei anderen Sachen 1-Wire mit DS18S20,
serielles Display u.s.w. nur in diesem Fall ist sie wohl nicht ok.

Warum auch immer. Irgendjemand vielleicht eine Idee ?

Danke im vorraus !
Gruß
Thorsten *gähn
Angehängte Dateien:
OP #318476
Lesenswert?

@Kriki

DDD2 bedeutet DataDirection Port D Bit 2

im Tutorial ist es mit Port B.

Da es bei mir Port D ist, sieht es etwas komisch aus, aber das
funktioniert einwandfrei.Darf nach dem umschalten nur keine Delay
Schleife aus meinem Programm benutzen, da sonst das umschalten zwar
funktioniert ( Nachgemessen ), aber das senden klappt nicht.

Thorsten
OP #318477
Lesenswert?

@Rahul

Meintest Du das deswegen, da ich auch halbduplex beim RS485 habe,das
ich dieses TXC Bit auswerten sollte.

Zitat :

    Dieses Bit wird vom AVR gesetzt, wenn das im Sende-Schieberegister
befindliche Zeichen vollständig ausgegeben wurde und kein weiteres
Zeichen im Sendedatenregister ansteht. Dies bedeutet also, wenn die
Kommunikation vollumfänglich abgeschlossen ist.
    Dieses Bit ist wichtig bei Halbduplex-Verbindungen, wenn das
Programm nach dem Senden von Daten auf Empfang schalten muss. Im
Vollduplexbetrieb brauchen wir dieses Bit nicht zu beachten.
    Das Bit wird nur dann automatisch gelöscht, wenn der entsprechende
Interrupthandler aufgerufen wird, ansonsten müssen wir das Bit selber
löschen.

Gruß
Thorsten
Gast #318482
Lesenswert?

Sers,
@ engineer
Etwas prinzipielles. Wenn du Daten periodisch austauschen möchtest
würde ich dir empfehlen die Anfrage des Masters über nen Timer zu
steuern. Im Slave und Master wertest du die empfangenen Daten über den
UART-Interrupt aus.
Habe mit dieser Methode schon ein Netzwerk mit ATMega8515 als Master
und bis zu 8 ATMega16 als Slave in einem Netzwerk betrieben.
Delay Funktion ist nix gut für diese Anwendung.
Ergo: Mit Timern und Interrupts arbeiten!

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren