Forum: Mikrocontroller und Digitale Elektronik Funktion auslagern


von Reinhard (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,
zur Zeit blicke ich nicht mehr durch. Ich möchte die Funktion "meinADC" 
auslagern. (Wenn der Code in der main- Datei steht, funktioniert es).
Wie muss die korrekte .h- Datei aussehen? Habe bisher erfolglos 
Literatur durchgearbeitet. Evtl. kann jemand das Problem einfach lösen. 
Oder auch nur auf der offenen Wunde herumtrampeln (Suchfunktion, Google 
ist dein Freund, bisse blöd? usw.) Danke.
Gruß
Reinhard

von Peter II (Gast)


Lesenswert?

könntest du erstmal sagen was nicht geht? Bekommst du eine 
Fehlermeldung?

von Michael R. (dj_motionx)


Lesenswert?

Versuch mal die include Datei "meinADC.h" als letztes zu inkludieren.

von Reinhard (Gast)


Lesenswert?

Hallo,
Danke für die Reaktion. Die Meldungen:
Build started 14.8.2012 at 11:34:46
./main.c

In file included from ../main.c:7:0:
../meinADC.h:9:11: error: expected '=', ',', ';', 'asm' or 
'__attribute__' before 'Read_ADC'
../main.c: In function 'main':
../main.c:29:2: warning: implicit declaration of function 'Read_ADC'
../main.c:34:2: warning: implicit declaration of function 'sprintf'
../main.c:34:2: warning: incompatible implicit declaration of built-in 
function 'sprintf'
../main.c:34:2: warning: pointer targets in passing argument 1 of 
'sprintf' differ in signedness
../main.c:34:2: note: expected 'char *' but argument is of type 'uint8_t 
*'
../main.c:42:2: warning: pointer targets in passing argument 1 of 
'LCDWrite' differ in signedness
../m50530.h:118:13: note: expected 'const char *' but argument is of 
type 'uint8_t *'
make: *** [main.o] Fehler 1
Build failed with 1 errors and 5 warnings...
Gruß
Reinhard

von Mike R. (thesealion)


Lesenswert?

Moin,

ich rate mal: Du hast die neue C-Datei nicht zum Projekt hinzugefügt.
Deshalb kann der Linker die Funktion nicht finden (da der Compiler sie 
nicht übersetzt hat :)

Ansonsten sind die h-Dateien etwas unübersichtlich, sehen auf den ersten 
Blick aber nicht falsch aus.

Mike

von Karl H. (kbuchegg)


Lesenswert?

Ich vermisse sowohl in main.c als auch in MainADC.c den
#include <avr/io.h>


Ansonsten: halte dich an den ersten Fehler
(der bei dir dadurch ausgelöst wurde, dass der COmpiler mit uint16_t nix 
anfangen konnte)
und behebe den erst mal.

In deinem Fall wird er dadurch behoben, dass du den
#include <avr/io.h>
hinzufügst. Der zieht dann gleich einen ganzen Haufen anderer dinge 
rein, unter anderem auch die Definitionen für uint16_t und Konsorten.

Und zwar als ersten Include!

Halte dich an die einfache Regel:
Erst die Systemspezifischen Includes, dann deine eigenen.

von Mike R. (thesealion)


Lesenswert?

Ok, erst Versuch zu langsam und falsch.

Zweiter Versuch:

Der Compiler kennt uint16_t nicht.


Gruß Mike

von Reinhard (Gast)


Lesenswert?

Hallo,
Danke für die Reaktion. Die Meldungen:
Build started 14.8.2012 at 11:34:46
./main.c

In file included from ../main.c:7:0:
../meinADC.h:9:11: error: expected '=', ',', ';', 'asm' or 
'__attribute__' before 'Read_ADC'
../main.c: In function 'main':
../main.c:29:2: warning: implicit declaration of function 'Read_ADC'
../main.c:34:2: warning: implicit declaration of function 'sprintf'
../main.c:34:2: warning: incompatible implicit declaration of built-in 
function 'sprintf'
../main.c:34:2: warning: pointer targets in passing argument 1 of 
'sprintf' differ in signedness
../main.c:34:2: note: expected 'char *' but argument is of type 'uint8_t 
*'
../main.c:42:2: warning: pointer targets in passing argument 1 of 
'LCDWrite' differ in signedness
../m50530.h:118:13: note: expected 'const char *' but argument is of 
type 'uint8_t *'
make: *** [main.o] Fehler 1
Build failed with 1 errors and 5 warnings...
Gruß
Reinhard

Mike S. schrieb:
> Du hast die neue C-Datei nicht zum Projekt hinzugefügt.
Hallo,
ist das nicht mit
#include "meinADC.h" in der main.c
geschehen?

von Michael R. (dj_motionx)


Lesenswert?

Das war auch meine erste Vermutung. Irgendjemand muss aber die 
Definition von uint_16 inkludieren denn sonst würde es nicht 
funktionieren wenn Read_ADC ins mainfile kopiert wird.

Aber zuerst system dann user includes ist wie gesagt nie falsch :-)

