Problem mit C18 Compiler

Gast #2937984
Lesenswert?

Hallo zusammen,

ich habe beim kompilieren meines Programms für einen PIC18F26K20
mit dem C18 Compiler V3.40 von Microchip ein Problem.

Als IDE verwende ich MPLAB X IDE v1.41 .

Und zwar bekomme ich beim kompilieren folgende Fehlermeldungen:
1
make -f nbproject/Makefile-default.mk SUBPROJECTS= .build-conf
2
make[1]: Entering directory `C:/Dokumente und Einstellungen/Tobias/MPLABXProjects/Funknetzwerk'
3
make  -f nbproject/Makefile-default.mk dist/default/production/Funknetzwerk.production.hex
4
make[2]: Entering directory `C:/Dokumente und Einstellungen/Tobias/MPLABXProjects/Funknetzwerk'
5
"C:\Programme\Microchip\mplabc18\v3.40\bin\mcc18.exe"  -p18F26K20 -ms -oa-  -I "C:\Programme\Microchip\mplabc18\v3.40\bin"\\..\\h  -fo build/default/production/netzwerk.o   netzwerk.c 
6
make[2]: Leaving directory `C:/Dokumente und Einstellungen/Tobias/MPLABXProjects/Funknetzwerk'
7
make[2]: *** [build/default/production/netzwerk.o] Error 3
8
make[1]: Leaving directory `C:/Dokumente und Einstellungen/Tobias/MPLABXProjects/Funknetzwerk'
9
make[1]: *** [.build-conf] Error 2
10
make: *** [.build-impl] Error 2
11

12
BUILD FAILED (exit value 2, total time: 1m 9s)

Die Codezeile an der er sich stört ist die folgende:
1
   if(ADRESSE_NACHFOLGER == 0x00)
2
   {
3
        ...
4
   }

dabei ist ADRESSE_NACHFOLGER in der zugehörigen Header-Datei wie folgt 
deklariert:
1
#define ADRESSE_NACHFOLGER  0x03    //0x00 = kein Nachfolger
Schreibe ich stattdessen:
1
   if(1)
2
   {
3
        ...
4
   }

dann kompiliert er alles ohne Fehlermeldungen oder Warnungen!

Wäre echt nett, wenn ihr mir helfen könntet

Danke schon mal im Voraus für eure Antwort!

MfG Elko4
#2937991
Lesenswert?

Elko4 schrieb:

> make[2]: Entering directory `C:/Dokumente und
> Einstellungen/Tobias/MPLABXProjects/Funknetzwerk'
> "C:\Programme\Microchip\mplabc18\v3.40\bin\mcc18.exe"  -p18F26K20 -ms
> -oa-  -I "C:\Programme\Microchip\mplabc18\v3.40\bin"\\..\\h  -fo
> build/default/production/netzwerk.o   netzwerk.c
> make[2]: Leaving directory `C:/Dokumente und
> Einstellungen/Tobias/MPLABXProjects/Funknetzwerk'
> make[2]: *** [build/default/production/netzwerk.o] Error 3


> Die Codezeile an der er sich stört ist die folgende:
>
>
1
>    if(ADRESSE_NACHFOLGER == 0x00)
2
>    {
3
>         ...
4
>    }
5
>

Ich kann irgendwie die Fehlermeldung nicht ausmachen.
Ich sehe zwar in deinem Log, dass der COmpiler an Make offenbar einen 
Fehler gemeldet hat, aber nicht welchen.
Das wäre wichtig zu wissen, damit man weiß in welche Richtung überlegt 
werden muss

>
> dabei ist ADRESSE_NACHFOLGER in der zugehörigen Header-Datei wie folgt
> deklariert:
>
1
> #define ADRESSE_NACHFOLGER  0x03    //0x00 = kein Nachfolger
2
>

Da ist so gesehen auch ok.
Wenn also dieses Header File includiert wird, sehe ich erst mal nichts 
was einen Fehler verursachen könnte.
Gast #2938021
Lesenswert?

