Forum: Compiler & IDEs usart umschalten


von Josef (Gast)


Lesenswert?

Hallo zusammen,
ich bräuchte mal euer geschätztes Fachwissen in Sachen uart/usart.
Ich benutze die usart mit getch und putch. Das funktioniert bis jetzt 
alles einwandfrei. Nun will ich den Befehl rprintf benutzen um meine 
Messergebnisse an den PC zu senden. Dazu initialisiere ich die uart 
library von Pascal Strang und gebe den rprintf Befehl. Der kommt auch am 
PC an. Nach dem rprintf Befehl wird die getch und putch Routine wieder 
initialisiert. Damit ich wieder mit getch und putch arbeiten kann. Und 
ab da tritt das Problem ein. Die getch und putch Routinen funktionieren 
nicht mehr wie gewünscht. Die getch routine funktioniert erst nach 
mehrmaligem Senden des gewünschten Zeichens und die Putch sendet nur 
Müll.

Bei Pascal Strangs rprintf und uart brauche ich 1 Startbit, 8 Datenbits, 
1 Stopbit. Parität keine.

und bei den getch und putch Routinen 1 Startbit, 7 Datenbits, 2 
Stopbits. Parität gerade.

Ist es überhaupt möglich zwischen den zwei Initialisierungen zu 
wechseln?

Ich arbeite mit AVR Studio und Win AVR. Programmiersprache ist C. 
Prozessor ATMega 32.

kurzer Programmausschnitt:

   initusart();             // initialisiere UART (getch und putch)
   .
   .
   .//Programmablauf mit getch und putch routinen
   .
   .
   uartInit();              // initialisiere  UART (Pascal Strang)
   uartSetBaudRate(9600);
   rprintfInit(uartSendByte);
   uartFlushReceiveBuffer();

   rprintf("Ausgangsspannung1:  %d digits",Ua1);

   _delay_ms(1000);

   initusart();            // Initialisiere UART (getch und putch)
   .
   .
   .// Programmablauf mit weiteren getch und putch routinen
   .

Hoffe jemand von euch kann mir helfen :)

von Karl H. (kbuchegg)


Lesenswert?

Josef schrieb:

> Ist es überhaupt möglich zwischen den zwei Initialisierungen zu
> wechseln?

Möglich ist das schon.
Dem µC ist es ja grundsätzlich egal, wenn an den Bits gedreht wird.

Zeig doch mal die initusart() Funktion her.
Da wird wohl das uartInit() in einem Config-Register ein Bit setzen, 
welches vom initusart() nicht mehr gelöscht wird.

von Josef (Gast)


Angehängte Dateien:

Lesenswert?

Hier bitte. An das was du gerade gesagt hast hab ich auch schon gedacht 
und mich gleich mal auf die suche im Datenblatt gemacht.

von Josef (Gast)


Lesenswert?

Hab jetzt leider nichts gefunden, was mich weitergebracht hätte...

von Karl H. (kbuchegg)


Lesenswert?

Josef schrieb:
> Hier bitte. An das was du gerade gesagt hast hab ich auch schon gedacht
> und mich gleich mal auf die suche im Datenblatt gemacht.

Da brauchst du nicht lange im Datenblatt suchen.
Ein |= kann nur BIts in einem Register setzen aber keine löschen.
Ergo
1
  UCSRC |= (1 << URSEL) | (1 << UPM1) | (0 << UPM0) | (1 << USBS) | (1
hier werden nur Bits gesetzt. Falls irgendwelche Bits in den Registern 
vor Aufruf der Funktion gesetzt waren, dann sind sie auch nachher noch 
gesetzt. Ob du das willst oder nicht

1
  UCSRC = (1 << URSEL) | (1 << UPM1) | (0 << UPM0) | (1 << USBS) | (1
Jetzt wird das Register komplett niedergebügelt und mit neuen Werten 
versehen. Und zwar nur denjenigen, die in der Zuweisung auch angegeben 
sind. Damit ist garantiert, dass im Register auch tatsächlich die, und 
nur die, Bits gesetzt sind, die in dieser Zuweisung verwendet werden.


Gerade bei Initialisierungen muss man immer ein wenig aufpassen. Die 
meisten Initialisierungsfunktionen gehen davon aus, dass sie nur einmal 
aufgerufen werden und die Konfig-Register in jungfräulichem Zustand 
vorfinden (= alle Bits 0). Hat man zwischenzeitlich eine andere 
Konfiguration vorgenommen, dann kann das dann mächtig ins Auge gehen.

von Peter D. (peda)


Lesenswert?

Was ist ein "Pascal Strangs"?

Mach es dem Helfer doch nicht unnötig schwer.
Nutze den Dateianhang und poste ein compilierbares Projekt inklusive 
aller verwendeten irgendwo her aus dem Netz gesaugten Funktionen.

Einzig die Standard-Includes des Compilers kannst Du als gegeben 
ansehen, alles andere ist per se unbekannt.


Peter

von Josef (Gast)


Lesenswert?

Stimmt. Das war die Lösung! Danke vielmals :=)

von Karl H. (kbuchegg)


Lesenswert?

In der anderen Lib sollte man ebenfalls die Init Funktion untersuchen, 
ob dort das gleiche Problem auftaucht.

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.