www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik C18 Berechnungen


Autor: Andreas Riegebauer (blackpuma)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Guten Abend!

Ich habe heute 2 Fragen:

Ich habe folgende Formel: ( 5000000/48000000 ) * 0xFFFFFFFF.

Wie kann ich diese in C18 umsetzten? Ich weiß nicht was passiert wenn 
ich eine Division im uC rechne bei der eine Kommazahl raus kommt. Das 
Ergebnis wird an einen AD9834 übertragen. Was mich auch gleich zu meiner 
zweiten Frage bringt.

Wie kann ich das Ergebnis in 4 Variablen teilen um es mit SPI an meinen 
Chip übertragen zu können?

Danke schon mal
Andreas

Autor: Anja (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Andreas Riegebauer schrieb:
> Ich habe folgende Formel: ( 5000000/48000000 ) * 0xFFFFFFFF.

kann man auch einfacher schreiben  0 * 0xFFFFFFFF.
Die Division wird zu "0" abgerundet.

Ich würde wie folgt schreiben: (eventuell noch Rundungsoffset addieren)

(int64_t) 5000000 * (int64_t) 0xFFFFFFFF / 48000000

Das zerlegen in Bytes geht dann mit byte-pointer oder variantem record

Gruß Anja

Autor: Andreas Riegebauer (blackpuma)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also ich habe für das erste Problem eine Lösung gefunden.
Eine kurze Erklärung dazu:
Die Division von 0xFFFFFFFF / 48000000 ist ja ein Konstanter Wert. Den 
habe ich in 5 Teile zerlegt. Jeder einzelne Teil wird mit der 
eingestellten Frequenz multipliziert. Dann werden die einzelnen Werte 
dividiert um das Komma zu setzten. Jetzt noch addieren und fertig.
void set_new_frequ( void )
{
unsigned double f1 = 89, f2 = 47, f3 = 84, f4 = 85, f5 = 31, fges = 0;

// Umrechnen der Frequenz
f1 *= frequ;
f2 *= frequ;
f3 *= frequ;
f4 *= frequ;
f5 *= frequ;

f2 /= 100;
f3 /= 10000;
f4 /= 1000000;
f5 /= 100000000;

fges = f1 + f2 + f3 + f4 + f5;

Frequenz._word = fges;
}


Mein zweites Problem habe ich noch. Ich habe mit union was gebaut 
allerdings bekomme ich nicht das richtige heraus.
typedef unsigned char      byte;           // 8-bit
typedef unsigned double    word;           // 16-bit

union _WORD
{
    word _word;
    struct
    {
        byte HMSB;
    byte LMSB;
    byte HLSB;
        byte LLSB;
    };
} Frequenz;

Ausgelesen werden die Werte so:
.
.
Frequenz._word = fges;
.
.
WriteSPI( Frequenz.HMSB );
// Write other 8 Frequency bits to Register 88 L MSB
WriteSPI( 0x22 );
WriteSPI( Frequenz.LMSB );
// Write other 8 Frequency bits to Register 88 H LSB
WriteSPI( 0x31 );
WriteSPI( Frequenz.HLSB );
// Write other 8 Frequency bits to Register 40 L LSB
WriteSPI( 0x20 );
WriteSPI( Frequenz.LLSB );
.
.

Leider bekomme ich nicht die richtigen Werte heraus. Mit einer 
Testfrequenz von 12630 Hz steht in der Variable bzw. dem union 1130113 
dez drinnen. das bedeutet es sollte in den Bytes doch 0x00, 0x11, 0x3E 
und 0x81 stehen. Leider kommt dort aber irgendwas heraus.

Könnt ihr das bitte durchsehen und mir sagen was da nicht funktioniert?

BG
Andreas

Autor: Andreas Riegebauer (blackpuma)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Guten Abend!

ich habe die Lösung gefunden. Es waren 2 Probleme. Einmal waren die Bits 
in der falschen Reihenfolge geschrieben und dann habe ich double durch 
long int ersetzt. Kann mir jemand erklären wieso das mit long int 
funktioniert und mit double nicht?
typedef unsigned char      byte;           // 8-bit
typedef unsigned long int    word;           // 16-bit

union _WORD
{
    word _word;
    struct
    {
        byte LLSB;
        byte LMSB;
        byte LMSB;
        byte HMSB;
    };
} Frequenz;

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.