Um sicher zu gehen, dass es an der oben genannten Code-Zeile liegt, habe 
ich das nachfolgende Testprogramm geschrieben.
1
#include <p18f26k20.h>
2

3
#define ADRESSE_NACHFOLGER 0x03
4

5
void main(void)
6
{
7
    unsigned char i=0;
8

9
    while(1)
10
    {
11
        if(ADRESSE_NACHFOLGER == 0x00)
12
        {
13
            i=5;    //irgendwas tun...
14
        }
15
    }
16
}

Dabei tritt das gleiche Problem auf:
1
make -f nbproject/Makefile-default.mk SUBPROJECTS= .build-conf
2
make[1]: Entering directory `C:/Dokumente und Einstellungen/Tobias/MPLABXProjects/Funknetzwerk'
3
make  -f nbproject/Makefile-default.mk dist/default/production/Funknetzwerk.production.hex
4
make[2]: Entering directory `C:/Dokumente und Einstellungen/Tobias/MPLABXProjects/Funknetzwerk'
5
"C:\Programme\Microchip\mplabc18\v3.40\bin\mcc18.exe"  -p18F26K20 -ms -oa-  -I "C:\Programme\Microchip\mplabc18\v3.40\bin"\\..\\h  -fo build/default/production/netzwerk.o   netzwerk.c 
6
make[2]: Leaving directory `C:/Dokumente und Einstellungen/Tobias/MPLABXProjects/Funknetzwerk'
7
make[1]: Leaving directory `C:/Dokumente und Einstellungen/Tobias/MPLABXProjects/Funknetzwerk'
8
make[2]: *** [build/default/production/netzwerk.o] Error 3
9
make[1]: *** [.build-conf] Error 2
10
make: *** [.build-impl] Error 2
11

12
BUILD FAILED (exit value 2, total time: 1m 21s)
Gast #2938033
Lesenswert?

Sry, hab das andere Programm kompiliert!

Das Testprogramm lässt sich kompilieren!

Allerdings verstehe ich dann nicht warum die gleiche Zeile im 
eigentlichen Programm Probleme macht?



Hier die beiden dateien netzwerk.c und netzwerk.h, die If-Anweisung ist 
in der case-Verzweigung in der Funtion Process():
1
/**************************************************************************//**
2
* \file         netzwerk.c
3
*
4
* \author       Tobias Mueller
5
* \date         13.11.2012
6
* \version      0.1
7
*
8
* \brief        Routinen zum Verwenden des Funknetzwerks
9
* \details      -
10
******************************************************************************/
11

12
/** H E A D E R  D A T E I E N ***********************************************/
13
#include "netzwerk.h"
14
#include "eusart.h"
15
#include "XBEE.h"
16
#include "delay.h"
17
#include "definitions.h"
18
#include "lcd-routines.h"
19

20
/** S Y M B O L I S C H E  K O N S T A N T E N *******************************/
21

22
/** G L O B A L E  V A R I A B L E N *****************************************/
23
volatile unsigned char lampen_modus = 0;    //0=Normal, 1=Synchronisation, 2=Wartungsmodus
24

25
#pragma code
26
/** F U N K T I O N S  D E K L A R A T I O N E N *****************************/
27

28
/**************************************************************************//**
29
* \brief        Sendet eine Nachricht an eine benachbarte Lampe
30
* \details      -
31
* \param[in]    unsigned char   ziel            Adresse des XBEE-Moduls/ der benachbaten Lampe
32
* \param[in]    unsigned char   kommando        Kommando_ID zur Interpraetation der Daten
33
* \param[in]    unsigned char*  daten           Daten die gesendet werden sollen
34
* \param[in]    unsigned char   daten_laenge    Anzahl der Datenbytes
35
* \param[out]   unsigned char   0=Erfolg, 1=kein XBEE-AKN, 2=CCA Fehler,
36
* \n                            4=Timeout XBEE-AKN, 5=Timeout Lampen-AKN, 6=Daten zu groß
37
******************************************************************************/
38
unsigned char Transmit( unsigned char ziel, unsigned char kommando_id,
39
                        unsigned char nachricht_id, unsigned char *daten, unsigned char daten_laenge)
