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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.