Forum: Mikrocontroller und Digitale Elektronik Hilfe gesucht bei einer Meldung des Compilers XC8


von Michael S. (misax)


Lesenswert?

hallo;

folgende Meldung bekomme ich beim Compilieren. kann mir jemand kurz und 
bündig sagen, was ich tun muss, um sie zu beheben ?

"C:\Program Files\Microchip\xc8\v2.40\bin\xc8-cc.exe"  -mcpu=16F884 -c 
-mdfp="C:/Program 
Files/Microchip/MPLABX/v6.00/packs/Microchip/PIC16Fxxx_DFP/1.3.42/xc8" 
-fno-short-double -fno-short-float -O0 -fasmfile -maddrqual=ignore 
-xassembler-with-cpp -mwarn=-3 -Wa,-a -DXPRJ_default=default 
-msummary=-psect,-class,+mem,-hex,-file  -ginhx32 -Wl,--data-init 
-mno-keep-startup -mno-osccal -mno-resetbits -mno-save-resetbits 
-mno-download -mno-stackcall -mdefault-config-bits   -std=c99 -gdwarf-3 
-mstack=compiled:auto:auto     -o build/default/production/newmain.p1 
newmain.c
::: advisory: (2049) C99 compliant libraries are currently not available 
for baseline or mid-range devices, or for enhanced mid-range devices 
using a reentrant stack; using C90 libraries
make[2]: *** [build/default/production/newmain.p1] Error 1
make[1]: *** [.build-conf] Error 2
make: *** [.build-impl] Error 2

mein Programm
1
#include "my-configs.h"
2
3
#define _XTAL_FREQ 4000000
4
5
#define I2C_BaudRate           100000
6
#define SCL_D                  TRISC3
7
#define SDA_D                  TRISC4
8
9
#define LCD_BACKLIGHT          0x08
10
#define LCD_RETURN_HOME        0x02
11
#define LCD_TYPE               2 
12
#define LCD_TURN_ON            0x0C
13
#define LCD_CLEAR              0x01
14
#define LCD_ENTRY_MODE_SET     0x04
15
16
unsigned char i2c_add;
17
18
unsigned char RS, i2c_add, BackLight_State = LCD_BACKLIGHT;
19
20
void main(void) {
21
    
22
  SSPCON  = 0x28;
23
  SSPCON2 = 0x00;
24
  SSPSTAT = 0x00;
25
  SSPADD = ((_XTAL_FREQ/4)/I2C_BaudRate) - 1;
26
  SCL_D = 1;
27
  SDA_D = 1; 
28
  
29
  
30
  
31
  i2c_add = "0x4E";
32
    
33
  IO_Expander_Write(0x00);
34
  __delay_ms(30);
35
  LCD_CMD(0x03);
36
  __delay_ms(5);
37
  LCD_CMD(0x03);
38
  __delay_ms(5);
39
  LCD_CMD(0x03);
40
  __delay_ms(5);
41
  LCD_CMD(LCD_RETURN_HOME);
42
  __delay_ms(5);
43
  LCD_CMD(0x20 | (LCD_TYPE << 2));
44
  __delay_ms(50);
45
  LCD_CMD(LCD_TURN_ON);
46
  __delay_ms(50);
47
  LCD_CMD(LCD_CLEAR);
48
  __delay_ms(50);
49
  LCD_CMD(LCD_ENTRY_MODE_SET | LCD_RETURN_HOME);
50
  __delay_ms(50);
51
    
52
    TRISA2 = 0;
53
      
54
    while(1) {
55
56
    #include "my-loop.h"
57
58
    }
59
    
60
return;
61
62
}
63
64
void IO_Expander_Write(unsigned char Data) 
65
{
66
  I2C__Start();
67
  I2C__Write(i2c_add);
68
  I2C__Write(Data | BackLight_State);
69
  I2C__Stop();
70
}
71
72
void I2C__Start()
73
{
74
    I2C__Wait();
75
    SEN = 1;
76
}
77
78
void I2C__Wait()
79
{
80
    while ((SSPSTAT & 0x04) || (SSPCON2 & 0x1F));
81
}
82
83
unsigned char I2C__Write(unsigned char data)
84
{
85
    I2C__Wait();
86
    SSPBUF = data;
87
    while(!SSPIF);  // Wait Until Completion
88
  SSPIF = 0;
89
    return ACKSTAT;
90
}
91
92
void I2C__Stop()
93
{
94
    I2C__Wait();
95
    PEN = 1;
96
}
97
98
void LCD_CMD(unsigned char CMD) 
99
{
100
  RS = 0; // Command Register Select
101
  LCD_Write_4Bit(CMD & 0xF0);
102
  LCD_Write_4Bit((CMD << 4) & 0xF0);
103
}
104
105
void LCD_Write_4Bit(unsigned char Nibble) 
106
{
107
  // Get The RS Value To LSB OF Data  
108
  Nibble |= RS;
109
  IO_Expander_Write(Nibble | 0x04);
110
  IO_Expander_Write(Nibble & 0xFB);
111
  __delay_us(50);
112
}

von Thomas Z. (usbman)


Lesenswert?

1
  ...
2
  while(1) {
3
    #include "my-loop.h"
4
    }
5
  ...

das ist ziemlich sicher Unsinn

von Nop (Gast)


Lesenswert?

Michael S. schrieb:

> folgende Meldung bekomme ich beim Compilieren. kann mir jemand kurz und
> bündig sagen, was ich tun muss, um sie zu beheben ?

Wenn's keine C99-Libs gibt, compilier das Programm halt als C90: 
-std=c90 statt -std=c99.

von Michael S. (misax)


Lesenswert?