40
{
41
    unsigned char i;
42
    unsigned char nachricht[MAX_NACHRICHTEN_LAENGE+3];
43

44
    //Zu viele Daten ?
45
    if(daten_laenge >= MAX_NACHRICHTEN_LAENGE )
46
    {
47
        return 6;   //Fehler
48
    }
49

50
    //AKN-Narchiten verwerfen
51
    xbee_akn_complete = 0;
52
    lampen_akn_complete = 0;
53

54
    //zusammenstellen der Nachricht
55
    nachricht[0] = kommando_id;
56
    nachricht[1] = nachricht_id;
57
    nachricht[2] = daten_laenge;
58
    
59
    for(i = 0; i < daten_laenge; i++)
60
    {
61
        nachricht[i+3] = daten[i];
62
    }
63
    //Nachricht senden
64
    XBEE_TX(ziel, 0x01, nachricht, (daten_laenge + 3)  );
65

66
    //Auf AKN von XBEE-Modul warten (max. 500ms )
67
    for(i = 0; (xbee_akn_complete != 1) && (i<50); i++)
68
    {
69
        _delay_ms(10);
70
    }
71
    //AKN von XBEE-Modul empfangen?
72
    if( xbee_akn_complete == 1)
73
    {
74
        INTCONbits.GIEH = 0;                                //Alle Interupts AUS
75

76
        //A C H T U N G : Ueberprüfung auf die richtige Frame ID fehlt
77
        //-> es wird immer nur eine Nachricht nach der anderen gesendet!
78

79
        xbee_akn_complete = 0;  //AKN wurde verarbeitet
80
        i = xbee_akn;           //xbee_akn zwischenspeichern -> Interrupts EIN
81

82
        INTCONbits.GIEH = 1;                                //Alle Interupts wieder Ein
83
        //AKN erfoglreich?
84
        if(i > 0)
85
        {
86
            return i;  //Fehler bei der Datenuebertragung zw. XBEE-Modulen
87
        }      
88
    }
89
    //Nach 500ms keine XBEE-AKN-Nachricht empfangen -> Fehler!
90
    else
91
    {
92
        return 4; 
93
    }
94

95
    //Auf Bestaetigungsnachricht warten (max. 500ms)
96
    for(i = 0; (lampen_akn_complete != 1) && (i<50); i++)
97
    {
98
        _delay_ms(10);
99
    }
100

101
    //Bestaetigungsnachricht empfangen?
102
    if( lampen_akn_complete == 1)
103
    {
104
        INTCONbits.GIEH = 0;                                //Alle Interupts AUS
105

106
        //A C H T U N G : Ueberprüfung auf die richtige Nachrichten ID fehlt
107
        //-> es wird immer nur eine Nachricht nach der anderen gesendet!
108

109
        lampen_akn_complete = 0;    //AKN wurde verarbeitet
110
        i = lampen_akn;             //lampen_akn zwischenspeichern -> Interrupts EIN
111

112
        INTCONbits.GIEH = 1;                                //Alle Interupts wieder Ein
113

114
        return i;
115
    }
116
    //Nach 500ms keine Bestaetigungsnachricht empfangen -> Fehler
117
    else
118
    {
119
        return 5;
120
    }
121

122
    
123
}
124

