Forum: Mikrocontroller und Digitale Elektronik Frage zu Assembler Preprocessor directives


von Chris (Gast)


Lesenswert?

Hallo!

Ich habe dem AVR-Tutorial ein Codeschnipsel entnommen um mir vom 
Assembler den Wert für UBRR0 bei gegebener Taktfrequenz und Baudrate 
berechnen zu lassen. Ist der Baudratenfehler zu hoch, so wird mit einer 
Fehlermeldung abgebrochen. Ansonsten soll der Wert für UBRR0 ausgegeben 
werden. Hier das Minimalbeispiel:
1
#include <m88PAdef.inc>             ;Definitionsdatei ATMega88PA
2
3
        #define XTAL 8000000        ;Systemtakt 8 MHz
4
        #define BAUD 9600           ;Baudrate
5
6
        ;Berechnungen für Baudratenfehler
7
        #define UBRR0_VAL   ((XTAL+BAUD*8)/(BAUD*16)-1)     ;Gerundeter Wert für UBBR0
8
        #define BAUD_REAL   (XTAL/(16*(UBRR0_VAL+1)))       ;Reale Baudrate
9
        #define BAUD_ERROR  ((BAUD_REAL*1000)/BAUD-1000)    ;Fehler in Promille
10
 
11
        #if ((BAUD_ERROR > 10) || (BAUD_ERROR < -10))       ;Max. +/-10 Promille, sonst Fehlermeldung
12
            #error "Fehler bei Baudrate grösser 1 Prozent!"
13
        #else
14
            #message "UBBR0 = " UBRR0_VAL
15
        #endif
16
17
18
        .CSEG
19
        nop

Als Ausgabe erfolgt:
test.asm(14): UBBR0 =  ( ( 8000000 + 9600 * 8 ) / ( 9600 * 16 ) - 1 )

Wie bekomme ich es hin, dass dieser Term fertig ausgerechnet dort 
erscheint? Es wäre schön wenn mir hier jemand weiterhelfen kann!

Viele Grüße, Chris

von Andreas F. (aferber)


Lesenswert?

Chris schrieb:
> Wie bekomme ich es hin, dass dieser Term fertig ausgerechnet dort
> erscheint?

Geht nicht. Der Präprozessor wertet arithmetische Ausdrücke 
ausschliesslich in der #if-Bedingung aus, dort kannst du das Ergebnis 
aber nicht einem Makro zuweisen. Makros sind im Endeffekt reine 
Textersetzungen.

Andreas

von Chris (Gast)


Lesenswert?

Danke für die Antwort! Schade, ich dachte es wäre vielleicht irgendwie 
möglich für die Ausgabe ebenfalls eine Auswertung des Terms zu 
erreichen. Schließlich geschieht dies auch in der if-Anweisung und man 
kann den Wert auch später im Programm dem entsprechenden Register 
zuweisen.

von Nobody (Gast)


Lesenswert?

Naja, die Frage wäre wozu Du den Wert brauchst. An sich ist der konkrete 
Wert völlig irrelevant für den Leser.

von Nobody (Gast)


Lesenswert?

Wenn es darum geht Deine Neugierde zu befriedigen, dann schau im 
Assemblerlisting nach.

von Chris (Gast)


Lesenswert?

Nobody schrieb:
> Naja, die Frage wäre wozu Du den Wert brauchst. An sich ist der konkrete
> Wert völlig irrelevant für den Leser.

Ich hätte den Wert (der ja später UBRR0 zugewiesen wird) bei der 
Assemblierung einfach gerne gesehen. Quasi zur Kontrolle oder als 
zusätzliche Information. Das ist natürlich nicht so wichtig, aber es 
wäre halt ganz nett gewesen.

Nobody schrieb:
> Wenn es darum geht Deine Neugierde zu befriedigen, dann schau im
> Assemblerlisting nach.

Ja, das geht natürlich auch :-)


Danke!

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.