Forum: Compiler & IDEs Device Type Not Defined


von S. Oliver (Gast)


Lesenswert?

Ich arbeite zur Zeit fürs Studium an einem Projekt das die
Programmierung eines AVR Chips beinhaltet. Genauer gesagt neutzen wir
den AT90s8515

Habe miir also WinAVR heruntergeladen, installiert und soweit
konfiguriert. Wenn ich nun jedoch im "Programmers Notepad" Make all
wähle (nach ReadMe einegrichtet) Meldet der Compiler das Gerätetyp für
io.h fehlt. Im Makefile steht er jedoch drin:

...
# MCU name
MCU = at90s8515
...

Wenn ich mir den Quelltext von der io.h ansehe steht da drin
....
#elif defined (_AVR_AT90S8515_)
#  include <avr/io8515.h>
....

Muss ich den Chip irgendwie noch im Quelltext des Programms definieren
oder habe ich den Typ falsch deklariert?

Was kann da falsch sein?

Benutze STK500 mit at90s8515. Programmiere mit WinAVR (Version vom
13.09.2003)

Bin für jede Antwort dankbar.
MfG. S. Oliver

von Jörg Wunsch (Gast)


Lesenswert?

Wird denn der MCU-Macro Deines Makefiles auch wirklich in der
Kommandozeile des Compilers ausgewertet?

Ggf. <Eigenwerbung> http://www.sax.de/~joerg/Mfile/ </Eigenwerbung>
benutzen.

von S. Oliver (Gast)


Lesenswert?

Also im Output Fenster steht:
Fehler des Quelltextes sind beabsichtigt arbeite mich gerade durch das
winavr tutorial von avrfraks

...
avr-gcc -g -Os -funsigned-char -funsigned-bitfields -fpack-struct
-fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=test1.lst
-std=gnu99  -Wl,-Map=test1.map,--cref -lm  test1.c   -o test1
In file included from test1.c:1:
C:/WinAVR/avr/include/avr/io.h:225:6: warning: #warning "device type
not defined"
test1.c:4: warning: function declaration isn't a prototype
test1.c:4: warning: return type of `main' is not `int'
test1.c: In function `main':
test1.c:7: error: `DDRB' undeclared (first use in this function)
test1.c:7: error: (Each undeclared identifier is reported only once
test1.c:7: error: for each function it appears in.)
test1.c:11: error: `PORTB' undeclared (first use in this function)
test1.c:30: warning: `return' with a value, in function returning
void
make: *** [test1] Error 1
...

Werde gleich mal dein Tool ausprobieren. Die URL muss übrigens
.../mfile/ sein und nicht Mfile. Aber ich bin schon drauf gekommen.
Aber sowas hält das Hirn zum Denken an *g

von Joerg Wunsch (Gast)


Lesenswert?

> Also im Output Fenster steht:

...

Tja, da ist kein -mmcu=at90s8515 dabei.  Du hast wohl $(CFLAGS)
genommen, Erics Template arbeitet aber mit $(ALL_CFLAGS).  Diese
beiden Macros unterscheiden sich just um die Angabe von -mmcu=$(MCU).

> Die URL muss übrigens .../mfile/ sein und nicht Mfile.

Ja, sorry, hatte ich mir lfasch gemerkt.

von S. Oliver (Gast)


Lesenswert?

Erstmal ein goßes Danke. Schient alles zu funktionieren. Aber das
Programm was ich in der Uni geschrieben habe funktioniert leider nicht.
Was komisch ist weil der Quelltext derselbe ist unt der gcc compiler
des linux rechners in der uni nicht meckert. Auch ich sehe kein
Fehler.

mein Quelltext:
......
#include <io.h>           // Zugriff auf die I/O's des Controllers
#define F_CPU            3600000      /* 3,6 Mhz */
#define UART_BAUD_RATE      9600      /* 9600 baud */

// Berechnung des Inhalts des UBBR-Registers
#define UART_BAUD_SELECT (F_CPU/(UART_BAUD_RATE*16l)-1)

// Datentypdefinitionen
typedef unsigned char  BYTE;
typedef unsigned short  WORD;

// Globale Variablen
char ch;   // Variable zur Speicherung des gelesenen Zeichens