125
/**************************************************************************//**
126
* \brief        Verarbeiten und weiterleiten der empfangenen Nachrichten
127
* \details      -
128
******************************************************************************/
129
void Process(void)
130
{
131
    unsigned char i;    //Zaehlvariable
132

133
    unsigned char nachricht[MAX_NACHRICHTEN_LAENGE+2];
134
    unsigned char temp_daten[MAX_NACHRICHTEN_LAENGE];
135

136
    if(API_fifo.read != API_fifo.write) //Nachricht empfangen?
137
    {
138
        BufferOut(nachricht);
139
    }
140
    else    //keine Nachricht im FIFO
141
    {
142
        return;
143
    }
144

145
    //Nachricht an eigenen Lampe adressiert!
146
    if( (nachricht[LAMPEN_ZIEL_ADRESSE] == LAMPEN_ADRESSE) || (nachricht[LAMPEN_ZIEL_ADRESSE] == LAMPEN_BROADCAST) )
147
    {
148
        //Broadcast -> Nachricht weiterleiten
149
        if(nachricht[LAMPEN_ZIEL_ADRESSE] == LAMPEN_BROADCAST)
150
        {
151
            //Kommt Nachricht von Vorgaenger -> an Nachfolger weiterleiten
152
            if(nachricht[LAMPEN_QUELL_ADRESSE] < LAMPEN_ADRESSE )
153
            {
154
                //kein Nachfolger? -> Nachricht nicht weiterleiten
155
                if(ADRESSE_NACHFOLGER != 0x00)
156
                {
157
                    //Nachricht zusammenstellen
158
                    for(i = 0; i < nachricht[NACHRICHTEN_LANEGE] ; i++)
159
                    {
160
                        temp_daten[i] = nachricht[LAMPEN_ZIEL_ADRESSE + i];
161
                    }
162

163
                    //Nachricht weiterleiten (max. 5 Versuche!)
164
                    i = 0;
165
                    while( (i < 5) && ( Transmit(ADRESSE_NACHFOLGER, nachricht[KOMMANDO_ID], 0x01, temp_daten, nachricht[NACHRICHTEN_LANEGE]) ) )
166
                    {
167
                        _delay_ms(10);
168
                        i++;
169
                    }
170
                }
171
            }
172
            //Kommt Nachricht von Nachfolger -> an Vorgaenger weiterleiten
173
            if(nachricht[LAMPEN_QUELL_ADRESSE] > LAMPEN_ADRESSE )
174
            {
175
                //kein Vorgaenger? -> Nachricht nicht weiterleiten
176
                if(ADRESSE_VORGAENGER != 0x00)
177
                {
178
                    //Nachricht zusammenstellen
179
                    for(i = 0; i < nachricht[NACHRICHTEN_LANEGE] ; i++)
180
                    {
181
                        temp_daten[i] = nachricht[LAMPEN_ZIEL_ADRESSE + i];
182
                    }
183

184
                    //Nachricht weiterleiten (max. 5 Versuche!)
185
                    i = 0;
186
                    while( (i < 5) && ( Transmit(ADRESSE_VORGAENGER, nachricht[KOMMANDO_ID], 0x01, temp_daten, nachricht[NACHRICHTEN_LANEGE]) ) )
187
                    {
188
                        _delay_ms(10);
189
                        i++;
190
                    }
191
                }
192
            }
193
        }
194

195
        //Nachricht verarbeiten
196
        switch(nachricht[KOMMANDO_ID])
197
        {
198
            case BELEUCHTUNG:
199
                if(nachricht[BELEUCHTUNGSSTAERKE] == 0xFF)
200
                {
201
                    LED_LATCH |= (1<<LED4);     //Licht Ein
202
                }
203
                else if(nachricht[BELEUCHTUNGSSTAERKE] == 0x00)
204
                {
205
                    LED_LATCH &= ~(1<<LED4);    //Licht Aus
206
                }
207
            break;
208

209
            case ANFRAGE_BETRIEBSSTATUS:
210
            break;
211

212
            case ANTWORT_BETRIEBSSTATUS:
213
            break;
214

215
            case SYNC_MODE_BETRETEN:
216

217
                //Synchronisations-Modus betreten!
218
                lampen_modus = MODUS_SYNC;
219

220
                //letzte Lampe im Netzwerk? -> Bestaetigung an Absender senden!
221
                if(ADRESSE_NACHFOLGER == 0x00)
222
                {
223
                    temp_daten[0] = nachricht[LAMPEN_QUELL_ADRESSE];    //Ziel = Absender der Broadcast nachricht
224
                    temp_daten[1] = LAMPEN_ADRESSE;                     //Absender = Eigene Adresse
225

226
                    i = 0;
227
                    while( (i < 5) && ( Transmit(nachricht[ADRESSE_VORGAENGER], AKN_SYNC_MODE, 0x01, temp_daten, 0x02 ) ) )
228
                    {
229
                        _delay_ms(10);
230
                        i++;
231
                    }
232
                }
233
                
234
            break;
235

236
            case AKN_SYNC_MODE:
237

238
                lcd_clear();
239
                lcd_string("AKN_SYNC");
240
                lcd_setcursor(0,2);
241
                lcd_string("Done!");
242

243
            break;
244

245
            case SYNC_NACHRICHT:
246
            break;
247

248
            case SYNC_MODE_BEENDET:
249

250
                //Normalen-Modus betreten!
251
                lampen_modus = MODUS_NORMAL;
252
                
253
            break;
254

255
            default:
256
                break;
257
        }
258
        
259
        return;
260
    }
261
    //Nachricht an Nachfolger weiterleiten
262
    else if(nachricht[LAMPEN_ZIEL_ADRESSE] > LAMPEN_ADRESSE)
263
    {
264
        //kein Nachfolger? -> Nachricht verwerfen
265
        if(ADRESSE_NACHFOLGER == 0x00)
266
        {
267
            return;
268
        }
269

270
        //Nachricht zusammenstellen
271
        for(i = 0; i < nachricht[NACHRICHTEN_LANEGE] ; i++)
272
        {
273
            temp_daten[i] = nachricht[LAMPEN_ZIEL_ADRESSE + i];
274
        }
275

276
        //Nachricht weiterleiten (max. 5 Versuche!)
277
        i = 0;
278
        while( (i < 5) && ( Transmit(ADRESSE_NACHFOLGER, nachricht[KOMMANDO_ID], 0x01, temp_daten, nachricht[NACHRICHTEN_LANEGE]) ) )
279
        {
280
            _delay_ms(10);
281
            i++;
282
        }
283

284
        return;
285
    }
286
    //Nachricht an Vorgaenger weiterleiten
287
    else if(nachricht[LAMPEN_ZIEL_ADRESSE] < LAMPEN_ADRESSE)
288
    {
289
        //kein Vorgaenger? -> Nachricht verwerfen
290
        if(ADRESSE_VORGAENGER == 0x00)
291
        {
292
            return;
293
        }
294

295
        //Nachricht zusammenstellen
296
        for(i = 0; i < nachricht[NACHRICHTEN_LANEGE] ; i++)
297
        {
298
            temp_daten[i] = nachricht[LAMPEN_ZIEL_ADRESSE + i];
299
        }
300

301
        //Nachricht weiterleiten (max. 5 Versuche!)
302
        i = 0;
303
        while( (i < 5) && ( Transmit(ADRESSE_VORGAENGER, nachricht[KOMMANDO_ID], 0x01, temp_daten, nachricht[NACHRICHTEN_LANEGE]) ) )
304
        {
305
            _delay_ms(10);
306
            i++;
307
        }
308

309
        return;
310
    }
311
}


