Hallo, ich habe ein Problem. Vielleicht kann mir jemand weiter helfen. Danke. Ich benutze AVR Studio V4.19 Ich möchte in c Programmieren. Ich benutzt eine ATMega8. Ich möchte globale Variablen erzeugen. Im Anhang sind die *.c und *.h Dateien Nach meine Verständniss Deklariere ich die globalen Variablen in prototypes.h. In prototypes.c Defeniere ich diese globalen Variablen. In den anderen*.c Dateien habe ich mit #include <prototypes.h> diese Deklaration mit integriert. Beim Übersetzen bekomme ich folgende Fehlermeldung: rm -rf Varriable.o Varriable.elf dep/* Varriable.hex Varriable.eep Varriable.lss Varriable.map Build succeeded with 0 Warnings... avr-gcc -I"C:\AVR_Studio\Varriable\header" -mmcu=atmega8 -Wall -gdwarf-2 -Os -std=gnu99 -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT Varriable.o -MF dep/Varriable.o.d -c ../Varriable.c avr-gcc -I"C:\AVR_Studio\Varriable\header" -mmcu=atmega8 -Wall -gdwarf-2 -Os -std=gnu99 -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT Initialisierung.o -MF dep/Initialisierung.o.d -c ../Initialisierung.c avr-gcc -I"C:\AVR_Studio\Varriable\header" -mmcu=atmega8 -Wall -gdwarf-2 -Os -std=gnu99 -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT ISR.o -MF dep/ISR.o.d -c ../ISR.c avr-gcc -I"C:\AVR_Studio\Varriable\header" -mmcu=atmega8 -Wall -gdwarf-2 -Os -std=gnu99 -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT prototypes.o -MF dep/prototypes.o.d -c ../prototypes.c ../prototypes.c: In function 'var': ../prototypes.c:9:6: warning: unused variable 'a' [-Wunused-variable] ../prototypes.c:8:6: warning: unused variable 'BERE' [-Wunused-variable] ../prototypes.c:7:6: warning: unused variable 'DSEK' [-Wunused-variable] avr-gcc -mmcu=atmega8 -Wl,-Map=Varriable.map Varriable.o Initialisierung.o ISR.o prototypes.o -o Varriable.elf Varriable.o: In function `main': C:\AVR_Studio\Varriable\default/../Varriable.c:14: undefined reference to `BERE' C:\AVR_Studio\Varriable\default/../Varriable.c:14: undefined reference to `BERE' C:\AVR_Studio\Varriable\default/../Varriable.c:17: undefined reference to `a' C:\AVR_Studio\Varriable\default/../Varriable.c:18: undefined reference to `BERE' C:\AVR_Studio\Varriable\default/../Varriable.c:18: undefined reference to `BERE' Initialisierung.o: In function `init': C:\AVR_Studio\Varriable\default/../Initialisierung.c:6: undefined reference to `DSEK' C:\AVR_Studio\Varriable\default/../Initialisierung.c:6: undefined reference to `DSEK' C:\AVR_Studio\Varriable\default/../Initialisierung.c:7: undefined reference to `BERE' C:\AVR_Studio\Varriable\default/../Initialisierung.c:7: undefined reference to `BERE' C:\AVR_Studio\Varriable\default/../Initialisierung.c:8: undefined reference to `a' C:\AVR_Studio\Varriable\default/../Initialisierung.c:8: undefined reference to `a' ISR.o: In function `__vector_6': C:\AVR_Studio\Varriable\default/../ISR.c:9: undefined reference to `DSEK' C:\AVR_Studio\Varriable\default/../ISR.c:9: undefined reference to `DSEK' C:\AVR_Studio\Varriable\default/../ISR.c:9: undefined reference to `DSEK' C:\AVR_Studio\Varriable\default/../ISR.c:9: undefined reference to `DSEK' C:\AVR_Studio\Varriable\default/../ISR.c:12: undefined reference to `BERE' C:\AVR_Studio\Varriable\default/../ISR.c:12: undefined reference to `BERE' C:\AVR_Studio\Varriable\default/../ISR.c:14: undefined reference to `a' C:\AVR_Studio\Varriable\default/../ISR.c:14: undefined reference to `a' C:\AVR_Studio\Varriable\default/../ISR.c:14: undefined reference to `a' C:\AVR_Studio\Varriable\default/../ISR.c:14: undefined reference to `a' C:\AVR_Studio\Varriable\default/../ISR.c:15: undefined reference to `DSEK' C:\AVR_Studio\Varriable\default/../ISR.c:15: undefined reference to `DSEK' collect2: ld returned 1 exit status make: *** [Varriable.elf] Fehler 1 Build failed with 23 errors and 3 warnings... Habe ich ein Problem in dem Programm, oder mit dem AVR Studio (Toolchain)???
:
Verschoben durch Admin
Du hast leider die paar Zeilen Header und C-File Code nicht angefügt. Ich nehme jetzt als Beispiel die Variable DSEK und unterstelle int. in prototypes.h:
1 | extern int DSEK; |
in der prototypes.c
1 | int DSEK; |
Ist das so bei Dir? Oder hast Du irgendwo >static< oder was andere mit beigemixed?
Schlimmer: Sie sind nur innerhalb einer Funktion "var()" und nicht global deklariert. Bei "static" würde das IMHO in der Warning mit stehen.
:
Bearbeitet durch User
Ja das stimmt. in der header Datei : extern int a; und in der prototypes.c : int a;
Ich hatte var(); auch vor die main() gesetzt. Aber da bekamm ich die selbe Fehlermeldung zu den Variablen in den einzelnen Funktionen.
Hallo, in der Datei prototypes.h sind die Zeilen 4 - 6 mit den Varriablen. Und die Datei prototypes.c habe ich vergessen mit hoch zu laden. Entschuldigung.
Hallo, folgende Fehlermeldung bekomme ich, wenn ich var(); vor die main-Schleife setze: Build started 30.10.2016 at 01:09:29 avr-gcc -I"C:\AVR_Studio\Varriable\header" -mmcu=atmega8 -Wall -gdwarf-2 -Os -std=gnu99 -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT Varriable.o -MF dep/Varriable.o.d -c ../Varriable.c ../Varriable.c:4:1: warning: data definition has no type or storage class [enabled by default] ../Varriable.c:4:1: warning: type defaults to 'int' in declaration of 'var' [enabled by default] ../Varriable.c:4:1: error: conflicting types for 'var' C:\AVR_Studio\Varriable\header/prototypes.h:9:13: note: previous declaration of 'var' was here make: *** [Varriable.o] Fehler 1 Build failed with 1 errors and 2 warnings... Ich habe mehrere Sachen ausprobiert und bin langsam am verzweifeln. In dem Buch "Softwareentwicklung in C für Mikroprozessoren und Mikrocontroller" von Jörg Wiegelmann klingt es so einfach und logisch. Deshalb habe ich bedenken, dass an den Einstellungen von AVR Studio etwas nicht stimmt.
Mein Freund, ich weiß gar nicht wo ich anfangen soll... Aber kritisieren können hier schon viel zu viele, fangen wir mit etwas Sinnvollem an: 1.) Du installierst dir die neueste Version von AVR Studio (7.0). Ist immer noch kostenlos erhältlich. 2.) Es gibt eine positive Nachricht: Das Konzept von .c und .h - Dateien hast du (beinah) verstanden. In der Praxis macht man es eher anders mit der Verwaltung und Verteilung von Variablen und includes, aber lassen wir das erstmal. 3.) Ich war so lieb und habe für dich das Ganze als Projekt in AVR Studio 7.0 aufgestellt und ohne Fehler für den ATmega8 kompilliert. Bittesehr, nun öffne dies und lies Punkt 4. 4.) Dein größter Fehler war: Lokale .h -Dateien werden nicht #include <prototypes.h> geschrieben, sondern #include "prototypes.h". Merkst du den Unterschied? Anführungszeichen für Daten, die im gleichen Ordner liegen, wie deine main.c (deine ehemalige Varriable.c) und <> - Tags für Bibliotheken in deinem AVR-Verzeichnis (also global). Außerdem liegt bei mir die STD-Lib in #include <stdlib.h> 5.) Verwende Datentypen, an denen du ihre Speichergröße erkennst, also int8_t/uint8_t, int16_t/uint16_t anstatt int, long etc. Hat den Vorteil, dass du nicht durcheinanderkommst, wie zum Beispiel bei der Portzuweisung PORTC = a. Portregister C hat nämlich 8 Bits, also ein Byte. Deine Variable a ist vom Datentyp int, also int16_t, was also 16 Bits oder zwei Bytes entspricht. 6.) Übe fleißig und programmiere viel. Verwende nicht nur eine Quelle (dein Buch da), sondern recherchiere fleißig. Mit etwas Geduld wird es.
P.S.: Achja, die "extern"-Bezeichner habe ich ebenfalls entfernt. Brauchst du hier nicht.
P.P.S.: du solltest auch eine Interruptfreigabe durch ein sei(); vor der while()-Schleife in der main.c einsetzen, andernfalls wird deine ISR nicht ausgeführt. Noch viele andere Sachen, aber fange erstmal damit an ;)
Michael S. schrieb: > Hallo, > > folgende Fehlermeldung bekomme ich, wenn ich var(); vor die > main-Schleife setze: Du kannst Funktionen nicht außerhalb von anderen Funktionen aufrufen. Und du kannst globale Variablen nicht in Funktionen definieren. Genau das macht sie nämlich zu lokalen Variablen. Was du also machen musst, ist die Definition der Variablen aus der Funktion var() rausziehen.
Hallo ProjektX, danke für deine Mühe. Zu Punkt 1. Danke für den Tipp. Bin gerade dabei 7.0 zu installieren. Zu Punkt 4. Ich wollte meine Headerdatein an einem gesammelten Ort ablegen und nicht in dem Projektordner. Aber vielen Dank für den Tipp. Jetzt verstehe ich, warum es bei mir nicht mit denn "xx" funktioniert hat, aber mit dem <xx>. zu Punkt 5. Ich werde mir dass mit den richtigen Speichergrößen sofort angewöhnen. Danke zu Punkt 6. Ich habe auch im Internet nachgelesen. Dort wird in der Headerdatei auch das "extern" mit genutzt. Wenn ich bei mir in der Headerdatei das "extern" weg lasse, lässt sich das Projekt auch fehlerfrei compilieren. Aber beim Debuggen wirkt die Variable "BERE" nicht global. In der ISR wird Register R24 auf 1 gesetzt. Am Ende der ISR springt das Programm wieder in die main(). Bei der Abfrage des Unterprogramms (if (BERE ==1)) springt das Programm nie in das Unterprogramm. Und da glaube ich, fehlt das extern in der Headerdatei, um die Variable als global zu deklarieren. (Das war übrigens meine Ausgangssituation, warum ich das Buch und das Internet zu rate gezogen habe.) Danke für deine Mühe
> Zu Punkt 1. Danke für den Tipp. Bin gerade dabei 7.0 zu installieren. Ist für alle Beteiligten und vorallem dich selbst besser, glaub mir. > Zu Punkt 4. Ich wollte meine Headerdatein an einem gesammelten Ort ablegen und nicht in dem Projektordner. Aber vielen Dank für den Tipp. Jetzt verstehe ich, warum es bei mir nicht mit denn "xx" funktioniert hat, aber mit dem <xx>. Wenn du in deinem Projekt Ordner mit includes hast, dann verwendest du eine sog. relative Pfadangabe, sowas wie
1 | #include "../unterordner/test.h" |
Generell würde ich aber sagen, dass du für jedes deiner Projekte die benötigten .c und .h -Dateien mit zu den Projektdateien kopierst. Gibt einfach weniger Probleme. (Dann bist du mal an einem anderen Computer und hast nur die Projektdaten, jedoch nicht deine externen Bibliotheken zur Hand o.ä. Da gibt es aber die Option automatisch alle verwendeten Bibliotheken ins Projektverzeichnis zu kopieren) Zum 6. Punkt: Da verweise ich auf den Beitrag von Rolf Magnus, der natürlich völlig Recht hat. Sprich, der Fehler beim Kompillieren kommt vorrangig davon, dass deine Variablen lokal in var() initialisiert werden. Und eben nicht global, was deine eigentliche Intention war.
Wenn du immer noch irgendwelche Gedankenfehler und darausfolgend auch Codefehler hast, dann poste doch mal den aktuellen Zustand deines Projektes.
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.