RS485-USB-Baudratenproblem

Gast #1266937
Guten Morgen Allerseits!
Ich habe einen RS485 auf USB-Adapter mit einem FT232RL aufgebaut. Den 
Bus habe ich nach 
http://www.wiki.elektronik-projekt.de/mikrocontroller/rs485_bus (MAX3471 
als Transceiver, Busabschlusswiderstände 120Ohm, Pull-up und Pull-down 
100kOhm, Leitungslänge ca. 2m) und den RS485-USB-Adapter nach Datenblatt 
des FT232RL (jedoch ohne Eingangsinduktivität) aufgebaut. Als Master 
soll ein Rechner eingesetzt werden. Der Slave ist ein Tiny2313 mit einem 
Max3471 als RS485-Transceiver. Ich hab eine Baudrate von 9600 im Tiny 
vorgesehen. Wenn ich nun die geschichte an den rechner anschließe, kommt 
bei den genannten 9600Baud nur Mist am Rechner an. Stelle ich jedoch auf 
2400 runter, so werden die Daten vom Slave oft korrekt erkannt.
Nun zu meiner Frage: Woran liegt das? Konfiguriert sich der FTDI "von 
alleine" um?????
Thx =)
Für 2400 statt 9600 ist eher der voreingestellte Teiler verantwortlich 
als der Oszillator. Nimm mal den Teiler raus.

Aber wenn du es mit RS485 ernst meinst, ist für wirklich zuverlässige 
Operation mindestens ein Keramikschwinger erforderlich.
Gast
Moin,

mein Vorgänger hat wahrscheinlich recht.
Ich hatte mal einen Schneider Homecomputer mit externer Schnittstelle.
Diese externe Schnittstelle leitete die Baudrate vom 4 MHz Takt ab.
Die ganzzahlige Teilung brachte es nie exakt auf 4800 Baud für den
angeschlossenen Drucker und darum druckte er die ersten Zeichen richtig,
dann kam nur noch Schrott. Damals bekam die Schnittstelle einen eigenen
Quarzoszillator mit 3,68??? MHz (ein ganzzahliges Vielfaches von 4800)
und Ruhe war.
Vielleicht hilft's
Stefan
danke für die anregungen =) ein testaufbau slave-rs232-rechner 
funktionierte ohne probleme auch mit höheren baudraten. aba jetz via 
rs485 halt nicht mehr =( werde versuchen, einen schwinger unterzubringen
welchen teiler meint ihr?!?
Die AVRs kommen von Haus aus mit einem Vorteiler zur Welt, 
beispielsweise interner Oszillator 8MHz, Takt aber nur 2MHz oder 1MHz. 
Baudrate berechnet auf 8MHz ist dementsprechend falsch. Siehe Fuses.

9600bd sind ab 2MHz oder einem Vielfachen davon kein Problem (clk/13).
@space (Gast)

>Diese externe Schnittstelle leitete die Baudrate vom 4 MHz Takt ab.
>Die ganzzahlige Teilung brachte es nie exakt auf 4800 Baud für den
>angeschlossenen Drucker und darum druckte er die ersten Zeichen richtig,
>dann kam nur noch Schrott.

Glaub ich nicht. So einen Schrott hat Scheider sicher nicht gebaut. 
Ausserdem

4 MHz  4800  16 = 52,08.

Wenn man das auf 52 rundet ist das ein Fehler von -0,16%. Das geht 
problemlos.
Ausserdem synchronisiert RS232 jedes Zeichen neu, da addiert sich der 
Fehler nicht.
Siehe Baudratenquarz.

@ OP

>habe leider für einen quarz keinen platz auf der slave-platine
>(13x25mm).

Es gibt SEHR kleine Quarze, so 3x2mm. Oder man nimmt einen kleinen 
Uhrenquarz mit 2mm Durchmesser und hängt den an den Timer2. Darüber kann 
man online den interenen RC-Oszillator kalibrieren. Dann sind auch 115k2 
problemlos möglich.

> der tiny wird in der nächsten revision durch einen mega168
>ersetzt, soll jedoch auch mit internem RC laufen...

Dito.

MFG
Falk
A. K. schrieb:
> Die AVRs kommen von Haus aus mit einem Vorteiler zur Welt,
> beispielsweise interner Oszillator 8MHz, Takt aber nur 2MHz oder 1MHz.
> Baudrate berechnet auf 8MHz ist dementsprechend falsch. Siehe Fuses.
>
> 9600bd sind ab 2MHz oder einem Vielfachen davon kein Problem (clk/13).

Habe die Fuses wie folgt gesetzt:
- BOD-Level @ 2,7V
- int. RC @ 4MHz; SuT: 14CK + 65ms

Die Baudrate berechne ich wie folgt:
1
#define F_CPU 4000000L
2
...
3
bool uart_init(uint16_t baud) //Rest wird mit 8N1 gesetzt
4
{ 
5
 uint16_t UBRR_Wert;
6
 uint16_t UBRR_Real;
7
 int8_t  BaudError;
8

9
  Tx0PufferLesPos = 0;
10
  Tx0PufferSchreibPos = 0;
11
  Rx0PufferLesPos = 0;
12
  Rx0PufferSchreibPos = 0;
13

14
 UCSRA = 0x00;
15
 UCSRB = 0x00;
16
 UCSRC = 0x00;
17
 UCSRB = (1<<RXCIE)|(1<<TXCIE)|(1<<RXEN)|(1<<TXEN);//Rx & Tx Int enablen, RX & Tx enablen
18
 UCSRC = (1<<UCSZ0)|(1<<UCSZ1);//8Bit, 1StopBit, no Parity, asynchronous Mode
19

20
 if ((baud < 1200) || (baud > 115200)) return false;
21

22
 UBRR_Wert = (uint16_t)(F_CPU/(baud * 16L))-1;  
23
 
24
UBRRH = (uint8_t)(UBRR_Wert >> 8); 
25
UBRRL = (uint8_t)(UBRR_Wert & 0x00FF);
26

27
return true;
28
}
aufruf der uart_init durch
1
uart_init(9600L);

benutze AVR-Studio. dort habe ich in den projekt-optionen auch 4MHz 
eingetragen


WTF?!?

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.