von Phil (Gast)


Lesenswert?

Reinhard schrieb:
> Hallo,
> ist das nicht mit
> #include "meinADC.h" in der main.c
> geschehen?

Nein, dies ist nur eine Header Datei. Du musst schon noch die C Datei 
hinzufügen.

In einem Makefile z.B. mit SRC += file.c

In Atmel Studio im Solution Explorer -> aktuelles Projekt -> rechtsklick 
-> add -> existing file

von Karl H. (kbuchegg)


Lesenswert?

Karl Heinz Buchegger schrieb:

> Halte dich an die einfache Regel:
> Erst die Systemspezifischen Includes, dann deine eigenen.

Und die Definition für F_CPU ziehst du vor alles andere. Denn ein 
utils/delay benötigt dieses #define bereits. Definierst du F_CPU erst 
danach, dann hilft dir das nichts.
1
#ifndef F_CPU
2
#define F_CPU 1600000
3
#endif
4
5
#include <avr/io.h>
6
#include <util/delay.h>
7
8
#include "meinADC.h"
9
#include "m50530.h"
10
11
12
....


Ich geh eigentlich immer mehr davon ab, den F_CPU mit einem #ifndef zu 
sichern. Ist im Makefile eine enstprechende Definition, dann soll das 
ruhig einen Fehler ergeben. Ist mir immer noch lieber, als wenn 
stillschweigend die Definition aus dem Makefile genommen wird, die 
natürlich nicht mit dem hier angegebenen Zahlenwert übereinstimmt und 
ich dann für mich von falschen Zahlen ausgehe.

1
#define F_CPU 1600000
2
3
#include <avr/io.h>
4
#include <util/delay.h>
5
6
#include "meinADC.h"
7
#include "m50530.h"
8
9
10
....

von Reinhard (Gast)


Lesenswert?

Hallo,
danke für die Antworten. #include <avr/io.h> vergessen (?!) Es geht.
Gruß
Reinhard

von Mike R. (thesealion)


Lesenswert?

Ich denke mal die Typen werden in der
1
#include "m50530.h"
definiert sein. Deshalb funktioniert es in main, aber in der ADC nicht.

Das ADC ans ende der includes wird wahrscheinlich schon helfen, da dann 
die Reihenfolge auch stimmt. allerdings ist dann der nächste Fehler, das 
der Compiler die meinADC.c nicht übersetzen kann.

von Michael R. (dj_motionx)


Lesenswert?

Compilerfehler ?

von Karl H. (kbuchegg)


Lesenswert?

Michael Rathmair schrieb:
> Compilerfehler ?

Wenn ein Newbie ein Problem hat, kann man Compilerfehler zu 99.9% 
ausschliessen.
Es gibt zwar seltsame Compilerfehler und ja, auch der gcc hatte in der 
Vergangenheit ein paar, sagen wir mal Eigenheiten, die ich eigentlich 
nicht für möglich gehalten hätte, aber solche Dinge sprechen sich 
schnell rum und werden behoben. Meistens sind es irgendwelche Dinge in 
der Codegenerierung oder im Optimizer. Beim sprachabhängigen Teil, 
lexikalischem und syntaktischem Parsen ist die Wahrscheinlichkeit für 
einen unentdeckten Fehler, den ein Newbie findet, bei kleiner 0.000001%. 
Also praktisch 0.

Einen include, der nicht vorhanden ist, kann auch der tollste 
Compilerfehler nicht vertuschen.

von Michael R. (dj_motionx)


Lesenswert?

Ich meine nicht dass der Compiler einen Fehler hat sondern was der 
Compiler noch meckert weil Mike S. noch geschrieben hat, dass er 
meinADC.c nicht übersetzten kann.

von Karl H. (kbuchegg)


Lesenswert?

Michael Rathmair schrieb:
> Ich meine nicht dass der Compiler einen Fehler hat sondern was der
> Compiler noch meckert weil Mike S. noch geschrieben hat, dass er
> meinADC.c nicht übersetzten kann.

gleiches Problem. avr/io.h fehlt
Und der Rest sind Folgefehler.

von Reinhard (Gast)


Lesenswert?

