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 :)
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.
Hier bitte. An das was du gerade gesagt hast hab ich auch schon gedacht und mich gleich mal auf die suche im Datenblatt gemacht.
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.