Hallo Leute,
ich wollte einen RS485 Bus aufbauen.
Folgender Chip wird verwendet: ADM3485 und Atmega32.
Bisher hab ich nur meine Controller und einen RS485 auf USB Wandler
dran.
Der wandler funktioniert da ich ihn auch mit anderen Geräten nutze.
Es muss also eher an der Software/Hardware liegen.
Wenn ich RX und TX vor dem ADM abgreife werden auch die richtigen
Charakters gesendet. Nur auf den Bus kommt nix mehr an.
Folgenden Code verwende ich:
1
/* define CPU frequency in Mhz here if not defined in Makefile */
Ich muss das Thema leider nochmal hoch holen.
Senden klappt ja soweit,
aber mit dem Empfangen habe ich so meine Probleme.
Das Hauptproblem ist, das ich ja alles was ich sende auch erstmal wieder
empfange.
Das habe ich versucht schon mal raus zu nehmen.
Aber wenn ich dem Controller was schicke und dann in meiner Main
auswerte dann kommt da Mist bei raus, bzw. wird mir ein Zählwert nicht
richtig ausgegeben...
Blöd das ich keine jtag Schnittstelle habe...
Aber hier mal der Code, wahrscheinlich kann man das viel besser lösen
aber ich habe leider keinen Ansatz...
Es wird mir dann zwar ein Byte gesendet, da steht aber 240 drin und
nicht 6.
Ich übergebe ja in der Receive ISR einfach den Wert von receive_max und
der ist mit 6 festgelegt.
Du empfaengst was du sendest, weil der RxInterupt waehrend dieser Zeit
laeuft. Eine Eigenschaft des RS485.
Ich wuerd diesen Wert grad wegschmeissen und nicht speichern. Egal.
Das Senden wuerde ich auch per Interrupt machen.
Chris T. schrieb:> Es wird mir dann zwar ein Byte gesendet, da steht aber 240 drin und> nicht 6.
Das sieht nach abgeschaltetem Empfänger oder falsche Baudrate aus.
Wenn das Senden noch nicht klappt, hat es wenig Sinn, Empfangen zu
wollen.
Bei manchen Controllern gibt es 1 Flag (mit Interrupt) für
Transmit-Buffer leer (und damit ist der 1Byte-Fifo gemeint), und noch
ein weiteres Flag für "jetzt ist das zeichen wirklich komplett mit allem
versendet, mit Stopp und Pi pa po". Wenn du letzteres nicht hasst,
brauchst Du eine Pause!
Hi
>Wenn du letzteres nicht hasst, brauchst Du eine Pause!
Der Atmega32 hat einen TXC-Interrupt.
Und den kann man auch benutzen, selbst wenn man ihn hasst.
MfG Spess
Chris T. schrieb:> Ja ich weis, aber das muss sich doch per Software bewerkstelligen> lassen, dass es trotzdem funktioniert.
Ignorier doch einfach alle empfangenen Zeichen, solange du selber
sendest.
Es ist sogar prinzipiell sinnvoll, die gesendeten Daten gleich wieder zu
empfangen - die kann man nämlich wunderbar mit den tatsächlich
gesendeten Daten vergleichen, und so Übertragungsfehler bzw. Störungen
auf dem RS485-Bus erkennen. Wenn nämlich zur gleichen Zeit zwei
Busteilnehmer senden, stören sie sich gegenseitig.
Chris T. schrieb:> Es wird mir dann zwar ein Byte gesendet, da steht aber 240 drin und> nicht 6.Chris T. schrieb:> Senden klappt doch auch schon
??? Was ist denn dann Dein Problem?
Mein Problem ist ganz einfach das ich nichts richtig empfange.
Das Senden klappt.
Wie würde die Empfangsroutine aussehen damit ich das was ich empfangen
habe in meiner Main Schleife wieder zurück senden kann...
Das ist das Problem.
Mit
1
u_r_c=receive_max;
wird ja einfach eine konstante in der Empfangsroutine auf die Variable
geschrieben.
In meiner Main soll mir der Wert zurück gesendet werden, es wird aber
ein anderer Wert als übergeben gesendet...
Hat niemand ein eIdee woran es liegen könnte das mir der Wert nicht
korrekt zurück gesendet wird?
Also eigenartig ist, wenn ich einzelne Zeichen mit Hterm sende, dann
wird mir irgendwann wenn receive_max erreicht ist auch die passend
eAntwort geliefert.
Wenn ich die Zeichen aber hinterienander eingebe und dann Enter drücke
damit alle gesendet werden klappt das nicht, als ob er die nicht
mitbekommt...
Muss irgendwie mit der Hardware zusammen hängen, jemand Ideen? Der
Controller und RS485 Chip werden mit 3,3V versorgt.
Chris T. schrieb:> Hat niemand ein eIdee woran es liegen könnte das mir der Wert nicht> korrekt zurück gesendet wird?
Hast Du Beitrag "Re: RS485 Übertragung passt nicht" überlesen?
Du setzt u_rx_start=0; nach jedem gesendeten Zeichen, obwohl u_rx_start
der Index auf Deinen Receive-Buffer ist.
Wenn Du Dich sowieso nicht dafür interessierst, ob die gesendeten Daten
identisch mit den empfangenen sind, dann ist die Lösung ganz einfach:
1. Verbindung von /RE zu GND unterbrechen
2. /RE mit DE verbinden
Dann kann der Transceiver während des Sendens nichts empfangen.
Frank M. schrieb:> Du setzt u_rx_start=0; nach jedem gesendeten Zeichen, obwohl u_rx_start> der Index auf Deinen Receive-Buffer ist.
Ich weis das aber wenn ich nichts sende dann wird da auch nichts auf
Null gesetzt. Ich empfange ja erstmal nur, und wenn die empfangenen
Zeichen = receive_max sind dann wird ein Zeichen gesendet...
Also nach Reset sende ich das erste mal:
01 01 01 01 01 01 01 01 01 01
das sind 10 Zeichen
darauf hin kommt erstmal nichts zurück obwohl theoretisch receive_max
erreicht sein sollte.
Dann sende ich nochmal
01 01 01 01 01 01 01 01 01 01
jetzt kommt als antwort: 7F
Dann sende ich nochmal:
01 01 01 01 01 01 01 01 01 01
jetzt kommt als Antwort endlich 09 was receive_max entspricht.
Wenn ich jetzt wieder sende dann kommt erst wieder nichts, dann 7F und
dann wieder 09
...
Chris T. schrieb:> Hat niemand ein eIdee woran es liegen könnte das mir der Wert nicht> korrekt zurück gesendet wird?Chris T. schrieb:> Ich weis das aber wenn ich nichts sende dann wird da auch nichts auf> Null gesetzt.
Drück Dich mal klarer aus. Ersteres hört sich so an, als ob der µC sein
eigenes Echo nicht empfängt: "nicht korrekt zurück gesendet wird".
Letzteres hört sich so an: "µC1 sendet, µC2 empfängt nichts."
Was denn nun? Wenn letzteres: A & B vertauscht?
Was wird empfangen? Nichts oder nur wenig oder nur Schrott?