Forum: Mikrocontroller und Digitale Elektronik PIC18F - Parameterübergabe


von bastler (Gast)


Lesenswert?

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?

von Stampede (Gast)


Lesenswert?

>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.

von Udo S. (urschmitt)


Lesenswert?

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

von bastler (Gast)


Lesenswert?

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?

von bastler (Gast)


Lesenswert?

also hab jetzt gesehen das 0x2F5E an der Adresse steht die der Variable 
wBaudrate gehört. aber wohin schreibe ich dann die 19200?

von Der Rächer der Transistormorde (Gast)


Lesenswert?

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.

von spontan (Gast)


Lesenswert?

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?

von Peter D. (peda)


Lesenswert?

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

von Der Rächer der Transistormorde (Gast)


Lesenswert?

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.

von K. D. (deka)


Lesenswert?

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
Noch kein Account? Hier anmelden.