AVR GCC Präprozessor #if funktioniert nicht !

Gast #2385099
Hallo Community, ich versuche momentan meine Bibliotheken von AVR.ASM
an AVR GCC anzupassen. Doch leider funtionier die Präprozessoranweisung 
#if
nicht wirklich.

Funktionierender ASM Code:
1
.equ  LCD_Data_Port = PORTA
2

3
.if (LCD_Data_Port == PORTA)
4
  .equ    LCD_Data_DDR  = DDRA
5
.endif

Nicht funktionierende C Portierung:
#define LCD_Data_Port PORTA
1
#if (LCD_Data_Port == PORTA)    
2
#define   LCD_Data_DDR     DDRA        
3
#endif

Nach über 5 Stunden experementieren gebe ich mich geschlagen. Bitte um 
hilfe.
Gast
Den AVR-GCC hab ich gerade nicht parat, aber ich vermute mal der 
Präprozessor ist dem x86-GCC ähnlich und mit letzterem gibt es keine 
Probleme... Erzähl mal genauer was da nicht geht.
Gast
@ A. K.
der selben Meinung bin ich auch,
wenn LCD_Data_Port eine Zahl währe und PORTA auch, dann täte es gehen,
quasi so:
1
#define LCD_Data_Port 1
2
#define PORTA 1
3

4
#if (LCD_Data_Port == PORTA)    
5
#define   LCD_Data_DDR     DDRA        
6
#endif
 Das WILL ICH ABER NICHT !

Denn ich möchte dass im LCD Treiber alle weiteren Konfigurationen
automatisch ausgewählt werden.

Quasi SO:
1
#define LCD_Data_Port PORTA  // LCD PORT für Pins (DB4-DB7) festlegen
2

3
#if (LCD_Data_Port == PORTA)    
4
#define   LCD_Data_DDR     DDRA   
5
#define   LCD_Data_Pin      PINA        
6
#endif
Gast
@A.K
Wow auf so eine geniale Lösung währe ich Lebtag nicht gekommen.
Aber ich hoffe es verstanden zu haben, falls nicht bitte korrigieren.

1) Glue setzt quasi string "a" und "b" lückenlos zusammen.
1
#define GLUE(a, b)      a##b

2) Das Makro "PORT(x)" wird im Code durch  "GLUE(PORT, x)"
Und da der text "PORT",bereits vorhanden ist bleibt nur noch der
Platzhalter "x" übrig.
1
#define PORT(x)         GLUE(PORT, x)

3) An dieser Stelle wird im Code überall wo "LCD_PORT" vorkommt
durch "A" ersetzt.
#define LCD_PORT        A

4) Und im letzten Schritt wird quasi der Platzhalter "x"
durch "LCD_PORT" ersetzt, in unseren Fall durch "A"
1
#define LCD_PORT_DATA   PORT(LCD_PORT)
Gast
Wäre ifdef nicht auch ein Weg gewesen? Bei mehrach vorhandenen defines 
wird mit Fehler abgebrochen und ein fehlendes define könnte man mit 
ifndef abfangen...
Gast
@ walder
klar #ifndef kann auch sehr nützlich sein.
Ich verwende es bei der definition meiner LCD- Datenleitungen
1
#ifndef    HD44780_DB4
2
#define    HD44780_DB4     4      // Datenleitung
3
#endif
4

5
#ifndef    HD44780_DB5
6
#define    HD44780_DB5  5      // Datenleitung
7
#endif

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 15 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.