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