danke nop. wo kann ich -std=c90 einstellen ?

von Thomas Z. (usbman)


Lesenswert?

Michael S. schrieb:
> wo kann ich -std=c90 einstellen ?

gar nirgens, das ist auch nicht notwendig weil das nur ein Hinweis ist 
und keine Fehlermeldung.
Der Fehler ist an einer Stelle die du nicht zeigst. Vermutlich gibt es
my-loop.h überhaupt nicht-

von Michael S. (misax)


Lesenswert?

Den Miniloop auszulagern war nur ein Test. Auch wenn die 4 Zeilen direkt 
drinstehen kommt der Fehler.
Ich versuchte die einzelnen Routinen aus einer I2C-Bibliothek direkt in 
den Source-Code zu kopieren, aus irgendeinem Grund kommt dann der 
Fehler.
Ich versuche mal den Code zu minimieren und die genau erste Zeile 
herauszufinden wenn der Fehler auftaucht.
aber hier nochmal der derzeitige Code.
1
#include "my-configs.h"
2
3
#define _XTAL_FREQ 4000000
4
5
#define I2C_BaudRate           100000
6
#define SCL_D                  TRISC3
7
#define SDA_D                  TRISC4
8
9
#define LCD_BACKLIGHT          0x08
10
#define LCD_RETURN_HOME        0x02
11
#define LCD_TYPE               2 
12
#define LCD_TURN_ON            0x0C
13
#define LCD_CLEAR              0x01
14
#define LCD_ENTRY_MODE_SET     0x04
15
16
unsigned char i2c_add;
17
18
unsigned char RS, i2c_add, BackLight_State = LCD_BACKLIGHT;
19
20
void main(void) {
21
    
22
  SSPCON  = 0x28;
23
  SSPCON2 = 0x00;
24
  SSPSTAT = 0x00;
25
  SSPADD = ((_XTAL_FREQ/4)/I2C_BaudRate) - 1;
26
  SCL_D = 1;
27
  SDA_D = 1; 
28
  
29
  
30
  
31
  i2c_add = "0x4E";
32
    
33
34
  
35
36
  
37
  IO_Expander_Write(0x00);
38
  __delay_ms(30);
39
  LCD_CMD(0x03);
40
  __delay_ms(5);
41
  LCD_CMD(0x03);
42
  __delay_ms(5);
43
  LCD_CMD(0x03);
44
  __delay_ms(5);
45
  LCD_CMD(LCD_RETURN_HOME);
46
  __delay_ms(5);
47
  LCD_CMD(0x20 | (LCD_TYPE << 2));
48
  __delay_ms(50);
49
  LCD_CMD(LCD_TURN_ON);
50
  __delay_ms(50);
51
  LCD_CMD(LCD_CLEAR);
52
  __delay_ms(50);
53
  LCD_CMD(LCD_ENTRY_MODE_SET | LCD_RETURN_HOME);
54
  __delay_ms(50);
55
56
    
57
    
58
    
59
    TRISA2 = 0;
60
      
61
    while(1) {
62
63
        RA2 = 1;
64
        __delay_ms(1200);
65
        RA2 = 0;
66
        __delay_ms(1200);
67
68
    }
69
    
70
return;
71
72
}
73
74
75
void IO_Expander_Write(unsigned char Data) 
76
{
77
  I2C__Start();
78
  I2C__Write(i2c_add);
79
  I2C__Write(Data | BackLight_State);
80
  I2C__Stop();
81
}
82
83
void I2C__Start()
84
{
85
    I2C__Wait();
86
    SEN = 1;
87
}
88
89
void I2C__Wait()
90
{
91
    while ((SSPSTAT & 0x04) || (SSPCON2 & 0x1F));
92
}
93
94
unsigned char I2C__Write(unsigned char data)
95
{
96
    I2C__Wait();
97
    SSPBUF = data;
98
    while(!SSPIF);  // Wait Until Completion
99
  SSPIF = 0;
100
    return ACKSTAT;
101
}
102
103
void I2C__Stop()
104
{
105
    I2C__Wait();
106
    PEN = 1;
107
}
108
109
void LCD_CMD(unsigned char CMD) 
110
{
111
  RS = 0; // Command Register Select
112
  LCD_Write_4Bit(CMD & 0xF0);
113
  LCD_Write_4Bit((CMD << 4) & 0xF0);
114
}
115
116
void LCD_Write_4Bit(unsigned char Nibble) 
117
{
118
  // Get The RS Value To LSB OF Data  
119
  Nibble |= RS;
120
  IO_Expander_Write(Nibble | 0x04);
121
  IO_Expander_Write(Nibble & 0xFB);
122
  __delay_us(50);
123
}

von Nop (Gast)


Lesenswert?

Michael S. schrieb:

> Ich versuchte die einzelnen Routinen aus einer I2C-Bibliothek direkt in
> den Source-Code zu kopieren aus irgendeinem Grund kommt dann der Fehler.

Weil diese Routinen Variablen / Definitionen z.B. aus deren Header-Files 
verwenden, die Du nicht mit rüberkopiert hast.

von Volker S. (vloki)


Lesenswert?

Michael S. schrieb:
> wenn der Fehler auftaucht.

Welcher Fehler?

Der Compiler übersetzt die Sourcedatei einfach vom Anfang her. Wenn er 
auf irgendwas stößt, was ihm (noch) nicht bekannt ist, dann ist 
Feierabend.
Er kann zum Beispiel mit Funktionsaufrufen in main() nichts anfangen, 
wenn diese Funktionen erst später in der Datei implementiert werden!
-> https://de.wikipedia.org/wiki/Funktionsprototyp#Hintergrund

: Bearbeitet durch User
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.