2017-01-30 30 views
0

Я новичок здесь. Я использую компилятор XC8 и PIC18F25K22 от Microchip. Когда я строй кода, я получаю ошибкуXC8 противоречивая декларация для регистров (например, TRIS, SSP1CON1, ...)

xc8.exe --pass1 --errformat="Error at file %%f line %%l column %%c: (%%n) %%s" --warnformat="Warning at file %%f line %%l column %%c: (%%n) %%s" --msgformat="Message at file %%f line %%l column %%c: (%%n) %%s" -G --chip=18F25K22 -O"main.p1" "../main.c" 
Microchip MPLAB XC8 C Compiler (Free Mode) V1.37 
Build date: Mar 10 2016 
Part Support Version: 1.37 
Copyright (C) 2016 Microchip Technology Inc. 
License type: Node Configuration 

Warning at file line column : (1273) Omniscient Code Generation not available in Free mode 
Error at file ../i2clcd.c line 11 column 8: (195) expression syntax 
Error at file ../i2clcd.c line 11 column 8: (312) ";" expected 
Error at file ../i2clcd.c line 11 column 12: (285) no identifier in declaration 
Error at file ../i2clcd.c line 11 column 12: (314) ";" expected 
Error at file ../i2clcd.c line 14 column 10: (195) expression syntax 
Error at file ../i2clcd.c line 14 column 10: (312) ";" expected 
Error at file ../i2clcd.c line 14 column 14: (285) no identifier in declaration 
Error at file ../i2clcd.c line 14 column 14: (314) ";" expected 
Warning at file ../i2clcd.c line 23 column 1: (361) function declared implicit int 
Error at file ../i2clcd.c line 51 column 11: (195) expression syntax 
Error at file ../i2clcd.c line 51 column 11: (312) ";" expected 
Error at file ../i2clcd.c line 51 column 15: (285) no identifier in declaration 
Error at file ../i2clcd.c line 51 column 15: (314) ";" expected 
Error at file ../i2clcd.c line 84 column 1: (192) undefined identifier "lcddata" 
Error at file ../i2c.c line 10 column 1: (1098) conflicting declarations for variable "I2C_INIT" (../i2c.c:9) 
(908) exit status = 1 
make: *** [main.p1] Error 1 

Error code 2 

если я комментирую этот код в линию, я получаю сообщение об ошибке с помощью следующей команды регистра (в моем случае: SSP1CON1) - я попробовал его с включением xc.h и htc.h, но есть такая же ошибка.

Я нашел аналогичную проблему в stackoverflow, но проблема была решена путем помещения этих команд в функцию, но мои функции.

Вот мой код:

#include "i2c.h" 
#include <xc.h> 
#include <htc.h> 
/* 
* subroutine:  I2C_INIT() 
* access from:  main.c/BOOT() 
* description:  Initialisises MSSP port for I2C Master-Mode 
*/ 
void I2C_INIT(0) 
{ 
    TRISCbits.TRISC3=1;       //config SCL-Line as Input; 
    TRISCbits.TRISC4=1;       //config SDA-Line as Input; 

    SSP1CON1 = 0b00101000; 
    /* 
    * bit 5: Enables the serial port and configures the SDA and SCL pins as the 
    *   source of the serial port pins 
    *bit 0-3: 1000: I2C Master Mode, clock = FOSC/(4*(SSPASS+1)) 
    */ 

    SSP1CON2 = 0x00; 

    SSP1ADD = 39;     //clock = FOSC/(4*(SSPASS+1)) - 100 kHz @ 16MHz FOSC 
    SSP1STAT = 0b11000000; 
    /* 
    * bit 7: Slew rate control disabled for standard speed mode (100 kHz and 1 MHz) 
    * bit 6: Data transmitted on rising edge of SCK 
    */ 
} 
+0

Этот код для 'i2c.c'? В этом случае я бы сказал, что он не соответствует тому, который вы компилируете. И что такое 'I2C_INIT (0)'? Это макрос? –

+0

Это не полный код 'i2c.c'. Извините, я новичок в микроконтроллерах и C, и я не забываю прочитать пример кода парня, который помещает (0) вместо (void), поэтому я попробовал это. Когда я помещаю (void), я получаю ошибку ** противоречивые объявления для переменной «I2C_INIT» (../i2c.c:9)** –

+0

Вы не должны ставить '0' точно. Я не знаю, кто этот парень, но вы, вероятно, неправильно поняли это намерение. Таким образом, похоже, что 'I2C_INIT' определяется в другом месте. Это полное сообщение об ошибке, или есть больше? –

ответ

2

Все декларации регистров (SSP1CON1, TRISCbits и т.д., объявлены в xc.h (и это вложенными включает в себя) Ваша проблема может быть, что код в i2c.h включают это. ссылки на определения, которые появляются в xc.h

Попробуйте изменить порядок ваших включает поместить система включает в себя, прежде чем свои собственные (или третьей стороной) включает в себя.

В общем, вы всегда должны включать все системы (т. те, где файл указан с <>) перед вашими собственными (те, у которых «»).

+0

спасибо, но я нашел ошибку в другом файле include, и я удалил файл include ... , но моя новая ошибка: 'make: ** * Нет правила делать мишени ../../../../../../../Lukas_Fürst/AppData/Local/Temp/271d8c4c1fe4456cb5419e611bd1711e/PIC18F25K22/i2c.c, необходимые для i2c.p1. Stop.' –

+0

Я бы предложил чистую, а затем повторную сборку всего проекта. Кажется, это исправление для меня. Но очень странно, что ваш проект содержит файл в вашей папке temp. Попробуйте проверить окно «Проекты» в MPLABX, чтобы убедиться, что все файлы там находятся в законных местах (если вы наведите указатель мыши на имя файла, будет показан полный путь). – EBlake

+0

спасибо @EBlake Я запрограммировал сначала Proteus, а затем создал новый проект и скопировал код в MPLAB X. Я думаю, что каталог был слишком длинным. –