Hallo,
1. die meinADC.c hatte ich hinzugefügt
2. F_CPU ganz vorn, kommt zwr die Warnung, sicher kein Problem.
3. Es geht alles, jedoch sind noch einige Warnungen vorhanden (implicit 
deklaration... :

../main.c:7:0: warning: "F_CPU" redefined

<command-line>:0:0: note: this is the location of the previous 
definition
../main.c: In function 'main':
../main.c:32:2: warning: implicit declaration of function 'sprintf'
../main.c:32:2: warning: incompatible implicit declaration of built-in 
function 'sprintf'
../main.c:32:2: warning: pointer targets in passing argument 1 of 
'sprintf' differ in signedness
../main.c:32:2: note: expected 'char *' but argument is of type 'uint8_t 
*'
4. die Format Warnung finde ich sicher noch raus(siehe alter Beitrag)
Gruß
Reinhard

von Karl H. (kbuchegg)


Lesenswert?

Reinhard schrieb:
> Hallo,
> 1. die meinADC.c hatte ich hinzugefügt
> 2. F_CPU ganz vorn, kommt zwr die Warnung, sicher kein Problem.
> 3. Es geht alles, jedoch sind noch einige Warnungen vorhanden (implicit
> deklaration... :
>
> ../main.c:7:0: warning: "F_CPU" redefined
>
> <command-line>:0:0: note: this is the location of the previous
> definition

sprich:
Es gibt im Makefile eine Definition für F_CPU

> ../main.c: In function 'main':
> ../main.c:32:2: warning: implicit declaration of function 'sprintf'

sprintf ist im Header stdio.h enthalten.

> ../main.c:32:2: warning: incompatible implicit declaration of built-in
> function 'sprintf'

selber Fehler

> ../main.c:32:2: warning: pointer targets in passing argument 1 of
> 'sprintf' differ in signedness

selber Fehler

> ../main.c:32:2: note: expected 'char *' but argument is of type 'uint8_t
> *'

Ist ein kleineres Problem, das sich mit einem Cast beheben lässt.


Du musst schön langsam lernen, welche Systemfunktionen in welchen Header 
Files 'beheimatet' sind und welche Header Files du daher includieren 
musst, wenn du eine Funktion benutzt. Wenn du es nicht auswendig weißt: 
nach der Funktion googeln. In den Funktionsdokus stehts normalerweise 
dabei.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Reinhard schrieb:
> ../main.c:7:0: warning: "F_CPU" redefined

Das bedeutet, daß "F_CPU" bereits definiert ist - vermutlich per 
Compilerkommandozeilenoption -DF_CPU=...

> ../main.c:32:2: warning: implicit declaration of function 'sprintf'

Das heißt, daß die Headerdatei, in der sprintf deklariert wird, nicht 
eingebunden wurde.

Lerne Compilerfehlermeldungen lesen!

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Karl Heinz Buchegger schrieb:
> Du musst schön langsam lernen, welche Systemfunktionen in welchen Header
> Files 'beheimatet' sind. Wenn du es nicht auswendig weißt: nach der
> Funktion googeln.

Da braucht es kein Google, eine simple Textsuche in den Headerdateien im 
include-Verzeichnis des Compilers reicht aus.

von Karl H. (kbuchegg)


Lesenswert?

Rufus Τ. Firefly schrieb:
> Karl Heinz Buchegger schrieb:
>> Du musst schön langsam lernen, welche Systemfunktionen in welchen Header
>> Files 'beheimatet' sind. Wenn du es nicht auswendig weißt: nach der
>> Funktion googeln.
>
> Da braucht es kein Google, eine simple Textsuche in den Headerdateien im
> include-Verzeichnis des Compilers reicht aus.

Geht natürlich auch. Viele Wege führen nach Rom.
Und mit der Zeit kennt man dann ohnehin seine Pappenheimer.

von Karl H. (kbuchegg)


Lesenswert?

1
uint8_t puffer[4];
2
3
  sprintf(puffer,"%4d",value);

abgesehen davon, dass puffer hier besser als char definiert wäre (immer, 
wenn es sich um Textverarbeitung handelt, ist char der Datentyp der 
Wahl), hast du auch einen schönen Array-Overflow gebaut. %4d erzeugt 
einen String mit mindestens 5 Bytes Länge (aber einer minimalen strlen 
von 4). Du hast das abschliessende \0 Byte vergessen.

von Reinhard (Gast)


Lesenswert?

Hallo,
vielen Dank für die Hilfestellung. Ich habe vor etwa 4 Jahren das letzte 
Mal
in C versucht, kleine Dinge zu programmieren. Sprich- (damals)durch 
Elektor infiziert aus Codestücken etwas mit CodeVision 
zusammenzuflicken. Aus Zeitgründen aber verworfen. Jetzt im Vorruhestand 
habe ich Zeit, mich wieder damit zu befassen. Manchmal sieht man die 
einfachsten Dinge nicht, wenn man stunden(Tage-)lang an dem gleichen 
Problem sitzt. Das Ganze dauert eben lange. Der Einstieg war eben, einen 
ADC- Wert auf einem Display anzuzeigen.  Von hier aus geht es langsam 
weiter...
Gruß
Reinhard

von Michael R. (dj_motionx)


Lesenswert?

Reinhard schrieb:
> Von hier aus geht es langsam
> weiter...

Super !!! Noch viel Erfolg und Spaß

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.