1
/**************************************************************************//**
2
* \file         netzwerk.h
3
*
4
* \author       Tobias Mueller
5
* \date         13.11.2012
6
* \version      0.1
7
*
8
* \brief        Routinen zum Verwenden des Funknetzwerks
9
* \details      -
10
******************************************************************************/
11

12
/** H E A D E R  D A T E I E N ***********************************************/
13

14
/** S Y M B O L I S C H E  K O N S T A N T E N *******************************/
15

16
#define MAX_NACHRICHTEN_LAENGE  10
17

18
/** Lampen Konfiguration *************************************/
19
#define LAMPEN_ADRESSE      0x02
20
#define ADRESSE_VORGAENGER  0x01    //0x00 = kein Vorgaenger
21
#define ADRESSE_NACHFOLGER  0x03    //0x00 = kein Nachfolger
22

23
#define LAMPEN_BROADCAST    0xFF
24

25
/** Bedeutung der API_IDs ************************************/
26
#define TX_16_BIT   0x01
27
#define RX_16_BIT   0x81
28
#define TX_STATUS   0x89
29

30
/** Bedeutung der Kommando_IDs *******************************/
31
#define LAMPEN_AKN              0x00
32
#define BELEUCHTUNG             0x01
33
#define ANFRAGE_BETRIEBSSTATUS  0x02
34
#define ANTWORT_BETRIEBSSTATUS  0x03
35
#define SYNC_MODE_BETRETEN      0x04
36
#define AKN_SYNC_MODE           0x05
37
#define SYNC_NACHRICHT          0x06
38
#define SYNC_MODE_BEENDET       0x07
39

