Arithmetik und Typen im Preprozessor



  • folgende Definitionen

    #define CARRIER 0x1000
    #define NULLNULL ((0.2*CARRIER) <<16) | (0.8*CARRIER)) // Klammern zuviel ?
    ...

    sollen in ein Feld eingetragen werden

    uint32_t PWM_Buffer[] = {NULLNULL, NULLNULL ....

    Ein Hexdump vom PWM_Buffer sollte dann (bei little endian) anzeigen:

    02 00 08 00 02 00 08 00 usw...

    Die Daten werden dann per DMA vom Ram an die Peripherie übertragen.
    CARRIER wird ebenfalls als 16 bit Variable benutzt.
    Einen Union habe ich bislang nicht benutzt.
    Warum ist der define falsch? GCC meldet dabei
    error: invalid operands to binary << (have 'double' and 'int')

    Wenn ich ein 16 bit breiten Integer um 16 bit nach links schiebe, gibt das 32 bit mit Inhalt im Highwort. Dazu wird das Lowwort dazu verodert was die Absicht vom define gewesen ist.



  • Das Ergebnis von (0.2*CARRIER) ist ein double-Wert, und du willst ihn um 16 Stellen nach links shiften. double kannst du aber nicht bitshiften.



  • _matze schrieb:

    Das Ergebnis von (0.2*CARRIER) ist ein double-Wert, und du willst ihn um 16 Stellen nach links shiften. double kannst du aber nicht bitshiften.

    ^^deshalb mach ((CARRIER/5) <<16) | (4CARRIER/5))* daraus. vielleicht passt das ja.
    🙂


Anmelden zum Antworten