Forum: Mikrocontroller und Digitale Elektronik avr/iom328p.h ist da, wird aber nicht anerkannt


von Frank (Gast)


Lesenswert?

Guten abend,
ich habe Probleme beim Einrichten von Eclipse. Eigentlich habe ich das 
AVR-Plugin installiert. Ich konnte auch ein Projekt dafür erstellen. 
Aber so ganz läuft es nicht.
Ich habe einen ATmega328P (arduino nano), den ich auch beim erstellen 
des Projekts gewählt habe.
Im code inkludire ich zuerst
1
#include <avr/io.h>
Wenn ich dort rein gehe, wird diese auch geöffnet. Wenn ich dann 
allerdings von dort avr/iom328p.h öffnen möchte, bekomme ich die Meldung
No include files were found that matched that name
Die Datai ist aber definitiv da.
Wenn ich im code die Deklaration von PB5 (diese lasse ich einfach nur 
Toggeln (LED)) öffne, öffnet sich die iom16.h

Also ist anscheinend der falsche Controller gewählt. Wo kann ich diesen 
denn ändern?
Im Internet sehe ich immer den weg unter Projekt->Properties->AVR
Doch in meinem Properties habe ich keine eintrag AVR
Ich habe die EclipseVersion 2018-12 (4.10.0)
Weiß jemand wie ich nachträglich den Controller ändern kann? Oder warum 
sich dieser geändert hat?

Frank

von Karl M. (Gast)


Lesenswert?

Hallo,

ich habe mal die avr-libc-2.0.0 bei mir entpackt und finde die Datei 
hier:

.../avr-libc-2.0.0/include/avr/iom328p.h

Source: https://download-mirror.savannah.gnu.org/releases/avr-libc/

Dann musst Du mal nachsehen, was bei dir "avr/iom328p.h" im Dateipfand 
real bedeutet.

von Frank (Gast)


Lesenswert?

Wie finde ich das denn heraus?

von den in io.h includierten files kann fast keine gefunden werden. Aber 
alle sind im selben Ordner drinn.

Wenn ich anstelle von <avr/io.h> direkt <avr/iom328p.h> includiere, wird 
diese auch gefunden. Diese kann ich dann auch so in Eclipse öffnen.

von Frank (Gast)


Lesenswert?

Ahso,
ich kann die iom328p.h zwar includieren und wird dann auch geöffnet, 
Wenn ich aber bauen möchte, bekomme ich den fehler, dass ich die 
avr/io.h includieren soll (so wie es auch in der iom328p.h drinn steht).
Die wird also gefunden und kann auch angezogen werden. Aber wenn ich 
über io.h gehe, funktioniert es für diese nicht mehr. Oder liegt es 
daran, dass der Falsche controller gewählt worden ist?
Wie kann ich den denn ändern? Der Eintrag Project->Properties->AVR ist 
bei mir nicht vorhanden.

von Stefan F. (Gast)


Lesenswert?

Zwei Sachen sind dafür relevant:

Der Suchpfad für Libraries. Kann man in den gängigen IDE's als 
Projekteinstellung anpassen, allerdings sollte der avr-gcc die Libraries 
der avr-libc von alleine finden können, da die default Pfade hardcodiert 
sind.