40

41
/** Bedeutung der Byte-Positionen im API-Frame **************/
42

43
//Allgemein
44
#define API_ID      0
45

46
//API_ID == 0x89 -> TX-Status
47
#define FRAME_ID        1
48
#define AKN_STATUS      2
49

50
//API_ID == 0x81 -> RX_16_BIT
51
#define SRC_ADD_MSB     1
52
#define SRC_ADD_LSB     2
53
#define RSSI_INDICATOR  3
54
#define OPTIONS         4
55

56
/** Bedeutung der Byte-Positionen im Kommando-Frame **************/
57

58
//Kommando_Frame Allgemein
59
#define KOMMANDO_ID             5
60
#define NACHRICHTEN_ID          6
61

62
//Kommando_Frame Allgemein (außer 0x00)
63
#define NACHRICHTEN_LANEGE      7
64
#define LAMPEN_ZIEL_ADRESSE     8
65
#define LAMPEN_QUELL_ADRESSE    9
66

67
//Kommando_ID = LAMPEN_AKN (0x00)
68
#define NACHRICHTEN_STATUS  7
69

70
//Kommando_ID = BELEUCHTUNG (0x01)
71
#define BELEUCHTUNGSSTAERKE     10
72

73
//Kommando_ID = ANFRAGE_BETRIEBSSTATUS (0x02)
74

75
//Kommando_ID = ANTWORT_BETRIEBSSTATUS  (0x03)
76

77
/** Lampen Modus **************/
78
#define MODUS_NORMAL    0
79
#define MODUS_SYNC      1
80
#define MODUS_WARTUNG   2
81

82
/** G L O B A L E  V A R I A B L E N *****************************************/
83
extern volatile unsigned char lampen_modus;    //0=Normal, 1=Synchronisation, 2=Warungsmodus
84

85

86
/** F U N K T I O N S  P R O T O T Y P E N ***********************************/
87

88
/**************************************************************************//**
89
* \brief        Sendet eine Nachricht an eine benachbarte Lampe
90
* \details      -
91
* \param[in]    unsigned char   ziel            Adresse des XBEE-Moduls/ der benachbaten Lampe
92
* \param[in]    unsigned char   kommando        Kommando_ID zur Interpraetation der Daten
93
* \param[in]    unsigned char*  daten           Daten die gesendet werden sollen
94
* \param[in]    unsigned char   daten_laenge    Anzahl der Datenbytes
95
* \param[out]   unsigned char   0=Erfolg, 1=kein XBEE-AKN, 2=CCA Fehler,
96
* \n                            4=Timeout XBEE-AKN, 5=Timeout Lampen-AKN, 6=Daten zu groß
97
******************************************************************************/
98
unsigned char Transmit( unsigned char ziel, unsigned char kommando_id,
99
                        unsigned char nachricht_id, unsigned char *daten, unsigned char daten_laenge);
100

101
/**************************************************************************//**
102
* \brief        Verarbeiten und weiterleiten der empfangenen Nachrichten
103
* \details      -
104
******************************************************************************/
105
void Process(void);
#2938581
Lesenswert?

Mit diesem #define
1
#define ADRESSE_NACHFOLGER 0x03

macht der Präprozessor aus dieser Zeile
1
if(ADRESSE_NACHFOLGER == 0x00)

das hier:
1
if(0x03 == 0x00)

und dieser Vergleich ist immer konstant falsch, so dass der gesamte 
nachfolgende Codeblock niemals ausgeführt wird.

Willst Du das wirklich? Denk nochmal darüber nach.

fchk

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren