www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Frage zu Assembler Preprocessor directives


Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
#include <m88PAdef.inc>             ;Definitionsdatei ATMega88PA

        #define XTAL 8000000        ;Systemtakt 8 MHz
        #define BAUD 9600           ;Baudrate

        ;Berechnungen für Baudratenfehler
        #define UBRR0_VAL   ((XTAL+BAUD*8)/(BAUD*16)-1)     ;Gerundeter Wert für UBBR0
        #define BAUD_REAL   (XTAL/(16*(UBRR0_VAL+1)))       ;Reale Baudrate
        #define BAUD_ERROR  ((BAUD_REAL*1000)/BAUD-1000)    ;Fehler in Promille
 
        #if ((BAUD_ERROR > 10) || (BAUD_ERROR < -10))       ;Max. +/-10 Promille, sonst Fehlermeldung
            #error "Fehler bei Baudrate grösser 1 Prozent!"
        #else
            #message "UBBR0 = " UBRR0_VAL
        #endif


        .CSEG
        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

Autor: Andreas Ferber (aferber)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Nobody (Gast)
Datum:

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

Autor: Nobody (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn es darum geht Deine Neugierde zu befriedigen, dann schau im 
Assemblerlisting nach.

Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

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.