So kannst du sie prüfen:
1
stefan@stefanspc:~$ avr-gcc -v
2
Using built-in specs.
3
Reading specs from /usr/lib/gcc/avr/5.4.0/device-specs/specs-avr2
4
COLLECT_GCC=avr-gcc
5
COLLECT_LTO_WRAPPER=/usr/lib/gcc/avr/5.4.0/lto-wrapper
6
Target: avr
7
Configured with: ../gcc/configure -v --enable-languages=c,c++ --prefix=/usr/lib --infodir=/usr/share/info --mandir=/usr/share/man --bindir=/usr/bin --libexecdir=/usr/lib --libdir=/usr/lib --enable-shared --with-system-zlib --enable-long-long --enable-nls --without-included-gettext --disable-libssp --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=avr CFLAGS='-g -O2 -fdebug-prefix-map=/build/gcc-avr-5.4.0+Atmel3.6.1=. -fstack-protector-strong -Wformat ' CPPFLAGS='-Wdate-time -D_FORTIFY_SOURCE=2' CXXFLAGS='-g -O2 -fdebug-prefix-map=/build/gcc-avr-5.4.0+Atmel3.6.1=. -fstack-protector-strong -Wformat ' FCFLAGS='-g -O2 -fdebug-prefix-map=/build/gcc-avr-5.4.0+Atmel3.6.1=. -fstack-protector-strong' FFLAGS='-g -O2 -fdebug-prefix-map=/build/gcc-avr-5.4.0+Atmel3.6.1=. -fstack-protector-strong' GCJFLAGS='-g -O2 -fdebug-prefix-map=/build/gcc-avr-5.4.0+Atmel3.6.1=. -fstack-protector-strong' LDFLAGS=-Wl,-z,relro OBJCFLAGS='-g -O2 -fdebug-prefix-map=/build/gcc-avr-5.4.0+Atmel3.6.1=. -fstack-protector-strong -Wformat ' OBJCXXFLAGS='-g -O2 -fdebug-prefix-map=/build/gcc-avr-5.4.0+Atmel3.6.1=. -fstack-protector-strong -Wformat '
8
Thread model: single
9
gcc version 5.4.0 (GCC)

Der entscheidente Teil ist hier: -libdir=/usr/lib

In diesem Verzeichnis befindet sich bei mir die avr-libc. Kontrolle.
1
stefan@stefanspc:/usr/lib$ cd /usr/lib/avr
2
stefan@stefanspc:/usr/lib/avr$ ls
3
bin  include  lib  x86_64-linux-gnu

Als zweites muss die avr/io.h irgendwie wissen, für welchen 
Mikrocontroller sie arbeiten soll. Dies ergibt sich in der Regel aus dem 
avr-gcc Kommandozeilenparamater "-mmcu=atmega8". Der Compiler definiert 
daraufhin das Makro "__AVR_ATmega__" (ohne Wert), welche innerhalb der 
avr/io.h abgefragt wird, um die spezifische Datei zu inkludieren.

In meinen generischen (nicht AVR spezifische) Entwicklungsumgebungen 
miss ich dieses Makro in den Projekteinstellungen hinzufügen, damit der 
Editor die Syntax meines Programm richtig prüfen kann. Ansonsten 
markiert sie sämtliche Register-Namen als unbekannt.

