Forum: Compiler & IDEs Compiler/Linker Fehler


von Andreas (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

ich starte gerade neu mit einem Atmel Mega16 und habe mir entsprechend
zum programmieren das WinAVR geladen und installiert.

Wenn ich den Tutorials folge müßte die Initialisierung der Ports z.B.
wie folgt möglich sein:

outp(0x00, DDRA);

Ich habe mein "Programm" bis auf diese Zeile zuzüglich main Fnk.
gekürzt und Compiler und Linker geben folgende
Fehlermeldungen/Warnungen heraus:


> "make.exe" all

-------- begin --------
avr-gcc (GCC) 3.4.3
Copyright (C) 2004 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is
NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE.


Compiling: main.c
avr-gcc -c -mmcu=atmega16 -I. -gdwarf-2 -DF_CPU=8000000UL  -Os
-funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall
-Wstrict-prototypes -Wa,-adhlns=main.lst  -std=gnu99 -MD -MP -MF
.dep/main.o.d main.c -o main.o
main.c: In function `main':
main.c:8: warning: implicit declaration of function `outp'

Linking: main.elf
avr-gcc -mmcu=atmega16 -I. -gdwarf-2 -DF_CPU=8000000UL  -Os
-funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall
-Wstrict-prototypes -Wa,-adhlns=main.o  -std=gnu99 -MD -MP -MF
.dep/main.elf.d main.o --output main.elf -Wl,-Map=main.map,--cref
-lm
main.o(.text+0x12): In function `main':
C:\WinAVR\examples\frk/main.c:8: undefined reference to `outp'
make.exe: *** [main.elf] Error 1

> Process Exit Code: 2


Ich habe überprüft das derCompiler die includes findet -> OK,
ansonsten hab ich keine Idee mehr - vielleicht kann mir ja einer von
Euch einen Tipp geben.

schon mal ein DANKE für alle Antworten.

Andreas

von Chris (Gast)


Lesenswert?

Du scheinst ein stark veraltetes Tutorial zu benutzen, denn outp wurde
schon vor einiger Zeit aus der avr-libc entfernt, da sich exakt das
gleiche mit normalen C-Bitoperationen erreichen lässt (nimm bitte ein
C-Buch deiner Wahl, Stichworte |, &, ^, <<, >>, ~).

von OldBug (Gast)


Lesenswert?

outp hat nichts mit Bitoperationen zu tun!

Lediglich ist seit geraumer Zeit ein

  outp(PORTB, (1 << PB0));

das Gleiche wie

  PORTB = (1 << PB0);

von Chris (Gast)


Lesenswert?

Ups, da ist meine Standardantwort doch glatt aufgeflogen. ;-)


Spätestens wenn es dem OP aber darum geht einzelne Pins zu setzen, wird
er Bitoperatoren brauchen. Also ist es bestimmt kein Fehler, sich dieses
Kapitel im C-Buch durchzulesen.

von mthomas (Gast)


Lesenswert?

Mglw. hat hier die avr-gcc "FAQ" aus dem Hauptmenue dieser Seite
Verwirrung gestiftet. Diese ist stark veraltet. Eine halbwegs aktuelle
Einführung in avr-gcc/avr-libc findet sich im wiki (Artikel avr-gcc
tutorial).

von Andreas (Gast)


Lesenswert?

Hallo,

danke für Euere Antworten - das Problem sind wirklich die Tutorials in
denen noch mit den Makros inp(), outp(), sbi() und cbi() gearbeitet
wird.
Die Wiki AVR-GCC schreibt dazu:

http://www.mikrocontroller.net/wiki/AVR-GCC

inp(), outp(), sbi() und cbi() werden in der aktuellen
Bibliotheksversion nicht mehr unterstützt. Es wurde schon seit längerem
empfohlen, diese Makros nicht mehr zu nutzen. Viele deutschsprachige
Anleitungen sind in diesem Punkt veraltet. Mit aktuellen
avr-gcc/avr-libc-Versionen kann einfach z.B. DDRB=0xfe bzw. foo=PINB
geschrieben werden. Mit PORTB |= _BV(1) setzt man PORTB.1, mit PORTB &=
~_BV(1) löscht man es wieder, mit PORTB ^= _BV(1) kann man es
umschalten. Die ersten beiden Varianten erzeugen bei eingeschalteter
Optimierung und passenden Parametern (wie hier im Beispiel) die SBI
bzw. CBI Prozessorbefehle.


Danke für den Hinweis.
Andreas

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.