Forum: Mikrocontroller und Digitale Elektronik Baudrate ändern im Programm


von Martin (Gast)


Lesenswert?

Hi, ich habe grade folgendes Problem:
Ich möchte innerhalb meines Programmes die Baudrate ändern. Grund ist 
ein angeschlossenes Gerät, welches erst mit 9600Baud läuft, danm aber 
auf 19200 eingestellt werden soll.
Ich nutze die Bibliothek von Peter Fleury.
So sieht das ganze aus:
1
  #define F_CPU 8000000
2
[...]
3
  uart_init(UART_BAUD_SELECT(9600,F_CPU));
4
  uart_puts("$PSRF100,1,19200,8,1,0*38\r\n");
5
  uart_init(UART_BAUD_SELECT(19200,F_CPU));
6
  uart_puts("$PSRF103,00,00,01,00*24\r\n");

Allerdings holt er hier direkt die 19200 und nicht erst 9600. Mein 
Terminal Programm müsste ja je nach Einstellung einmal müll und einmal 
richtig empfangen. Es empfängt aber beides richtig, bzw beides nicht.

Meine Rückfallebene sollte eigtl sein, das ich alles mit 9600baud laufen 
lasse. Da ist aber das nächste Problem:
1
  #define F_CPU 8000000
2
[...]
3
  uart_init(UART_BAUD_SELECT(9600,F_CPU));      //UART Initialisieren
4
  uart_puts("$PSRF100,1,19200,8,1,0*38\r\n");
5
  uart_puts("$PSRF103,00,00,01,00*24\r\n");      //GGA einschalten ohne Checksum
6
  /*uart_puts("$PSRF103,05,00,01,00*21\r\n");      //VTG einschalten ohne Checksum
7
  uart_puts("$PSRF103,01,00,00,01*25\r\n");      //GLL abschalten
8
  uart_puts("$PSRF103,02,00,00,01*26\r\n");      //GSA "
9
  uart_puts("$PSRF103,03,00,00,01*27\r\n");      //GSV "
10
  uart_puts("$PSRF103,04,00,00,01*20\r\n");      //RMC "
11
  uart_puts("$PSRF103,06,00,00,01*22\r\n");*/      //MMS "
Will ich das so senden, Crasht der µC. (LED blinkt nicht). Sende ich nur 
3 Strings, geht alles. Auch mit delays (von paar ms bis hin zu einer 
sekunde) stürzt er ab. Buffer sind beide auf 128 definiert. Erhöhe ich 
den TX Buffer, kann ich mehr senden, senke ich ihn, stürzt er früher ab. 
Eigentlich müsste der Buffer doch geleert werden nach dem Senden?!
Controller ist ein Mega8 mit 8Mhz Quarz, Data Memory Usage bei 54%. Also 
genug platz für den Stack.
Verbunden ist der Controller mit dem PC mit einem FT232. Die Verbindung 
geht in beide Richtungen. Kommentier ich obigen Code aus, reagiert er 
korrekt auf vom PC gesendete Kommandos.
Der obige Code ist mit das erste, was gemacht wird nach der 
Port-Initialisierung.

Betrieben mit einem 3,7V LiPo Akku, mit einem 3,3V Spannungsregler 
dahinter.

Hat jemand eine Idee, wie ich das erste Problem lösen kann und worans 
beim zweiten hapert?

von Hasso (Gast)


Lesenswert?

Peters Bib arbeitet mit einem Buffer, der von einem Interrupt 
abgearbeitet wird.
setz dir oben mal spasseshalber ein _delay_ms(100)vor dem 2. Init rein. 
dann klackert der UART schon ein paar Bytes Langsam raus...

von Martin (Gast)


Lesenswert?

Selbst mit 1sek delay zwischen jedem senden gehts nicht. Kurioser weise 
kommt aber alles zeitgleich an.

von Martin (Gast)


Lesenswert?

Ich habs jetzt mal so gemacht:
1
  uart_init(UART_BAUD_SELECT(9600,F_CPU));      //UART Initialisieren
2
  uart_puts("$PSRF103,00,00,01,00*24\r\n");      //GGA einschalten ohne Checksum
3
  _delay_ms(200);
4
  uart_puts("$PSRF103,05,00,01,00*21\r\n");      //VTG einschalten ohne Checksum
5
  _delay_ms(200);
6
  uart_puts("$PSRF103,01,00,00,01*25\r\n");      //GLL abschalten
7
  _delay_ms(200);
8
  uart_puts("$PSRF103,02,00,00,01*26\r\n");      //GSA
9
  _delay_ms(200);
10
  uart_puts("$PSRF103,03,00,00,01*27\r\n");      //GSV
11
  _delay_ms(200);
12
  uart_puts("$PSRF103,04,00,00,01*20\r\n");      //RMC
13
  _delay_ms(200);
14
  uart_puts("$PSRF103,06,00,00,01*22\r\n");      //MMS
15
  _delay_ms(200);
und es geht nicht, der µC stürzt ab. Ich versteh nur absolut nicht 
warum? Selbst mit 1000ms geht es nicht.
Um auszuschließen das doch irgendwas mit dem Speicher nicht stimmt, habe 
ich diverse Arrays kleiner definiert und bin so auf 35% Memory Usage 
gekommen, keine besserung.
Langsam nerft der Fehler echt... Die letzte "hürde", dann währe das 
Programm fertig.

Weiß denn niemand rat? Ich poste auch gerne das komplette Projekt, falls 
das hilft.

von Fabian O. (xfr)


Lesenswert?

Probier mal die Strings in den Programmspeicher zu legen:
1
uart_puts_P("$PSRF103,00,00,01,00*24\r\n");

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.