von Frank (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,
in den Eingenschften habe ich alle Pfade angepasst. Auch das es ein 
Atmega328p sein soll. In den Settings wurde das aber nicht übernommen. 
Dort kann ich es auch nicht ändern.

Bei avr-gcc -v kommt bei mir auch ein Pfad aus, den ich nirgendwo finden 
kann
--libdir=/home/toolsbuild/workspace/avr8-gnu-toolchain/avr8-gnu-toolchai 
n-win32_x86/lib

Diesen Pfad finde ich bei mir auf dem computer gar nicht. Oder wird der 
nur anders dargestellt?

von Stefan F. (Gast)


Angehängte Dateien:

Lesenswert?

Ich sehe nicht, wo du dies definiert hast:
> Makro "__AVR_ATmega__" (ohne Wert)

Ich habe mal den Screen fotografiert, wo das hin gehört.

von Frank (Gast)


Angehängte Dateien:

Lesenswert?

Ich habe jetzt das Makro definiert, aber beim Bauen sehe ich immer noch 
in der Ausgabe, das der Atmega16 gewählt wurde

avr-gcc -D__AVR_ATmega__ -Wall -Os -fpack-struct -fshort-enums 
-ffunction-sections -fdata-sections -std=gnu99 -funsigned-char 
-funsigned-bitfields -mmcu=atmega16 -DF_CPU=1000000UL -MMD -MP 
-MF"main.d" -MT"main.o" -c -o "main.o" "../main.c"

von Georg G. (df2au)


Lesenswert?

Sieh dir doch bitte deinen eigenen Beitrag von 17:33 an, das erste Bild. 
Dort definierst du den ATMega16. Geh auf "symbols" und ändere dort den 
Wert.

von Stefan F. (Gast)


Lesenswert?

> __AVR_ATmega__

Schau im Quelltext der io.h nach, wie das Makro genau heisst. Mit "(ohne 
Wert)" meinte ich, dass nur der Name des Makros definiert werden muss. 
Das war wohl irreführend.
1
stefan@stefanspc:~$ grep '__AVR_ATmega' /usr/lib/avr/include/avr/io.h 
2
#elif defined (__AVR_ATmega8U2__)
3
#elif defined (__AVR_ATmega16M1__)
4
#elif defined (__AVR_ATmega16U2__)
5
#elif defined (__AVR_ATmega16U4__)
6
#elif defined (__AVR_ATmega32C1__)
7
#elif defined (__AVR_ATmega32M1__)
8
#elif defined (__AVR_ATmega32U2__)
9
#elif defined (__AVR_ATmega32U4__)
10
#elif defined (__AVR_ATmega32U6__)
11
#elif defined (__AVR_ATmega64C1__)
12
#elif defined (__AVR_ATmega64M1__)
13
#elif defined (__AVR_ATmega128__)
14
#elif defined (__AVR_ATmega128A__)
15
#elif defined (__AVR_ATmega1280__)
16
#elif defined (__AVR_ATmega1281__)
17
#elif defined (__AVR_ATmega1284__)
18
#elif defined (__AVR_ATmega1284P__)
19
#elif defined (__AVR_ATmega128RFA1__)
20
#elif defined (__AVR_ATmega1284RFR2__)
21
#elif defined (__AVR_ATmega128RFR2__)
22
#elif defined (__AVR_ATmega2564RFR2__)
23
#elif defined (__AVR_ATmega256RFR2__)
24
#elif defined (__AVR_ATmega2560__)
25
#elif defined (__AVR_ATmega2561__)
26
#elif defined (__AVR_ATmega644RFR2__)
27
#elif defined (__AVR_ATmega64RFR2__)
28
#elif defined (__AVR_ATmega64__)
29
#elif defined (__AVR_ATmega64A__)
30
#elif defined (__AVR_ATmega640__)
31
#elif defined (__AVR_ATmega644__)
32
#elif defined (__AVR_ATmega644A__)
33
#elif defined (__AVR_ATmega644P__)
34
#elif defined (__AVR_ATmega644PA__)
35
#elif defined (__AVR_ATmega645__)
36
#elif (defined __AVR_ATmega645A__)
37
#elif (defined __AVR_ATmega645P__)
38
#elif defined (__AVR_ATmega6450__)
39
#elif (defined __AVR_ATmega6450A__)
40
#elif (defined __AVR_ATmega6450P__)
41
#elif defined (__AVR_ATmega649__)
42
#elif (defined __AVR_ATmega649A__)
43
#elif defined (__AVR_ATmega6490__)
44
#elif (defined __AVR_ATmega6490A__)
45
#elif (defined __AVR_ATmega6490P__)
46
#elif defined (__AVR_ATmega649P__)
47
#elif defined (__AVR_ATmega64HVE__)
48
#elif defined (__AVR_ATmega64HVE2__)
49
#elif defined (__AVR_ATmega103__)
50
#elif defined (__AVR_ATmega32__)
51
#elif defined (__AVR_ATmega32A__)
52
#elif defined (__AVR_ATmega323__)
53
#elif defined (__AVR_ATmega324P__)
54
#elif (defined __AVR_ATmega324A__)
55
#elif defined (__AVR_ATmega324PA__)
56
#elif defined (__AVR_ATmega325__)
57
#elif (defined __AVR_ATmega325A__)
58
#elif defined (__AVR_ATmega325P__)
59
#elif defined (__AVR_ATmega325PA__)
60
#elif defined (__AVR_ATmega3250__) 
61
#elif (defined __AVR_ATmega3250A__)
62
#elif defined (__AVR_ATmega3250P__)
63
#elif defined (__AVR_ATmega3250PA__)
64
#elif defined (__AVR_ATmega328P__)
65
#elif (defined __AVR_ATmega328__)
66
#elif defined (__AVR_ATmega329__)
67
#elif (defined __AVR_ATmega329A__)
68
#elif defined (__AVR_ATmega329P__) 
69
#elif (defined __AVR_ATmega329PA__)
70
#elif (defined __AVR_ATmega3290PA__)
71
#elif defined (__AVR_ATmega3290__)
72
#elif (defined __AVR_ATmega3290A__)
73
#elif defined (__AVR_ATmega3290P__)
74
#elif defined (__AVR_ATmega32HVB__)
75
#elif defined (__AVR_ATmega32HVBREVB__)
76
#elif defined (__AVR_ATmega406__)
77
#elif defined (__AVR_ATmega16__)
78
#elif defined (__AVR_ATmega16A__)
79
#elif defined (__AVR_ATmega161__)
80
#elif defined (__AVR_ATmega162__)
81
#elif defined (__AVR_ATmega163__)
82
#elif defined (__AVR_ATmega164P__)
83
#elif (defined __AVR_ATmega164A__)
84
#elif defined (__AVR_ATmega164PA__)
85
#elif defined (__AVR_ATmega165__)
86
#elif defined (__AVR_ATmega165A__)
87
#elif defined (__AVR_ATmega165P__)
88
#elif defined (__AVR_ATmega165PA__)
89
#elif defined (__AVR_ATmega168__)
90
#elif defined (__AVR_ATmega168A__)
91
#elif defined (__AVR_ATmega168P__)
92
#elif defined (__AVR_ATmega168PA__)
93
#elif defined (__AVR_ATmega168PB__)
94
#elif defined (__AVR_ATmega169__)
95
#elif (defined __AVR_ATmega169A__)
96
#elif defined (__AVR_ATmega169P__)
97
#elif defined (__AVR_ATmega169PA__)
98
#elif defined (__AVR_ATmega8HVA__)
99
#elif defined (__AVR_ATmega16HVA__)
100
#elif defined (__AVR_ATmega16HVA2__)
101
#elif defined (__AVR_ATmega16HVB__)
102
#elif defined (__AVR_ATmega16HVBREVB__)
103
#elif defined (__AVR_ATmega8__)
104
#elif defined (__AVR_ATmega8A__)
105
#elif defined (__AVR_ATmega48__)
106
#elif defined (__AVR_ATmega48A__)
107
#elif defined (__AVR_ATmega48PA__)
108
#elif defined (__AVR_ATmega48PB__)
109
#elif defined (__AVR_ATmega48P__)
110
#elif defined (__AVR_ATmega88__)
111
#elif defined (__AVR_ATmega88A__)
112
#elif defined (__AVR_ATmega88P__)
113
#elif defined (__AVR_ATmega88PA__)
114
#elif defined (__AVR_ATmega88PB__)
115
#elif defined (__AVR_ATmega8515__)
116
#elif defined (__AVR_ATmega8535__)