int main (void)  {

       /* UART Control Register laden. Wir verwenden (noch)
       keine Interrupts. Vorerst wollen wir nur mal senden, also wird
       nur das Transmitter Enable Flag gesetzt. */
    outp ((1 << RXEN) | (1 << TXEN), UCR);

    /* Baudrate einstellen */
    outp ((BYTE) UART_BAUD_SELECT, UBRR);

    outp (0xff,DDRC);  // Port B als Ausgang

while (1) {                           // Endlosschleife
    if (inp (USR) & (1 << RXC)) {    // Bit RXC im USR gesetzt ?
        ch = inp (UDR);              // Datenregister auslesen
    }
    outp ( ch , UDR);
    outp (255-ch,PORTC);
  }
}

Ich habe von das MFile Tool von dir benutzt um das Makefile zu
erstellen. Großartiges Programm. Tut genau das was es soll. Habe also
darin einfach den MCU geändert und das Target angepasst.

Aber im Output Fenster stehen folgende Fehler:
Compiling: senden.c
avr-gcc -c -mmcu=atmega128 -I. -g   -Os -funsigned-char
-funsigned-bitfields -fpack-struct -fshort-enums -Wall
-Wstrict-prototypes -Wa,-adhlns=senden.lst  -std=gnu99
-Wp,-M,-MP,-MT,senden.o,-MF,.dep/senden.o.d senden.c -o senden.o
senden.c: In function `main':
senden.c:21: error: `UCR' undeclared (first use in this function)
senden.c:21: error: (Each undeclared identifier is reported only once
senden.c:21: error: for each function it appears in.)
senden.c:24: error: `UBRR' undeclared (first use in this function)
senden.c:29: error: `USR' undeclared (first use in this function)
senden.c:30: error: `UDR' undeclared (first use in this function)
make: *** [senden.o] Error 1

Da ich mir nur vorstellen kann das das Makefile schuld ist. Weil der
Quelltext in der Uni funktioniert, wolte ich dich also nochmals um Rat
fragen.

MfG.S. Oliver

von Jörg Wunsch (Gast)


Lesenswert?

Erstmal diverse Kleinigkeiten:

> #include <io.h>

#include <avr/io.h> bitte.  Alle AVR-spezifischen includes haben wir
in das Unterverzeichnis avr verschoben.  Im toplevel sollten nur noch
die benutzt werden, die durch irgendeinen Standard (C89, C99, Posix,
...) bekannt sind.

> typedef unsigned char BYTE;

Die übliche Konvention ist, GROSSBUCHSTABEN nur für Präprozessor-
Makros zu benutzen.

> outp ((1 << RXEN) | (1 << TXEN), UCR);

inp()/outp() sind `deprecated'.

UCR = (1 << RXEN) | (1 << TXEN);

Wenn es nicht portabel sein muß, kannst Du auch den _BV-Makro der
avr-libc nehmen:

UCR = _BV(RXEN) | _BV(TXEN);

Sieht (meiner Meinung nach) ein wenig übersichtlicher aus.

> Großartiges Programm. Tut genau das was es soll.

Danke.  Genau dafür ist es ja auch geschrieben. ;-)  Es sollte
ausdrücklich keine eierlegende Wollmilchsau werden, sondern halt
exakt diese eine Aufgabe erfüllen.

> ... -mmcu=atmega128 ...
> senden.c:21: error: `UCR' undeclared (first use in this function)

Verschiedene AVRs, verschiedene Registernamen. :-(

Sieh mal ins Datenblatt, wie diese beim ATmega128 heißen.  Das fängt
ja schon damit an, daß der M128 zwei USARTs hat und nicht nur eine.
Weiterhin hat er pro USART nicht nur ein, sondern zwei control und
status registers (UCSRnA/B) sowie ein in low und high geteiltes
Baudratenregister (wobei Du den High-Teil für ,,gewöhnliche''
Datenraten ignorieren kannst).

Du kannst Dir dann mit einem Konstrukt helfen wie:

#if defined(_ATmega128_)
...
#define UDR UDR0
...
#endif

von S. Oliver (Gast)


Lesenswert?

Juju. Hat alles geklappt. Danke für die Hinweise mit dem Quelltext.
Werde versuchen mich zu bessern und näher an den Konventionen zu
arbeiten.

Aber ich bin ja jetzt echt froh das das jetzt alles klappt. Endlich
kann ich mal mein STK 500 in "Action" sehen.

Nochmals Danke für deine Hilfe.

MfG.S. Oliver

P.S. Werde jetzt noch kurz mit Interruots beschäftigen bevor ich ins
Bett geh...

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.