Moin Leute,
ich habe die Schaltung im Anhang hier aus dem Forum übernommen da ich je
nach Bestückung RS232 oder RS485 kommunizieren will. Der RS232 Teil
funktioniert wie er soll (D7 gebrückt, ohne R17).
Jetzt wollte ich mal den RS485 Teil auf einer anderen Platine testen,
das heißt der ganze RS232 Teil ist nicht bestückt genauso wie R17 und D6
da ich vorerst nur senden will.
Wie muss der Pegel an der Transmit Leitung sein damit ich senden kann?
Sollte die Schaltung denn so funktionieren? Der 75176 ist ein wenig
warm.
Grüße Christian
Hey, sorry für das Bild auf dem Kopf, kommt nicht wieder vor, ja
Masseverbidung ist vorhanden. Die Transmitleitung wird aber noch nicht
angesteuert, was muss diese denn für einen Pegel haben wenn ich etwas
senden will?
Stefan schrieb:> spess53 schrieb:>> Hi>>>> Masseverbindung zur Gegenstelle vorhanden?>>>> MfG Spess>> wozu?
Damit das Differenzsignal innerhalb des Arbeitsbereiches liegt.
Kurt
Kurt B. schrieb:> Damit das Differenzsignal innerhalb des Arbeitsbereiches liegt.>> Kurt
Inwiefern hat das Differenzsignal zwischen A und B einen Bezug zur
Masse, solange ich mir meine saubere differentielle Übertragung nicht
durch den meistens überflüssigen Bias versaue.
Stefan
So ich melde mich denn mal zurück.
Ich habe nun den Schaltplan so umgesetzt bis auf D6. Ist die Diode denn
notwendig wenn rein RS232 Receiver verbaut ist?
Der Sender sendet nun auch was er soll aber er bekommt was er gesendet
hat auch direkt wieder zurück. Da ich einen Atmega162 verwende mit 2
UARTS hab ich in der UART0 Empfangsroutine folgendes stehen:
1
ISR(USART0_RXC_vect)
2
{
3
uint8_tdummy;
4
dummy=UDR0;
5
UART1_Transmit(dummy);
6
}
Das heißt alles was an UART0 ankommt wird parallel an UART1 ausgegeben.
Und nun bekomme ich im gleichen Moment das zurück was UART0 sendet. Das
ist doch nicht normal oder?
Weiterhin kann ich nicht empfangen über RS485 liegt das an der fehlenden
Diode und R17?
Grüße Christian
Chris T. schrieb:> Der Sender sendet nun auch was er soll aber er bekommt was er gesendet> hat auch direkt wieder zurück.
Der Empfangsteil des 75176 ist ja auch die ganze Zeit aktiv und liest
das zurück, was du auf's Kabel gibst. Wenn du das verhindern möchtest,
musst du das TRANSMIT Signal auch an Pin 2 (Rx Enable) des 75176
anschließen -- bei high wird dann der Empfänger abgeschaltet. Das Signal
darf erst wieder low werden, wenn das letzte Bit gesendet ist.
Sebastian
Danke für die Ausführung, jetzt weis ich damit schon mal bescheid. Mache
Grand meine ersten Gehversuche mit RS485 auf Hardwarelevel.(Sonst war
immer ein Konverter dazwischen)
Gibt's denn noch Anmerkungen dazu das ich nichts empfangen kann?
Woran könnte das liegen?
Edit:
ICh empfange schon "etwas" aber das hat nicht viel mit den gesendeten
Bytes zu tun, manchmal FF, FE, FD ...
Sollte ich mal R17 entfernen?
Wenn du nur RS485 bestückt hast, kannst du Pin 1 vom 75176 direkt mit
dem AVR verbinden, D6 wird also überbrückt und kann entfallen. Ich nehme
an, das meinst du?
Ob R17 vorhanden ist oder nicht sollte dann keine Rolle spielen.
Bitte nicht übel nehmen, aber kann es sein das dir noch nicht bewußt ist
das der RS485 so wie im Schaltplan dargestellt eine sogenannte
halbduplex Verbindung darstellt.
Das bedeutet es kann immer nur eine Sation geben die sendet und alle
anderen haben geälligst nicht zu senden. (So wie früher, in der vor
Handy zeit beim Funk)
Das bedeutet wenn du mit dem Senden fertig bist (und das Letzte Bit die
UART verlassen hat) muss die TRANSMIT Leitung wieder auf null gesetzt
werden.
Wenn mehrere Teilnehmer gleichzeitig den TRANSMIT auf 1 haben geht müll
über die Leitung, und der wird auch prompt als solcher empfangen.
Ist jetzt einfach mal eine Vermutung weil du sagst RS485 ist für die was
neues auf dieser Ebene. Viele Adapter machen das automatisch.
Udo
Sind A und B am 75176 richt herum angeschlossen? Sonst geht's auch
nicht.
Hast du ein Oszilloskop? Ich würde TRANSMIT zum Testen fest auf 0 legen,
von einem anderen RS485-Gerät Daten senden und mit dem Oszi die Rx
Leitung am 75176 anschauen. Da muessten dann gueltige UART-Frames zu
sehen sein.
Sebastian
Hm ich hab jetzt mal die Transmitleitung gemessen, die ist immer high
obwohl ich Sie eigentlich auf Low schalte. Jetzt zweifle ich aber auch
die anderen Pins auf den Port bleiben high obwohl ich die auf low setze:
1
DDRC=0xFF;
2
PORTC&=~(1<<PC4);
3
PORTC&=~(1<<PC5);
Alle Pins auf Ausgang und Pin4 und 5 auf low...
Edit: PIN3 kann ich schalten, 4 und 5 nicht, wird wohl am Prozessor
liegen. Ich nehm mal ein anderen Pin für Transmit.
BINGO, Sebastian,
ich hab zwar die Pinbelegung vor mir aber hab nicht auf die alternativen
Funktionen der Pins geachtet, man o man, Datenblatt lesen...
Also ich kann abwechselnd senden und empfangen aber nur wenn ich den
Code ändere, wie lange vor dem Senden muss der Transmit Pin denn high
sein?
Mit folgendem Code kann ich nur empfangen:
1
#define TR_DDR DDRC
2
#define TR_PORT PORTC
3
#define TR_PIN 3
4
5
6
intmain(void)
7
{
8
LED_DDR|=(1<<DDA0);
9
LED_DDR|=(1<<DDA1);
10
TR_DDR|=(1<<DDC3);
11
TR_PORT|=(1<<TR_PIN);
12
//Timer konfigurieren
13
//stetige Wertanforderung
14
TCCR1B|=(1<<CS12)|(1<<CS10);// standard = 9 Sekunden
Die Zeit zwischen TRANSMIT high und Senden steht im Datenblatt des
75176, ist auf jeden Fall weniger als 100 ns. Ich denke nicht, dass das
hier ein Problem ist.
Dein Code ist nicht vollständig. Wo kommt wert_anfordern her? Wann wird
es gesetzt?
Wass willst du überhaupt erreichen?
Was für Geräte hängen am Bus? Wer sendet wann? Siehe Antwort von Udo
oben, du musst dir den genauen Ablauf überlegen, wann gesendet und wann
Empfangen werden soll. Aus dem Code lässt sich das nicht erkennen, weil
der Empfangsteil fehlt.
Sebastian
So hier mal der ganze Code:
Ich will erstmal nur langsam an den Bus heran. Der atmega senden ca.
alle 10 Sekunden ein paar Bytes, zwischen dieser Zeit sollte ich ja auch
antworten dürfen. Später gibt es nur einen Master der den Slave zum
Daten senden auffordert.
UART1_Transmit() wartet bis der Sendepuffer leer ist (Flag UDRE),
schreibt dann ein neues Byte in den Sendepuffer und kehrt sofort zurück.
Im Hintergrund schickt der UART nun langsam ein Bit nach dem anderen auf
die Reise... während dein Programm parallel weiter läuft!
Wenn du also sowas schreibst...
1
UART1_Transmit('K');
2
TR_PORT&=~(1<<TR_PIN);
...wird TRANSMIT mitten in der Übertragung abgeschaltet. Du brauchst
etwas in dieser Richtung (Register auf deinen unbekannten Prozessor
anpassen, ungetestet):
1
#define TRANSMIT_ON() ... // Setze 75176 Pins 2,3 HIGH
Hi
Zum Umschalten kann man auch TXC-Interrupt nutzen. Der wird ausgelöst,
wenn das ein Byte vollständig gesendet wurde und im Sendepuffer der
U(S)ART kein weiteres Byte vorhanden ist.
MfG Spess
Danke an euch hab es jetzt so gelöst, jetzt funktioniert schon mal das
senden und empfangen. Bei RS232 musste ich mir nie Gedanken ums senden
machen, einfach übergeben und gut wars ;)
Naja jetzt kanns endlich weiter gehen.
Ich bedanke mich erst mal für die Hilfe hier.