Kommt Dir einer davon bekannt vor?

> -mmcu=atmega16

Das ist auch falsch. Irgendwo in deinen Projekteinstellungen ist immer 
noch der falsche Mikrocontroller eingestellt.

> AVRDUDEOPTIONS -p16

Auch das wäre nur für den ATmega16 richtig. Ändere das mal auf 
"atmega328p" (avrdude unterstützt lange und kurze Schreibweise).

Beachte, dass du einige Einstellungen (z.B. dein mittlerer Screenshot) 
für Debug und Release Builds separat einstellen kannst/musst.

von Frank (Gast)


Lesenswert?

Stefanus F. schrieb:
> Das ist auch falsch. Irgendwo in deinen Projekteinstellungen ist immer
> noch der falsche Mikrocontroller eingestellt.

Das ist ja das problem. Ich finde keine Einstellung wo ich das machen 
kann.

Im Bild Properties.png habe ich es auf atmega328p gestellt.

In Settings wurde es aber nicht übernommen. dort steht immer noch 
atmega16

In Symbols kann ich zwar Define Syms (-D) angeben, aber nicht den 
ControllerTyp (-mmcu)

von Stefan F. (Gast)


Lesenswert?

>  Ich finde keine Einstellung wo ich das machen kann.

Dann lege doch einfach ein neues Projekt an und stelle dieses mal von 
Anfang an den richtigen µC ein.

