Serielle Baudrate zur Laufzeit ändern?

  • 1
  • 2
  • Page 2 of 2
tbegle
Benutzer
Avatar
Gender: n/a
Age: 64
Posts: 150
Registered: 01 / 2018
Subject:

Re: Serielle Baudrate zur Laufzeit ändern?

 · 
Posted: 27.12.2018 - 19:58  ·  #9
Hallo ich noch X,

ich habe den Fehler nun gefunden wieso der Befehl setbaud(...) ; nicht funktioniert
Sobald ich die Word Grenze unterschreite z.B. 57600Bd funktioniert der Befehl !
Kann mir jemand sagen wie ich dennoch 115200Bd (zur Laufzeit) verwenden kann? - 57600Bd und ander Baudraten hat mein Display nicht am Schirm!
Umschaltung Display(115200Bd) <-> Bluetooth(9600Bd)

Grüsse
Toni
Gunter
Administrator
Avatar
Gender:
Location: Frankfurt Main / Germany
Posts: 1697
Registered: 02 / 2003
Subject:

Re: Serielle Baudrate zur Laufzeit ändern?

 · 
Posted: 27.12.2018 - 21:06  ·  #10
Hallo Toni,

die Online Hilfe für setbaud (Taste F1) zeigt das auch an:
Procedure SetBaud1 (var:baud: word);
Mehr als Word geht da auch nicht, da es Prozessor intern nur
2 Byte für die Einstellung der Baudrate gibt.

Für die Erzeugung höherer Baudraten muss bei kleinen Quarz Freuenzen
ein "Double Speed Bit" gesetzt werden.
Dadurch wird die eingestellte Baudrate einfach verdoppelt.
Mit Setzen dieses Bits stellst du dann (9600 div 2) bzw. (115200 div 2) ein
was zu realen 9600 bzw. 115200 Bd führt.
(analoges Prinzip wie die CKDIV8 Fuse arbeitet)

Füge einfach am Ende der Prozedur Init folgendes ein:
ASM: UCSR0A := UCSR0A OR %0000 0010; //set Serport 0 double speed
und benutze überall "gewünschte Baudrate" div 2.
(am Ende von Init weil
1. da noch keine Interrupts aktiv sind und
2. der vom AVRco generierte Init-Teil mit diesem Register "durch ist" und
dieses Bit garantiert nicht mehr überschreibt).

Soweit ich gesehen habe, wird diese Atmel Spezialität vom AVRco erst
bei XMEGA unterstützt.

Gruß
Gunter

P.S.:
die vom AVRco im ASM Listing angebenene Abweichung der realen von
der eingestellten Baud Rate stimmt dann natürlich nicht mehr. Der Compiler
bekommt von dieser Manipulation schließlich nichts mit.
Da musst du die Tabelle im Prozessor Manual als Anhaltswert nehmen:
siehe "Examples of Baud Rate Setting" Table 19-11
tbegle
Benutzer
Avatar
Gender: n/a
Age: 64
Posts: 150
Registered: 01 / 2018
Subject:

Re: Serielle Baudrate zur Laufzeit ändern?

 · 
Posted: 28.12.2018 - 15:34  ·  #11
Hallo Gunter,

danke für die rasche Auntwort und Unterstützung!

Da wäre ich selbst niemals darauf gekommen! - unglaublich wie tief du ATMEL bzw. den ELAB-Copiler verinnerlicht hast !
Ich werde deinen Vorschläg nächstes JAHR (hihi) in die Tasten klopfen

Mir ist soeben eingefallen, mit dem Befehl "SerPort = 115200, Stop1;- fünktioniert die Übertragung! - mit dem Befehl setbaud(9600); könnte ich
den Bluetooth Transceiver betreiben! - aber wie komme ich wieder auf die 115200Bd?(Display)

Ein schönes neues Jahr 2019
Gruss
Toni
Gunter
Administrator
Avatar
Gender:
Location: Frankfurt Main / Germany
Posts: 1697
Registered: 02 / 2003
Subject:

Re: Serielle Baudrate zur Laufzeit ändern?

 · 
Posted: 28.12.2018 - 17:54  ·  #12
Hi Toni,

nur über den "Trick" mit double speed und dann SetBaud (115200 div 2).
War auch nicht ganz richtig, was ich oben geschrieben habe.
1. gibt es sogar nur 12 Bit für die Baud Rate Einstellung
2. wird da auch ein errechneter Wert (und nicht die Baud Rate) eingetragen
(nämlich die Anzahl der Taktzyklen die zwischen 2 Bits bei dieser Baud Rate
und dieser Taktfrequenz liegen, also praktisch das "Sample Intervall").
Aber egal. Solange das SetBaud so bleibt wie es ist, hilft nur der Trick.
Oder eine eigene Prozedur für SetBaud, die per ASM die Register manipuliert,
was aber ohne double Speed auch erst >1 Mhz Clock funktioniert

Guten Rutsch, Gunter

edit:
Die Definition "Serport = ..." wird vom Compiler ausgwewertet.
"SerBaud" ist eine Laufzeitfunktion und muss vom Controller ausgeführt werden. Daher die Beschränung auf 16 Bit.
  • 1
  • 2
  • Page 2 of 2
Selected quotes for multi-quoting:   0

Registered users in this topic

Currently no registered users in this section

The statistic shows who was online during the last 5 minutes. Updated every 90 seconds.
MySQL Queries: 15 · Cache Hits: 14   81   95 · Page-Gen-Time: 0.040096s · Memory Usage: 2 MB · GZIP: on · Viewport: SMXL-HiDPI