Präprozessorbefehle des CC5X Compilers

Include-Anweisungen

#include <inline.h>

Die Include-Anweisung fügt den Inhalt der angegebenen Datei in den Quellcode ein.
Ist der Name wie im obigen Beispiel in spitze Klammern gesetzt, wird nur das Verzeichnis nach dieser Datei durchsucht, das bei der Installation des Compilers als Include-Verzeichnis angegeben wurde. Dies wird für die mit dem Compiler mitgelieferten Include-Dateien benötigt.
Wird der Name in doppelten Hochkommata angegeben, wird zuerst das aktuelle Verzeichnis und danach das Systemverzeichnis durchsucht. Dies wird ausgenutzt, um ein Programm modular zu compilieren und dazu entsprechende Include-Dateien anlegen zu können.


Konstanten bei C Compiler

Man kann in C Konstanten definieren. Bei Übersetzung wird Name der Konstante durch Wert ersetzt. z.B.

define Direktive
Mit der define - Direktive lassen sich einem Namen Zahlenwerte oder ganze Makros zuordnen.
· Namen einen Wert zuordnen:

#define MyWert 0x22

Der Compiler ersetzt MyWert im Programm durch den Hexwert 22


· Namen ein Makro zuordnen:
#define OutJ PORTB=0x55;

Der Compiler ersetzt OutJ durch nach dem Leerzeichen stehenden Direktiven.

/* Als Makrodefinition */
#define Taste0 PORTD &=0x01;
#define Led3On PORTJ |=0x04;

#define LCDCS_ON() { NOP; NOP; lcdport|=LCD_CS; PORTQ=lcdport; }
#define Wait() Delay1ms(10);


Bedingte Übersetzung (Bedingte Compilierung)

Präprozessorbefehl Funktion, Bedeutung
#define Makros definieren
#if Bedingte Compilierung, wenn Bedingung zutrifft
#else else-Zweig einer #if...-Anweisung
#endif Abschluß einer #if-Anweisung
#elif else...if-Zweig einer #if...-Anweisung
#error Fehlermeldung ausgeben
#ifdef Bedingte Compilierung, wenn ein Makro definiert ist
#ifndef Bedingte Compilierung, wenn ein Makro nicht definiert ist
#undef Makro-Definition entfernen
#include Zusätzliche Quelltexte aufnehmen

Dank Compilerschalter ist es möglich sehr portable Programme zu schreiben.
Einen Compilerschalter definiert man so:

#define KOMPILERSCHALTER

also fast wie eine Konstante, nur das der Wert fehlt. Der Compiler erkennt das, und betrachtet
dieses Konstrukt nun als Kompilerschalter. Der Name des Compilerschalters ist im obigen
Beispiel KOMPILERSCHALTER
Mit #define KOMPILERSCHALTER setzt (wichtig) man einen Compilerschalter. Man kann Compiler-
schalter auch zum "Aussetzen bewegen" (also löschen).
Das macht man mit #undef
z.B
#undef KOMPILERSCHALTER
setzt den Compilerschalter KOMPILERSCHALTER auser Kraft.

Außer den beiden Befehlen zum Setzen und Löschen des Compilerschalters gibt es auch
Befehle, mit denen man den Stand des Compilerschalter abfragen (und darauf entsprechend
reagieren) kann.

Eine solche Anweisung (an den Compiler) ist #ifdef.
Das läuft so ab:
#ifdef KOMPILERSCHALTER
...
...
...
#endif

Dieses Konstrukt prüft nun ob KOMPILERSCHALTER gesetzt ist. Wenn ja, werden die Anweisungen
ausgeführt, die zwischen #ifdef und #endif stehen. (Hier kann man Konstanten usw definieren).
Wichtig ist, dass nach einen #ifdef auch wieder ein #endif folgen muss.

Außerdem gibt es analog zu #ifdef eine Routine, mit der es möglich ist, zu Prüfen, ob ein
Compilerschalter nicht gesetzt ist. Diese Routine nennt sich #ifndef, und Prüft ob der
entsprechende Compilerschalter NICHT gesetzt ist. z.B
#ifndef KOMPILERSCHALTER
...
mach das und das
...
#endif

Ok, es wird Zeit, dass wir nun sehen, wie man das in der Praxis anwendet.
Bsp:

// 4 MHz
#include <C:\cc5\16F84.H>
#define Schalter //Den Compilerschalter "Schalter" setzen
void main(void) { TRISB = 0b.1111.1111;
#ifdef Schalter // Prüfen ob Schalter gesetzt ist, und wenn ja PORTA=0x1; // die Operationen ausführen PORTB=PORTA; #else // Sonst PORTA=0xFF; // die Operationen ausführen PORTB=0x00; #endif
while(1); }

Wenn Zeile "#define Schalter" da ist werden
PORTA=0x1;
PORTB=PORTA;
Operationen ausgeführt.

Wenn Zeile "#define Schalter" gelöscht ist werden
PORTA=0xFF;
PORTB=0x00;
Operationen ausgeführt.

In dem Beispiel wird Compilerschalter und Makro - Zuweisung eingesetzt.

// 4 MHz #include <C:\cc5\16F84.H>
#define Zuw PORTB=0x55; // Den Compilerschalter Zuw setzen und Makro zuordnen
void main(void) { TRISB = 0b.1111.1111; #ifdef Zuw // Prüfen ob Zuw gesetzt ist, und wenn ja Zuw // Makro einsetzen #else // sonst PORTA=0xAA; // Dieser Befehl einsetzen #endif while(1); }

Damit lassen sich ganze Programmteile ein- und ausschalten.
Oder Programme erstellen die für Verschiedene PIC-Typen verwendbar sind.

< Zur Startseite