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

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.