www.mikrocontroller.net

Forum: Compiler & IDEs usart umschalten


Autor: Josef (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 :)

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Josef (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Autor: Josef (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hab jetzt leider nichts gefunden, was mich weitergebracht hätte...

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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
  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

  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.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Josef (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stimmt. Das war die Lösung! Danke vielmals :=)

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

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.