Forum: Mikrocontroller und Digitale Elektronik RS485-USB-Baudratenproblem


von Em Ha (Gast)


Lesenswert?

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 =)

von mp (Gast)


Lesenswert?

nimm einen Quarz für den Tiny !!!! Der interne RC ist Schrott.

von Em H. (em_ha)


Lesenswert?

habe leider für einen quarz keinen platz auf der slave-platine 
(13x25mm). der tiny wird in der nächsten revision durch einen mega168 
ersetzt, soll jedoch auch mit internem RC laufen...

von Ralf (Gast)


Lesenswert?

Dann mach halt ne automatische Baudratenerkennung im AVR :)

Ralf

von (prx) A. K. (prx)


Lesenswert?

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.

von space (Gast)


Lesenswert?

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

von Em H. (em_ha)


Lesenswert?

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?!?

von (prx) A. K. (prx)


Lesenswert?

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).

von Falk B. (falk)


Lesenswert?

@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

von (prx) A. K. (prx)


Lesenswert?

Falk Brunner schrieb:

> Uhrenquarz mit 2mm Durchmesser und hängt den an den Timer2. Darüber kann
> man online den interenen RC-Oszillator kalibrieren.

Aber nur mit den Mega168, nicht mit dem ursprünglichen Tiny2313.

von Falk B. (falk)


Lesenswert?

"der tiny wird in der nächsten revision durch einen mega168 ersetzt"

von Em H. (em_ha)


Lesenswert?

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?!?

von (prx) A. K. (prx)


Lesenswert?

Und die CKDIV8 Fuse?

von Em H. (em_ha)


Lesenswert?

A. K. schrieb:
> Und die CKDIV8 Fuse?

nicht aktiviert (via AVR Studio)

von Em H. (em_ha)


Lesenswert?

is das so richtig, was ich da gemacht hab?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.