Forum: Mikrocontroller und Digitale Elektronik Zusätzliche Source und Header files in MPLAB X einfügen


von Christian O. (chris_o)


Lesenswert?

Hi Leute,
ich habe ein Problem mit dem aufteilen meines Programmes in mehrere 
Source-files.

Ich mach das in c zum ersten mal, also bitte etwas Nachsicht.

(Ich verwende einen PIC33FJ16GS404)

Wenn ich mein Programm in einem einzigen Main-file (verschiedene 
Funktionen) laufen lasse, funktioniert es wunderbar!

Jetzt versuche ich die einzelnen Funktionen in einzelne Module zu 
unterteilen, um diese später auch in anderen Projekten verwenden zu 
können.

Ich hab das ganze zuerst mal mit einer relativ einfachen Funktion 
versucht, indem ich einfach zwei integer addiert habe.
Habe hierzu ein Source file geschrieben, dass die Addition ausführt und 
ein header-file, dass die Funktion im Source-file definiert.
In der Main habe ich #define "header.h" gemacht und einen einfachen 
Aufruf und Übergabe von zwei Variablen. Das ganze hat tadellos 
funktioniert. => ich denke also generell habe ich verstanden, wie das 
ganze abläuft.

Nun habe ich meine einzelnen Funktionen in jeweils ein source-file 
geschrieben und einen header dazu. (für 3 der funktionen habe ich der 
Einfachheit halber einen gemeinsamen Header, für den Rest jeweils einen 
separaten)
Füge ich nun mein erstes Source und header file ein, compiliert alles 
wunderbar.
So bald ich das zweite Source und header file einbinde, bekomme ich 
folgende Fehlermeldungen:

>"build/default/production/UART_Init.o(.text+0x22): In function `.LSM11':
>: undefined reference to `___delay_ms'
>make[2]: *** [dist/default/production/Test.X.production.hex] Error 255
>make[1]: *** [.build-conf] Error 2
>make: *** [.build-impl] Error 2"

>"nbproject/Makefile-default.mk:151: recipe for target 
'dist/default/production/Test.X.production.hex' failed
>make[2]: Leaving directory 'C:/Users/christian.INTRA/Desktop/testfolder/Test.X'
>nbproject/Makefile-default.mk:78: recipe for target '.build-conf' failed
>make[1]: Leaving directory 'C:/Users/christian.INTRA/Desktop/testfolder/Test.X'
>nbproject/Makefile-impl.mk:39: recipe for target '.build-impl' failed"

das "__delay_ms" funktioniert einwandfrei, wenn ich es in der main 
verwende.

Ich geb euch mal die beiden Source und Header Dateien => das ganze 
Programm wäre warscheinlich etwas zu unübersichtlich

Hier die beiden Header:
1
#ifndef TIMER_INIT_H
2
#define  TIMER_INIT_H
3
4
void Timer_Init(void);
5
6
#endif  /* TIMER_INIT_H */
1
#ifndef UART_INIT_H
2
#define  UART_INIT_H
3
4
void UART_Init(void);
5
6
#endif  /* UART_INIT_H */

Hier die beiden Source Dateien:
1
#include "C:\Program Files (x86)\Microchip\xc16\v1.25\include\lega-c\stdio.h"
2
#include "C:\Program Files (x86)\Microchip\xc16\v1.25\include\lega-c\stdlib.h"
3
#include "C:\Program Files (x86)\Microchip\xc16\v1.25\support\dsPIC33F\h\p33FJ16GS404.h"
4
#include "C:\Program Files (x86)\Microchip\xc16\v1.25\support\generic\h\xc.h"
5
#include "C:\Program Files (x86)\Microchip\xc16\v1.25\support\generic\h\libpic30.h"
6
#include "C:\Program Files (x86)\Microchip\xc16\v1.25\include\lega-c\time.h"
7
8
void Timer_Init(void)
9
{
10
//32-Bit Timer initialisieren    
11
T3CONbits.TON = 0;        // Stop any 16-bit Timer3 operation
12
T2CONbits.TON = 0;        // Stop any 16/32-bit Timer3 operation
13
T2CONbits.T32 = 1;        // Enable 32-bit Timer mode
14
T2CONbits.TCS = 0;        // Select internal instruction cycle clock 
15
T2CONbits.TGATE = 0;      // Disable Gated Timer mode
16
T2CONbits.TCKPS = 0b00;   // Select 1:1 Prescaler
17
TMR3 = 0x00;              // Clear 32-bit Timer (msw)
18
TMR2 = 0x00;              // Clear 32-bit Timer (lsw)
19
PR3 = 0x8F0D;             // Load 32-bit period value (msw)
20
PR2 = 0x1800;             // Load 32-bit period value (lsw)
21
IPC2bits.T3IP = 0x01;     // Set Timer3 Interrupt Priority Level
22
IFS0bits.T3IF = 0;        // Clear Timer3 Interrupt Flag
23
IEC0bits.T3IE = 1;        // Enable Timer3 interrupt 
24
}

=> Der allein compiliert wunderbar


1
#include "C:\Program Files (x86)\Microchip\xc16\v1.25\include\lega-c\stdio.h"
2
#include "C:\Program Files (x86)\Microchip\xc16\v1.25\include\lega-c\stdlib.h"
3
#include "C:\Program Files (x86)\Microchip\xc16\v1.25\support\dsPIC33F\h\p33FJ16GS404.h"
4
#include "C:\Program Files (x86)\Microchip\xc16\v1.25\support\generic\h\xc.h"
5
#include "C:\Program Files (x86)\Microchip\xc16\v1.25\support\generic\h\libpic30.h"
6
#include "C:\Program Files (x86)\Microchip\xc16\v1.25\include\lega-c\time.h"
7
8
#define FP 40000000
9
#define BAUDRATE 115200
10
#define BRGVAL ((FP/BAUDRATE)/16)-1
11
#define FOSC (80000000ULL)
12
#define FCY (FOSC/2)
13
14
void UART_Init()
15
{
16
/*Initialisieren UART*/                                
17
U1MODEbits.STSEL = 0;                           // 1-Stop bit
18
U1MODEbits.PDSEL = 0;                           // No Parity, 8-Data bits
19
U1MODEbits.ABAUD = 0;                           // Auto-Baud disabled
20
U1MODEbits.BRGH = 0;                            // Standard-Speed mode
21
U1MODEbits.RTSMD = 0;                           // Flow Control mode
22
U1MODEbits.UEN1 = 0;                            // UxTX and UxRX pins are enabled and used; UxCTS, UxRTS and BCLKx pins are controlled by port latches
23
U1MODEbits.UEN0 = 0;                            // UxTX and UxRX pins are enabled and used; UxCTS, UxRTS and BCLKx pins are controlled by port latches
24
U1BRG = BRGVAL;                                 // Baud Rate setting for 115200
25
26
U1MODEbits.UARTEN = 1;                          // Enable UART
27
U1STAbits.UTXEN = 1;                            // Enable UART TX
28
__delay_ms(10);                                 // Delay von 10ms
29
30
IFS0bits.U1TXIF = 0;                            // Interruptflag auf 0 setzen
31
32
}

Der Aufruf in der Main ist einfach einmal
Timer_Init();
und einmal
UART_Init();

Auch wenn ich nur das zweite (UART_Init) einbinde bekomme ich die 
Fehlermeldung... es muss also irgendwo hier der Fehler liegen.
Könnt Ihr mir helfen?

Gruß Christian

von Christian O. (chris_o)


Lesenswert?

Habs selbst gelöst,

Ich musste die defines meines FCY vor die includes setzen -.-

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.