Hallo, ich habe eine Funktion (UART1_init) welcher ich 2 Parameter übergebe, der aufruf der Funktion sieht wie folgt aus: UART1_init(19200, 8) in der Funktion schreibe ich die Parameter in eine Variable void UART1_init(word wBaudrate, byte bLaenge) In der Variable wBaudrate müsste ja jetzt 0x4B00 stehen (19200dez). aber im debugmodus sehen ich das in der Variable 0x2F5E steht und in der Variable bLaenge steht nicht 8 sonder 0x2F. Kann mir jemand helfen?
>In der Variable wBaudrate müsste ja jetzt 0x4B00 stehen (19200dez).
Muss er nicht. Der Wert ist als Teiler / Muliplikator mit dem Systemtakt
im Register abgelegt. Schau ins Datenblatt und rechne dir den korrekten
Wert aus.
bastler schrieb: > In der Variable wBaudrate müsste ja jetzt 0x4B00 stehen (19200dez). aber > im debugmodus sehen ich das in der Variable 0x2F5E steht und in der > Variable bLaenge steht nicht 8 sonder 0x2F. Bist du sicher? Die Übergabevariablen einer Funktion werden auf dem Stack angelegt, schaust du an der richtigen Stelle? Zeige mehr Code
wie kann ich an eine bestimmte stelle schauen? der Code des gesamten Programmes ist sehr umfangreich. was genau würdest du gerne sehen um mir helfen zu können?
also hab jetzt gesehen das 0x2F5E an der Adresse steht die der Variable wBaudrate gehört. aber wohin schreibe ich dann die 19200?
Welcher compiler, welcher Pic welche Uart welcher Prozessortakt, wo ist der Codeschnipsel usw usf. bastler schrieb: > der Code des gesamten Programmes ist sehr umfangreich. was genau würdest > du gerne sehen um mir helfen zu können? Schlage eine gekürzte Programmversion vor die nur den Uart Initialisiert und ein paar Bytes sendet.
Wo ist eigentlich das Problem? Gehts nicht mit der Funktion? Oder willst Du nur wissen, wie diese Funktion intern arbeitet? Schau doch mal in den Quellcode der Funktion. Ist nicht von Dir, oder?
C-Compiler dürfen optimieren. Es kann sein, wenn Du die Funktion nur einmal aufrufst, daß sie geinlined wird und dann der Baudratenteiler schon zur Compilezeit ausgerechnet wird. Ansonsten muß Dein armer 8Bitter nämlich ein riesen Bohei machen und die float-Division aufrufen, um den UART-Teiler zur Laufzeit auszurechnen. Peter
bastler schrieb: > Variable wBaudrate müsste Die Variable gibt es nicht (bzw der Compiler hat keine Veranlassung für die Zahl 19200 knappes RAM zu verwenden). Es ist eine Konstante, tappst also vom ROM in irgendein Register des Uarts. Das da dann 19200 im Klartext steht ist mehr als unwahrscheinlich, da dieser Wert einen Vorteiler darstellt der z.B. vom Systemtakt abhängt.
Servus, das ist ganz normal. Die richtige Quarz - (Prescaler - Timer -) Baudratenkombination wird natürlich nicht in Laufzeit berechnet sondern das macht der Compiler einmalig beim compilieren. Das merkst du auch daran, dass die beiden Parameter konstant sein müssen. Versuch mal das mit einer nicht const. Variable zu machen und dein Compiler wird dir genau das ankreiden.
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.