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.