www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Anfänge in C


Autor: Gerd Vg (gerald)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

nach etlichen Jahren Programmiererei in Assembler wollte ich mir jetzt 
das Leben etwas einfacher machen und meine AVR-Projekte in C 
programmieren.
Ich verwende das AVR-Studio und GCC-Compiler.
Jetzt bekomme ich schon bei den kleinsten Anfängen Probleme.
Ich will nichts anderes machen als eine include-File in mein 
Hauptprogramm einbinden.

Ständig kommt der Fehler:

D:\Entwicklung\Modellbau\Nautiksteuerung\Nautiksteuerung\default/../Naut 
iksteuerung.c:26:  undefined reference to `LED_Init'

Im Moment habe ich drei Files geschrieben:
als main Nautiksteuerung.c
und eine include-File LEDcontrol.c
zusätzlich dazu LEDcontrol.h

das Hauptprogramm:
 
  #include <avr/io.h>
  #include "LEDcontrol.h"

  /**************************************************
  
  Folgende Funktionen sind implementiert:

    LED_Init
  
  **************************************************/

  int main (void)
  {
    LED_Init();
  }


Die include-File .c
 
  #include <avr/io.h>
  #include "LEDcontrol.h"

  /*** Funktion LED_Init ***/

  void LED_Init (void);
  {
  DDRB |= (1<<DDB0) | (1<<DDB1);
  PORTB |= (1<<PB0) | (1<<PB1);
  }

und ebenso diese .h -File

  /***** verwendete Definitionen ********/

  void  LED_Init (void);


Alle Files stehen im gleichen Verzeichnis.

die make-File hat diesen Inhalt:
###############################################################################
# Makefile for the project Nautiksteuerung
###############################################################################

## General Flags
PROJECT = Nautiksteuerung
MCU = atmega162
TARGET = Nautiksteuerung.elf
CC = avr-gcc

## Options common to compile, link and assembly rules
COMMON = -mmcu=$(MCU)

## Compile options common for all C compilation units.
CFLAGS = $(COMMON)
CFLAGS += -Wall -gdwarf-2 -Os -std=gnu99 -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums
CFLAGS += -MD -MP -MT $(*F).o -MF dep/$(@F).d 

## Assembly specific flags
ASMFLAGS = $(COMMON)
ASMFLAGS += $(CFLAGS)
ASMFLAGS += -x assembler-with-cpp -Wa,-gdwarf2

## Linker flags
LDFLAGS = $(COMMON)
LDFLAGS +=  -Wl,-Map=Nautiksteuerung.map


## Intel Hex file production flags
HEX_FLASH_FLAGS = -R .eeprom -R .fuse -R .lock -R .signature

HEX_EEPROM_FLAGS = -j .eeprom
HEX_EEPROM_FLAGS += --set-section-flags=.eeprom="alloc,load"
HEX_EEPROM_FLAGS += --change-section-lma .eeprom=0 --no-change-warnings


## Objects that must be built in order to link
OBJECTS = Nautiksteuerung.o 

## Objects explicitly added by the user
LINKONLYOBJECTS = 

## Build
all: $(TARGET) Nautiksteuerung.hex Nautiksteuerung.eep Nautiksteuerung.lss size

## Compile
Nautiksteuerung.o: ../Nautiksteuerung.c
  $(CC) $(INCLUDES) $(CFLAGS) -c  $<

##Link
$(TARGET): $(OBJECTS)
   $(CC) $(LDFLAGS) $(OBJECTS) $(LINKONLYOBJECTS) $(LIBDIRS) $(LIBS) -o $(TARGET)

%.hex: $(TARGET)
  avr-objcopy -O ihex $(HEX_FLASH_FLAGS)  $< $@

%.eep: $(TARGET)
  -avr-objcopy $(HEX_EEPROM_FLAGS) -O ihex $< $@ || exit 0

%.lss: $(TARGET)
  avr-objdump -h -S $< > $@

size: ${TARGET}
  @echo
  @avr-size -C --mcu=${MCU} ${TARGET}

## Clean target
.PHONY: clean
clean:
  -rm -rf $(OBJECTS) Nautiksteuerung.elf dep/* Nautiksteuerung.hex Nautiksteuerung.eep Nautiksteuerung.lss Nautiksteuerung.map


## Other dependencies
-include $(shell mkdir dep 2>/dev/null) $(wildcard dep/*)

Meine Frage nun, was mache ich falsch?


Gruss

Gerald

Autor: Kasperle (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
void LED_Init (void);
  {
  DDRB |= (1<<DDB0) | (1<<DDB1);
  PORTB |= (1<<PB0) | (1<<PB1);
  }

Semikolon hinter (void)?

Autor: yalu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
LEDcontrol sollte ebenfalls als Bestandteil des Projekts angegeben
werden. Ändere also im Makefile die Zeile

  OBJECTS = Nautiksteuerung.o

in

  OBJECTS = Nautiksteuerung.o LEDcontrol.o

sonst findet der Linker die Funktion LED_Init nicht.

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
  void LED_Init (void);
  {
  DDRB |= (1<<DDB0) | (1<<DDB1);
  PORTB |= (1<<PB0) | (1<<PB1);
  }

Mach mal das Semikolon hinter "void LED_Init(void)" weg, ist mir spontan 
beim Überfliegen aufgefallen

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Auf die schnelle sieht das ganze gut aus, ist wirklich alles Copy+Paste? 
Gross- und Kleinschreibung?

Kopiere mal alles in die Main-Datei "Nautiksteuerung.c" und lasse 
"LEDcontrol.c" und "LEDcontrol.h" weg!

Autor: Kasperle (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ha, ich war schneller.

Autor: yalu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
PS: Ich kenne das AVR-Studio nicht. Möglicherweise gibt es dort eine
Klickibunti-Methode (Menü o.ä.), um eine Datei dem Projekt hinzuzufügen.

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
1. .c Quelldateien bezeichnet man nicht als [[Include-Files (C)]]. .h 
Dateien sind Includefiles und diese werden mit #include ... eingebunden. 
.c Dateien bindet man über das Makefile in ein Projekt ein.

2. Dein Makefile weicht stark von dem Beispiel Makefile ab.

Bei dem Beispiel Makefile würde man die Haupt-C-Source als Target 
nehmen (Nautiksteuerung.c) so wie es auch in [[AVR-GCC-Tutorial/Exkurs 
Makefiles]] beschrieben ist
# Target file name (without extension).
TARGET = Nautiksteuerung

und weitere Sourcen (LEDcontrol.c) in der Zeile mit dem SRC am Anfang 
aufnehmen
# List C source files here. (C dependencies are automatically generated.)
SRC = $(TARGET).c LEDcontrol.c

Autor: yalu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kasperle schrieb:

> Ha, ich war schneller.

Grrr ;-)

Aber: Der von dir entdeckte Fehler ist nicht der einzige. Er wäre vom
Compiler angemeckert worden, sobald der die betreffende Datei zu Gesicht
bekommen hätte. Das ist aber wegen des von mir genannten Fehlers bisher
gar nicht der Fall gewesen :)

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
yalu schrieb:
> PS: Ich kenne das AVR-Studio nicht. Möglicherweise gibt es dort eine
> Klickibunti-Methode (Menü o.ä.), um eine Datei dem Projekt hinzuzufügen.

Gibt es

*Mit AVR-Studio*

Alle *.c Dateien müssen im Projekt aufgenommen werden. Dann erscheinen 
sie auch in dem automatisch generierten Makefile. Ein Beispiel wie das 
Aufnehmen aussieht, steht hier: 
http://www.mikrocontroller.net/articles/Pollin_Fun...

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
yalu schrieb:
> PS: Ich kenne das AVR-Studio nicht. Möglicherweise gibt es dort eine
> Klickibunti-Methode (Menü o.ä.), um eine Datei dem Projekt hinzuzufügen.

Ja, gibt es.
Mit dem Makefile muß (sollte) man sich nicht rumplagen.

Mach mal ein Zip von Deinen Sorcefiles und der Projektdatei *.aps.
Dann kann man im Nu sagen, wos klemmt.

Die Integration des WINAVR in das ARVStudio ist sehr gut gelungen.


Peter

Autor: Gerd Vg (gerald)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich danke allen, die so schnell geantwortet haben.
Der entscheidende Hinweis kam von Stefan B.
Stefan ich danke Dir.
Schade ist, daß sowas nicht im Tut. beschrieben wird, habe nach solchen 
Hinweisen ca. 2 Tage gesucht auch in AVR-Büchern, bloss nichts 
Brauchbares gefunden.
Egal jetzt, kann endlich mit meinem "Befehlsbasteln" anfangen.
Programmieren kommt wohl erst im laufe der Zeit sfg.

Ich wünschen Euch noch einen schönen Abend

Gerald

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.