Forum: Mikrocontroller und Digitale Elektronik Problem mit C18 Compiler


von Elko4 (Gast)


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

von Karl H. (kbuchegg)


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.

von Elko4 (Gast)


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)

von Elko4 (Gast)


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);

von troll (Gast)


Lesenswert?

Nochmal: Es fehlt die eigentliche Fehlermeldung! Guck mal ob der 
Compiler ein logfile hat oder das irgendwo in der IDE versteckt ist.

von troll (Gast)


Lesenswert?

Und ellenlange Dateien bitte als Anhang posten.

von Holger W. (holgerw)


Lesenswert?

Evtl. stört der Kommentar //0x00 = kein Vorgaenger ?

von Frank K. (fchk)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.