www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik variable Baudrate


Autor: Der Grosse (jonnyk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
habe schon im forum gesucht aber nichts in der art gefunden

und zwar folgendes problem in basic

ich möchte werend das program ausgeführt wird die baudrate am mega 16 
ändern (sie soll also variabel bleiben etweder 115200 oder 56200)

jetzt habe ich folgenden code dazu geschrieben

Baud_change:

   If Pind.4 = 1 Then
      Baud = 115200
      Locate 1 , 1 : Lcd "Baudrate 115200"
      Reset Watchdog
   End If

   If Pind.4 = 0 Then
      Baud = 56200
      Locate 1 , 1 : Lcd "Baudrate 56200"
   Reset Watchdog
   End If
Return

auf´m display zeigt er mir es an das die baudrete gewechselt wurde aber 
ich bekomme aber nix am PC bei beiden stellungen des schalters.

Pind.4 habe ich hiermit als eingang deklariert

Config Pind.4 = Input           'Ein Pin wird als Eingang definiert

muss ich den PULL UP auch noch hoch zihen? weil er reagiert ja auf die 
änderungen.

würde mcih freuen wenn mir einer helfen könnte

Autor: Der Grosse (jonnyk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"
Autor: Falk Brunner (falk)
Datum: 01.10.2007 15:58

------------------------------------------------------------------------ 
--------
@ Der Grosse (jonnyk)

>Kann man auch eine variable baud rate beim mega 16 setzen? wenn ja wie?

Mit einem scharfen Blick in Handbuch von BASCOM?

Such mal nach BAUD (ohne Dollarzeichen am Anfang).

MFG
Falk
"
hab ich ausprobiert es geht nicht. bekomme von MC trotzdem keine 
antwort.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich kenne keinen PC, der 56200 Baud kann.

Wie wärs mit 57600 ?


Peter

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Grosse wrote:

>       Baud = 115200

Wenn ich mich dunkel an Basic erinnere, legst Du damit die Variable 
"Baud" an und weist ihr den Wert 115200 zu, mehr nicht.

Irgendwo im SRAM steht dann also 115200.

Auf die UART dürfte das keinerlei Einfluß haben.

Ich vermute mal, es gibt ne Funktion Initialize_UART, die sollte die 
UART initialisieren können.


Peter

Autor: Der Grosse (jonnyk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
in der hilfe von bascom steht zitiere

"$BAUD overrides the compiler setting for the baud rate and BAUD will 
change the current baud rate.
BAUD = ... will work on the hardware UART."

tut leid hab mich verschrieben hast recht 57600 aber geht trotzdem 
nicht.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Peter Dannegger (peda)

>Wenn ich mich dunkel an Basic erinnere, legst Du damit die Variable
>"Baud" an und weist ihr den Wert 115200 zu, mehr nicht.

Aber nicht bei BASCOM. Dort ist es ein Befehl.

MFG
Falk

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mit welcher Baudrate geht es? Geht es überhaupt, d.h. der Rest vom 
Programm ist OK und die Freilandleitungen zwischen µC und PC sind 
richtig gezogen.

Autor: Der Grosse (jonnyk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
da ich nicht einfach nur rum gesessen habe hier mein modifizierter code

'------------------------------Variable Baudrate 
Einstellen----------------


Main:
   If Pind.4 <> Baud_changed Then Goto Baud_change
   If Z = 5 Then
      Select Case I(3)
      Case Chr(162)
         'If Usr.txc = 1 Then
            Printbin Serien_nr
         'End If
      Case Chr(49)
         'If Usr.txc = 1 Then
            Printbin Serien_nr2
         'End If
      Case Else
         'If Usr.txc = 1 Then
            Printbin Fehler
         'End If
      End Select
      Z = 1
   End If
   Reset Watchdog
Goto Main

'----------------------------------------------------------------------- 
--------
Onrxd:
  A = Udr                                                   'Byte aus 
der UART auslesen
  'Print Hex(a)
  I(z) = A 
'Hauptschleife
  Incr Z

Return
Baud_change:

   Select Case Pind.4
   Case 0 : baud = 115200
            Cls
            Locate 1 , 1 : Lcd "115200"
   Case 1 : baud = 57600
            Cls
            Locate 1 , 1 : Lcd "57600"
   End Select
   Baud_changed = Pind.4

Goto Main

End                                                         'end program


hier mein code mit dem es jetzt doch läuft!!!!


ES funktioniert Danke für eure schnelle und effektive hilfe. Code lasse 
ich da fals es jemand sonst noch braucht. :-*

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Der Grosse (jonnyk)

>Wenn ich die baud rate ohne den schalter also Constant einstelle geht es
>mit beiden. Aber wenn ich den schalter mit einbinde funktioniert es
>nicht mehr.

Du musst definitiv den BAUB Befehl nutzen, NICHT $BAUD ! Das ist ein 
himmelweiter Unterschied.
Diese ganzen $Befehle sind Compileranweisungen, die nur einmal als 
Konstanten im Programm auftauchen, und vom Compiler während der 
Kompilierung verwendet werden. Während das Programm läuft, können diese 
nichts mehr ändern.

MfG
Falk

Autor: Der Grosse (jonnyk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke falk genau das hab ich gemacht...

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Der Grosse (jonnyk)

>Danke falk genau das hab ich gemacht...

Und es geht dennoch nicht?

Hmmm.

Autor: Der Grosse (jonnyk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja er macht zwar bei der baud rate 57200 das richtige ausgeben und wenn 
ich wieder umschalte auf 115200 dann kommt nur noch müll

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Der Grosse (jonnyk)

>Ja er macht zwar bei der baud rate 57200 das richtige ausgeben und wenn
>ich wieder umschalte auf 115200 dann kommt nur noch müll

Mach mal ne kurze Pause nach dem Umschalten, so 10ms oder so.

MFG
Falk

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du kannst nicht einfach so die Baudrate umschalten.

Beide Seiten müssen aufgehört haben zu senden, dann können sie 
umschalten und erst, wenn beide Seiten umgeschaltet haben, darf wieder 
gesendet werden.
Sonst ist einer aus der Synchronisation (falsche Startflanke) und es 
kommt Müll raus.

Außerdem kann es sein, daß die Baudratenteiler keinen Reset haben, d.h. 
beim Wechsel einmal voll rum (65536 Takte) zählen. Also etwas länger 
(1s) warten.

Außerdem prellt Dein Taster an Pind.4 wie sau, d.h. die Baudrate 
wechselt mehrmals.


Peter

Autor: Der Grosse (jonnyk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Falk Brunner wrote:
>
> Mach mal ne kurze Pause nach dem Umschalten, so 10ms oder so.
>
> MFG
> Falk

Was mmeinst du damit? ich mache doch den schalter manuel umschalten und 
dann erst sende ich ihm was damit er antwortet.

oder soll ich zwieschen den case anweisungen eine pause machen?

oder nach jedem "baud = ..."

???


Hab ich jetzt so geändert tut sich aber nix. im ablauf ist das selbe wie 
auch vorher. ich denke ma länger als eine sekunde warten ist auch nicht 
das ware oder???

Baud_change:

   Select Case Pind.4
   Case 0 : Baud = 115200
            Cls
            Locate 1 , 1 : Lcd "115200"
            Wait 1
            Reset Watchdog
   Case 1 : Baud = 57600
            Cls
            Locate 1 , 1 : Lcd "57600"
            Wait 1
            reset watchdog
   End Select
   Wait 1
   reset watchdog
   Baud_changed = Pind.4

Goto Main

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was für ein Programm benutzt Du auf dem PC ?

Hyperterminal ist krank !

Einstellungen ändern wird glaube ich ignoriert, wenn die Verbindung 
nicht getrennt ist.
Ich hab damit die seltsamsten Effekte erlebt (COM2 wurde angezeigt, aber 
auf COM1 wurde gesendet).


Am sichersten ist wohl, Hyperterminal zu beenden, neu starten, neue 
Baudrate setzen und verbinden.


Peter

Autor: Der Grosse (jonnyk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter Dannegger wrote:
> Was für ein Programm benutzt Du auf dem PC ?
>
> Hyperterminal ist krank !
>
> Einstellungen ändern wird glaube ich ignoriert, wenn die Verbindung
> nicht getrennt ist.
> Ich hab damit die seltsamsten Effekte erlebt (COM2 wurde angezeigt, aber
> auf COM1 wurde gesendet).
>
>
> Am sichersten ist wohl, Hyperterminal zu beenden, neu starten, neue
> Baudrate setzen und verbinden.
>
>
> Peter

Jop das mache ich auch ich habe zwei hyperterminals aus com 3 angesetzt 
mit verschiedenen baudraten. wenn ich den schalter betätige trenne ich 
den einen und starte den anderen.

Was mich allerdings wundert das er bei 57600 terminal das richtige 
ausgibt aber wenn ich wieder umschalte auf 115200 macht er es nicht 
mehr. wenn ich wieder auf 57600 mache geht es wieder.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Der Grosse (jonnyk)

>Jop das mache ich auch ich habe zwei hyperterminals aus com 3 angesetzt
>mit verschiedenen baudraten. wenn ich den schalter betätige trenne ich
>den einen und starte den anderen.

Ja, aber was und vor allem WIE sendest du Daten? Du darft nciht 
ununterbrochen Daten senden, sonst kann der PC nicht auf die neue 
Baudrate synchronisieren. Machs mal so.

Am uC Baudrate umschalten
Am PC Hyperterminal umschalten
Sendepause am uC (10ms oder so)
uC sendet normal.

MfG
Falk

Autor: Der Grosse (jonnyk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ne es geht nicht bin gerade mit nem oszi sicherheitshalber dran gegangen

daten werden werend des umschaltens nicht gesendet. Aber die pegel 
andern sich auch nicht (müssten sie? TXD/RXD low).
und wenn ich umgeschaltet habe von 115200 auf 57600 dann geht es.

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was für eine Taktquelle benutzt Du? Sicher, dass die genannten Baudraten 
mit ausreichender Genauigkeit einstellbar sind? Gerade die 57,6 kBd und 
115,2 kBd sind nur mit baudratentauglichen Quarzen vernünftig erzeugbar.

Autor: Der Grosse (jonnyk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
das ist mir schon bewust. Das verständnis hört bei mir an der stelle auf 
wo ich die variable $baud als ... deklariere und es geht mit beiden 
baudraten einwand frei.

wenn ich wiederrum den schalter einbaue dann geht es nicht mehr.


jetzt habe ich es folgender massen realisiert:

Die var $Baud als 115200 deklariert und beim schalter setze ich die var 
baud auf 57600.

wenn ich jetzt von 57600 auf 115200 wechsele dann lasse ich den watchdog 
ablaufen und nach´m reset ist er wieder auf 115200.

von 115200 auf 57600 geht es. ganz normal.

ist zwar nicht die beste lösung aber immer hin.

wenn jemand was besseres weiß bitte um hilfe.

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.