Forum: Compiler & IDEs Präprozessor #if Problem


von Marcus Maul (Gast)


Lesenswert?

Hallo Leute,

der folgende Code arbeitet auf dem IAR-Compiler problemlos, wird aber
anscheinend von dem avr-gcc nicht verstanden.

IAAR:
Char receiveed @ 15;

gcc:
#define received _SFR_IO8(0x15);

Ist diese Aussage wirklich identisch?
Eine Besonderheit des Tiny26 ist, das man dieses Register direkt
auslesen muß und es nicht gepuffert wird.

Bei den Präprozessordirektiven funktionieren anscheinend die folgenden
Definitionen so einfach nicht. TIMER0_SEED0 hat immer den Wert 251,
egal was ich für System_Clock und Baudrate einträge.

#define USI_COUNTER_MAX_COUNT     16
#define USI_COUNTER_SEED_TRANSMIT (USI_COUNTER_MAX_COUNT - HALF_FRAME)
#define INTERRUPT_STARTUP_DELAY   (0x11 / TIMER_PRESCALER)
#define TIMER0_SEED               (256 - ( (SYSTEM_CLOCK / BAUDRATE) /
TIMER_PRESCALER ))

#if ( (( (SYSTEM_CLOCK / BAUDRATE) / TIMER_PRESCALER ) * 3/2) > (256 -
INTERRUPT_STARTUP_DELAY) )
    #define INITIAL_TIMER0_SEED       ( 256 - (( (SYSTEM_CLOCK /
BAUDRATE) / TIMER_PRESCALER ) * 1/2) )
    #define USI_COUNTER_SEED_RECEIVE  ( USI_COUNTER_MAX_COUNT -
(START_BIT + DATA_BITS) )
#else
    #define INITIAL_TIMER0_SEED       ( 256 - (( (SYSTEM_CLOCK /
BAUDRATE) / TIMER_PRESCALER ) * 3/2) )
    #define USI_COUNTER_SEED_RECEIVE  (USI_COUNTER_MAX_COUNT -
DATA_BITS)
#endif

#define UART_RX_BUFFER_MASK ( UART_RX_BUFFER_SIZE - 1 )
#if ( UART_RX_BUFFER_SIZE & UART_RX_BUFFER_MASK )
    #error RX buffer size is not a power of 2
#endif

Danke für Eure Hilfe !!

Gruß

von Jörg Wunsch (Gast)


Lesenswert?

> Char receiveed @ 15;

Keine Ahnung, was das beim IAR macht.

> #define received _SFR_IO8(0x15);

Ich denke, daß Du zumindest 15 vs. 0x15 vermasselt hast.

Warum muß man das eigentlich so umständlich machen, warum kannst Du
nicht einfach USIDR benutzen, wie's in der Headerdatei deklariert
ist?

> Eine Besonderheit des Tiny26 ist, das man dieses Register direkt
> auslesen muß und es nicht gepuffert wird.

Das ist dem Compiler doch aber wurscht.

> #define INTERRUPT_STARTUP_DELAY ...

Das mußt Du vermutlich anpassen.  Sieht mir so aus, als hätte da
jemand den Overhead des Prologs der ISR manuell ausgezählt und
hinterlegt.

Die anderen #defines sind erstens so gruselig umgebrochen, daß man sie
nicht mehr durch den CPP ziehen kann, außerdem fehlt die Hälfte.
Bedenke, daß Du u. U. die Konstanten als unsigned long deklarieren
mußt (...UL), damit die Präprozessorarithmetik wie gewünscht
funktioniert.

von Marcus Maul (Gast)


Lesenswert?

Hallo Jörg,

erstmal Danke für Deine Antwort und Deine Hilfe!

Sobald ich hier meine geätzte Platine durchgemessen habe, gebe ich mich
an Deine Vorschläge.

Wer das so verbockt hat?
Leute, die den IAR auswendig kenne und meinten die Appnote 307 zu
schreiben.

Mein Versuch USIDR zu benutzen half leider nicht.
Warscheinlich darf ich den ganzen Kram selbst neu "verbrechen", damit
funktioniert. ist mir bei dem LCD und dem Interrupt Beispielen auch so
gegangen. Der meiste App Code funktioniert leider nichtmal mit dem IAR
auf dem tiny26. Viele Sachen dürfen anscheinend nicht umkopiert
werden.

Meld mich, sobald ich wieder ein paar Schritte weiter bin

Danke Marcus

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.