PIC18F - Parameterübergabe

Gast #2846876
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?
Gast #2846893
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.
Gast #2846993
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.
#2847006
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
Gast #2847008
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.
#2847042
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren