Forum: Mikrocontroller und Digitale Elektronik variable Baudrate


von Der G. (jonnyk)


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

von Der G. (jonnyk)


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.

von Peter D. (peda)


Lesenswert?

Ich kenne keinen PC, der 56200 Baud kann.

Wie wärs mit 57600 ?


Peter

von Peter D. (peda)


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

von Der G. (jonnyk)


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.

von Falk B. (falk)


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

von Stefan B. (stefan) Benutzerseite


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.

von Der G. (jonnyk)


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. :-*

von Falk B. (falk)


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

von Der G. (jonnyk)


Lesenswert?

Danke falk genau das hab ich gemacht...

von Falk B. (falk)


Lesenswert?

@ Der Grosse (jonnyk)

>Danke falk genau das hab ich gemacht...

Und es geht dennoch nicht?

Hmmm.

von Der G. (jonnyk)


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

von Falk B. (falk)


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

von Peter D. (peda)


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

von Der G. (jonnyk)


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

von Peter D. (peda)


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

von Der G. (jonnyk)


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.

von Falk B. (falk)


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

von Der G. (jonnyk)


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.

von Johannes M. (johnny-m)


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.

von Der G. (jonnyk)


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.

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.