www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik #define Problem


Autor: royw (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo ihr Fachmänner/frauen,

ich habe ein Problem mit einer #define Zeile ...

Ich habe folgende Zeilen :
#define IS_PQ_TQUOT()      (RAM_EE.T1.StrgAllg & (stProcess_Quelle_0 + stProcess_Quelle_1) == 0x00)
#define IS_PQ_TSNGL()      (RAM_EE.T1.StrgAllg & (stProcess_Quelle_0 + stProcess_Quelle_1) == stProcess_Quelle_0)
#define IS_PQ_ATTENUATION()  (RAM_EE.T1.StrgAllg & (stProcess_Quelle_0 + stProcess_Quelle_1) == stProcess_Quelle_1)

Nun möchte ich diese defines in meinem Quellcode benutzen z.B. so :
if IS_PQ_TQUOT      val = RAM.iTempTop; else
if IS_PQ_TSNGL      val = RAM.iTempQuot; else
if IS_PQ_ATTENUATION  val = RAM.iAttenuation;

Leider funktioniert das nicht :-(

Nur Warum nicht ?

der Compiler macht denn daraus folgende Zeilen in Assembler :
        C$L32:
0x91cc:   430F                      CLR.W   R15
0x91ce:   930F                      TST.W   R15
0x91d0:   2404                      JEQ     (C$L33)
0x91d2:   4291       0214 0004      MOV.W   &0x0214,0x0004(SP)
0x91d8:   3C0B                      JMP     (C$L35)
        C$L33:
0x91da:   930F                      TST.W   R15
0x91dc:   2404                      JEQ     (C$L34)
0x91de:   4291       020E 0004      MOV.W   &0x020e,0x0004(SP)
0x91e4:   3C05                      JMP     (C$L35)
        C$L34:
0x91e6:   930F                      TST.W   R15
0x91e8:   2403                      JEQ     (C$L35)
0x91ea:   4291       0216 0004      MOV.W   &0x0216,0x0004(SP)

Was natürlich Schwachsinn ist da er bevor vergleicht das R15 erstmal 
löscht ?!

Hat da einer einen Rat für mich was ic hfalsch mache ?

Compiler ist der CCE 3.1 von Ti

Danke schonmal für eure Hilfe

Roy

Autor: royw (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
die () hinter den define Namen bitte wegdenken ! Die waren nur ein Test 
...

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
laut C Definition, wird

   A & B == C

als

   A & ( B == C )

angesehen und nicht, wie man vermuten könnte, als

  ( A & B ) == C

Daher: zusätzliche Klammern einfügen
#define IS_PQ_TQUOT      ((RAM_EE.T1.StrgAllg & (stProcess_Quelle_0 + stProcess_Quelle_1)) == 0x00)

> Nur Warum nicht ?
Operator Precedence Table studieren
http://www.difranco.net/cop2220/op-prec.htm
Je weiter oben ein Operator in dieser Tabelle steht, desto stärker 
bindet er. Da sind ein paar böse Fallen eingebaut. Eine davon hast du 
jetzt gerade in Aktion bemerkt.

if IS_PQ_TQUOT      val = RAM.iTempTop; else
Schreib das nicht so. Sieht für jeden C Kenner seltsam aus und man denkt 
sofort, da passiert irgendetwas Magisches
if ( IS_PQ_TQUOT )      val = RAM.iTempTop; else

Auch das else da hinten ist leicht zu übersehen. Bau dir nicht selbst 
Lesefallen in den Code ein, wenn es nicht sein muss
  if      ( IS_PQ_TQUOT )       val = RAM.iTempTop;
  else if ( IS_PQ_TSNGL )       val = RAM.iTempQuot;
  else if ( IS_PQ_ATTENUATION ) val = RAM.iAttenuation;

Autor: royw (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank , jetzt funktionierts .

Roy

Autor: vlad (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Auch erhöht es die lesbarkeit, wenn man solche sachen an sich klammert, 
auch, wenn man sich hundertprozentig sicher ist.

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.