Kann ich #define XY in eine externe Datei.h legen und dieses XY in zwei Dateien code1.c und code2.c verwenden? Ich habe es mit include Datei.h in beiden .c Dateien versucht. Wurde trotzdem nicht geunden.
Japp, das sollte funktionieren, aber anscheinend machst Du was falsch... Datenkeimling schrieb: > in eine externe Datei.h legen und dieses XY in zwei Dateien code1.c und > code2.c verwenden? Datei.h ist noch so extern oder intern wie code1.c und code2.c. Das Wort "extern" passt in diesem Fall nicht. Datenkeimling schrieb: > Ich habe es mit include Datei.h in beiden .c Dateien > versucht. Wurde trotzdem nicht geunden. Include muss ganz am Anfang stehen und ansonsten könnte man noch weiter raten was da los ist, da keinen Code und so... Vllt. hilft dir auch dieses Kapitel weiter, da sollte ein Beispiel mit drinnen sein http://openbook.galileocomputing.de/c_von_a_bis_z/010_c_praeprozessor_002.htm#mjead11e16556a0e94647592cad9e3c437
Datenkeimling schrieb: > Kann ich > > #define XY > > in eine externe Datei.h legen und dieses XY in zwei Dateien code1.c und > code2.c verwenden? Ich habe es mit include Datei.h in beiden .c Dateien > versucht. Wurde trotzdem nicht geunden. Hoffentlich kennst du den Unterschied zwischen #incude "extern.h" und #include <extern.h>
Schon in dieser Konstellation wird das #define nicht gefunden (alle Dateien sind im Projekt eingebunden). additional_adc_adc_example1.h:
1 | //#ifndef ADDITIONAL_ADC_ADC_EXAMPLE1
|
2 | //#define ADDITIONAL_ADC_ADC_EXAMPLE1
|
3 | |
4 | |
5 | #define MENU_HEADER "\n\r" \
|
6 | "===================================================\n\r" \
|
7 | "Menu: press a key to change the configuration.\n\r" \
|
8 | "---------------------------------------------------------\n\r"
|
9 | |
10 | //Prototypes
|
11 | static void display_menu(void); |
12 | |
13 | //#endif
|
additional_adc_adc_example1.c:
1 | #include <string.h> |
2 | #include "asf.h" |
3 | #include "conf_board.h" |
4 | #include "additional_adc_adc_example1.h" |
5 | |
6 | static void display_menu(void) |
7 | {
|
8 | uint8_t uc_char; |
9 | |
10 | puts(MENU_HEADER); |
11 | //...
|
12 | |
13 | }
|
ergibt: Error 1 'MENU_HEADER' undeclared (first use in this function)
Datenkeimling schrieb: > Error 1 'MENU_HEADER' undeclared (first use in this function) Hier nicht:
1 | $ cat > additional_adc_adc_example1.h |
2 | //#ifndef ADDITIONAL_ADC_ADC_EXAMPLE1 |
3 | //#define ADDITIONAL_ADC_ADC_EXAMPLE1 |
4 | |
5 | |
6 | #define MENU_HEADER "\n\r" \ |
7 | "===================================================\n\r" \ |
8 | "Menu: press a key to change the configuration.\n\r" \ |
9 | "---------------------------------------------------------\n\r" |
10 | |
11 | //Prototypes |
12 | static void display_menu(void); |
13 | |
14 | //#endif |
15 | ^D |
16 | $ touch asf.h |
17 | $ echo "#include <stdint.h>" > conf_board.h |
18 | $ cat > additional_adc_adc_example1.c |
19 | #include <string.h> |
20 | #include "asf.h" |
21 | #include "conf_board.h" |
22 | #include "additional_adc_adc_example1.h" |
23 | |
24 | static void display_menu(void) |
25 | {
|
26 | uint8_t uc_char; |
27 | |
28 | puts(MENU_HEADER); |
29 | //... |
30 | |
31 | } |
32 | ^D |
33 | $ avr-gcc -Wall -Wextra -mmcu=atmega1281 -Os -c additional_adc_adc_example1.c |
34 | additional_adc_adc_example1.c: In function ‘display_menu’: |
35 | additional_adc_adc_example1.c:10:3: warning: implicit declaration of function ‘puts’ |
36 | additional_adc_adc_example1.c:8:11: warning: unused variable ‘uc_char’ |
37 | additional_adc_adc_example1.c: At top level: |
38 | additional_adc_adc_example1.c:6:13: warning: ‘display_menu’ defined but not used |
Der uC hier ist n SAM3X8E mit gcc. Keine Ahnung warum das bei dir funktioniert. Bei mir geht's immer noch net. Trotzdem, Danke. 73
Datenkeimling schrieb: > ergibt: > Error 1 'MENU_HEADER' undeclared (first use in this function) Du hast vorhin von mehreren Dateien geschrieben... Wird wo anders das #define aufgelöst? - Wenn nicht, dann poste bitte alle Fehler.
Nee, wird nirgends aufgelöst. Mach ich morgen mit weiter. Aber im Moment hab ichn schlimmeres Problem: scanf verursacht böse Speicherfehler.
1 | #include <string.h> |
2 | #include "asf.h" |
3 | #include "conf_board.h" |
4 | |
5 | #define NUM_CHANNELS (4)
|
6 | |
7 | /** ADC convention done mask. */
|
8 | #define ADC_DONE_MASK ( (1<<NUM_CHANNELS) - 1 )
|
9 | |
10 | /** Size of the receive buffer and transmit buffer. */
|
11 | #define BUFFER_SIZE NUM_CHANNELS
|
12 | |
13 | /** Reference voltage for ADC, in mv. */
|
14 | #define VOLT_REF (3300)
|
15 | |
16 | |
17 | /** The maximal digital value */
|
18 | #define MAX_DIGITAL (4095)
|
19 | |
20 | #define STRING_EOL "\r"
|
21 | #define STRING_HEADER "\r\n\r\n-- ADC Example --\r\n" \
|
22 | "-- Compiled: "__DATE__" "__TIME__" --"STRING_EOL
|
23 | |
24 | #define MENU_HEADER "\n\r" \
|
25 | "===================================================\n\r" \
|
26 | "Menu: press a key to change the configuration.\n\r" \
|
27 | "---------------------------------------------------------\n\r"
|
28 | |
29 | /** ADC channel for potentiometer */
|
30 | int g_i_selected_channel; |
31 | |
32 | |
33 | |
34 | /** Global timestamp in milliseconds since start of application */
|
35 | static volatile uint32_t gs_ul_ms_ticks = 0; |
36 | |
37 | |
38 | |
39 | static void display_menu2(void) |
40 | {
|
41 | puts(MENU_HEADER); |
42 | printf ("Select channel: "); |
43 | scanf("%d", &g_i_selected_channel); // <-PROBLEM |
44 | printf ("\rg_i_selected_channel = %d\r", g_i_selected_channel); |
45 | }
|
46 | |
47 | |
48 | |
49 | |
50 | /**
|
51 | * \brief Display ADC configuration menu.
|
52 | */
|
53 | static void display_menu(void) |
54 | {
|
55 | uint8_t uc_char; |
56 | |
57 | puts(MENU_HEADER); |
58 | uc_char = (g_adc_test_mode.uc_trigger_mode == TRIGGER_MODE_SOFTWARE) ? 'X' : ' '; |
59 | printf("[%c] 0: Set ADC trigger mode: Software.\r", uc_char); |
60 | ...
|
61 | ...
|
62 | ...
|
63 | uc_char = (g_adc_test_mode.uc_offset_en) ? 'E' : 'D'; |
64 | printf("[%c] O: Enable/Disable offset for potentiometer channel.\r", |
65 | uc_char); |
66 | |
67 | puts(" Q: Quit configuration and start ADC.\r"); |
68 | puts("=========================================================\r"); |
69 | }
|
mit Aufruf in main:
...
...
display_menu2();
display_menu(); //show only
start_adc();
...
...
vrursacht willkürlichen Speichermüll in der Ausgabe:
g_i_selected_channel = 0
===================================================
Menu: press a key to change the configuration.
---------------------------------------------------------
[X] 0: Set ADC trigger mode: Software.
[ ] 1: Set ADC trigger mode: ADTRG.
[ ] 2: Set ADC trigger mode: Timer TIOA.
[ ] 3: Set ADC trigger mode: PWMEvent Line.
[ ] 4: Set ADC trigger mode: Free run mode.
[E] T: Enable/Disable to transfer with PDC.
[D] S: Enable/D…‰±•to use user sequence mode.
[D] P: Enable/Disable ADC power save mode.
[D] G: Enable/Disable to set gain = 2x for potentiometer channel.
[D] O: Enable/Disable offset for potentiometer channel.
Q: Quit configuration and start ADC.
================êêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêj
Press any key to display configuration menu.
-- ADC Example --
-- Compiled: Jun 27 2013 21:36:39 --
Configure system tick to get 1ms tick period.
===================================================
Menu: press a key to change the configuration.
---------------------------------------------------------
Select channel:
uC istn SAM3X8E. Ich hab jetzt mehrere Datentypen für
g_i_selected_channel und für den Spezifizierer für scanf ausprobiert
weil ich eigentlich dachte der Speicher reicht nicht... hilft aber nicht
weiter.
Also mit gcc auf'm PC (MinGW) habe ich keine Probleme beim Kompilieren und zur Laufzeit, wenn ich: -diverse Sachen rausschmeiße die mir nicht vorliegen: #include "asf.h" #include "conf_board.h" "Pünktchen Pünktchen Pünktchen" Code -die richtigen Header inkludiere: #include <stdint.h> #include <stdio.h> Datenkeimling schrieb: > uC istn SAM3X8E. Die Information nützt uns eher wenig. Viel interessanter wäre es zu wissen, wie kompiliert wird. Von Hand an der Kommandozeile? Per makefile? Mit einer IDE (welche?) Außerdem kann auch und gerade so ein Menü-Code problemlos auf dem PC übersetzt und getestet werden, wenn die µC-Anteile vernünftig gekapselt sind. Dafür haben die C-Götter das #ifdef erschaffen. Ach ja und das hier: > uint8_t uc_char; schreibt man als: char uc_char; weil genau das gemeint ist. (char = character)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.