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 =)
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...
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.
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
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.
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?!?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.