mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik RS485-USB-Baudratenproblem


Autor: Em Ha (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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/mikrocontrol... (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 =)

Autor: mp (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
nimm einen Quarz für den Tiny !!!! Der interne RC ist Schrott.

Autor: Em Ha (em_ha)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dann mach halt ne automatische Baudratenerkennung im AVR :)

Ralf

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: space (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Em Ha (em_ha)
Datum:

Bewertung
0 lesenswert
nicht 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?!?

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"der tiny wird in der nächsten revision durch einen mega168 ersetzt"

Autor: Em Ha (em_ha)
Datum:

Bewertung
0 lesenswert
nicht 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:
#define F_CPU 4000000L
...
bool uart_init(uint16_t baud) //Rest wird mit 8N1 gesetzt
{ 
 uint16_t UBRR_Wert;
 uint16_t UBRR_Real;
 int8_t  BaudError;

  Tx0PufferLesPos = 0;
  Tx0PufferSchreibPos = 0;
  Rx0PufferLesPos = 0;
  Rx0PufferSchreibPos = 0;

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

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

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

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

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


WTF?!?

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und die CKDIV8 Fuse?

Autor: Em Ha (em_ha)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
A. K. schrieb:
> Und die CKDIV8 Fuse?

nicht aktiviert (via AVR Studio)

Autor: Em Ha (em_ha)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
is das so richtig, was ich da gemacht hab?

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.