von Frank (Gast)


Lesenswert?

Stefanus F. schrieb:
> Dann lege doch einfach ein neues Projekt an und stelle dieses mal von
> Anfang an den richtigen µC ein.

Ich habe beim erstellen dieses Projektes den richtigen Controller 
angegeben. Aber der wurde, warum auch immer,nicht übernommen.

Ich hatte auch schon einmal ein neues PRojekt angelegt. Aber das 
Verhalten ist immer das selbe. Beim Anlegen kann ich zwar den Controller 
ändern, aber im Projekt springt der dann immer wieder auf dem ATmega16 
zurück

von Stefan F. (Gast)


Lesenswert?

Frank schrieb:
> Stefanus F. schrieb:
>> Dann lege doch einfach ein neues Projekt an und stelle dieses mal von
>> Anfang an den richtigen µC ein.
>
> Ich habe beim erstellen dieses Projektes den richtigen Controller
> angegeben. Aber der wurde, warum auch immer,nicht übernommen.
>
> Ich hatte auch schon einmal ein neues PRojekt angelegt. Aber das
> Verhalten ist immer das selbe. Beim Anlegen kann ich zwar den Controller
> ändern, aber im Projekt springt der dann immer wieder auf dem ATmega16
> zurück

Vielleicht kommst du mit einer anderen IDE besser klar, zum Beispiel QT 
Creator.

von Matthias H. (muetze72)


Lesenswert?

Hatte ein ähnliches Problem, Einstellungen werden nicht akzeptiert bzw. 
AVR->Target Hardware nicht vorhanden. Liegt vermutlich daran, dass das 
AVR-Plugin von neueren Eclipse-Versionen nicht mehr vollständig 
unterstützt wird. Ich habe das ältere Eclipse 3.8.1 installiert. Damit 
hat es dann funktioniert.

von Bernd K. (prof7bit)


Lesenswert?

Das AVR-Plugin hatte mal nen Bug der sich folgendermaßen äußerte:

Es war zwar der richtige Controller eingestellt aber benutzt hat er die 
Header für nen anderen Controller.

Geholfen hat dann immer:

* Einstellungen öffnen, irgendeinen anderen Controller einstellen, 
speichern.
* Einstellungen öffnen, wieder den richtigen Controller einstellen, 
speichern.

Danach war der Fehler für dieses Projekt ein für allemal behoben, es 
tauchte nur immer bei neu angelegten Projekten auf!

: Bearbeitet durch User
von Carl D. (jcw2)


Lesenswert?

Matthias H. schrieb:
> Hatte ein ähnliches Problem, Einstellungen werden nicht akzeptiert bzw.
> AVR->Target Hardware nicht vorhanden. Liegt vermutlich daran, dass das
> AVR-Plugin von neueren Eclipse-Versionen nicht mehr vollständig
> unterstützt wird. Ich habe das ältere Eclipse 3.8.1 installiert. Damit
> hat es dann funktioniert.

Ich hab das seit einiger Zeit auch und erst kürzlich bemerkt, daß wohl 
beim Anlegen eines neuen Projekts die "AVR-Nature" nicht hinzugefügt 
wird. Dann wird für "ATmega16" übersetzt.
 Wenn man die fehlende Nature von Hand hinzufügt, dann funktioniert 
wieder alles wie gewohnt. Ich kann nur aktuell mangels Eclipse auf dem 
IPad nicht genau beschreiben welche Clicks dafür notwendig sind.

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.