PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : AVR Studio 4 mit winAVR bringt seltsame Fehler beim build



karmek
16.10.2007, 10:31
Hallo zusammen,
ich hoffe Ihr könnt mir weiterhelfen, ich komme nicht mehr wirklich weiter.
Ich wollte ein wenig mit den Timern experiementieren und darüber einen Interupt auslösen lassen.

Hier mal mein Beispielcode:



#define F_CPU 3686400 // Taktferquenz des myAVR-Boards
#include <avr/io.h> // AVR Register und Konstantendefinitionen
#include <avr/interrupt.h>
#include <inttypes.h>
#include <stdlib.h>
//----------------------------------------------------------------------
main () // Hauptprogramm, startet bei Power ON und Reset
{
TCCR0 |= (1<<CS00)|(1<<CS02);
sei(); // Interupts aktivieren (Global Interupt Enable)
DDRB = (1<<PB0); // PB0 an PORTB als Ausgang setzen
do { // Schleifenanfang Mainloop
ISR (TIMER0_OVF_vect)
{
PORTB ^= (1 << PB0); // Toggle PB0 z.B. angeschlossene LED
}
PORTB ^= (0 << PB0);
} while (true); // Schleifenende Mainloop
}


beim Versuch das ganze zu brennen erhielt ich dann beim myAVR Workpad folgende Fehlermeldung:

compilieren ... timer.cc In function `int main()':
timer.cc:26 26: error: expected unqualified-id before string constant
timer.cc:27 27: error: a function-definition is not allowed here before '{' token


Habe dann irgendwo gelesen, dass es ein bug im myAVR Workpad sein könnte und man eine spezielle Beta benötigt, oder auf winavr umsteigen soll, daher versuche ich derzeit auf winavr umzusatteln. Im Idealfall würde ich es gerne zusammen mit AVR Studio 4 nutzen.

Ich habe also winavr installiert, danach avrstudio und mein Programm geladen. Folgendes erhalte ich beim Build:

avr-gcc.exe -mmcu=atmega8 -Wall -gdwarf-2 -O0 -MD -MP -MT timer.o -MF dep/timer.o.d -c ../timer.c
../timer.c:30: warning: return type defaults to 'int'
../timer.c: In function 'main':
../timer.c:36: error: static declaration of '__vector_9' follows non-static declaration
../timer.c:35: error: previous declaration of '__vector_9' was here
../timer.c:40: error: 'true' undeclared (first use in this function)
../timer.c:40: error: (Each undeclared identifier is reported only once
../timer.c:40: error: for each function it appears in.)
../timer.c:41: warning: control reaches end of non-void function
make: *** [timer.o] Error 1
Build failed with 5 errors and 2 warnings...


Wenn ich nur mit winavr arbeite, verstehe ich nicht so ganz was ich in den makefiles einstellen muss... Kann sich jemand von euch den Fehler erklären? Danke schonmal

EDIT:
Habe grade offenbar eine Makefile für winavr hinbekommen, bin nicht sicher wo das Problem lag, jedenfalls klappte es nachdem ich ein neues Projekt und eine neue Makefile genommen habe. Nun stehe ich aber mit winavr vor der gleichen Problematik wie beim avr studio. Irgendwie gefallen Ihm meine libs wohl nicht ?

Grüße
Dennis

Jahn Kohlhas
16.10.2007, 11:53
Hallo,

die Fehlermeldung ist kein Bug im Workpad sondern ein Bug in deinem Code ;-)



#define F_CPU 3686400 // Taktferquenz des myAVR-Boards
#include <avr/io.h> // AVR Register und Konstantendefinitionen
#include <avr/interrupt.h>
#include <inttypes.h>
#include <stdlib.h>
//----------------------------------------------------------------------
main () // Hauptprogramm, startet bei Power ON und Reset
{
TCCR0 |= (1<<CS00)|(1<<CS02);
sei(); // Interupts aktivieren (Global Interupt Enable)
DDRB = (1<<PB0); // PB0 an PORTB als Ausgang setzen
do { // Schleifenanfang Mainloop
PORTB ^= (0 << PB0);
} while (true); // Schleifenende Mainloop
}

// eine ISR ist eine Funktion und kann damit nicht
// mitten im Code einer anderen Funktion deklariert werden
// sondern muss einzeln außerhalb jeder Funktion stehen
ISR (TIMER0_OVF_vect)
{
PORTB ^= (1 << PB0); // Toggle PB0 z.B. angeschlossene LED
}



Kommentar ist im Code ;-) und probiers noch mal mit dem Workpad

Grüße Jahn

karmek
16.10.2007, 12:06
danke, das hatte ich total vergessen :) Ich probiers nochmal. Muss ich dann nicht innerhalb meiner Hauptschleife die Funktion aufrufen? Den Eintrag hast du nämlich nicht im Code drin. Das verwirrt mich etwas.

Edit:
die LED blinkt nun fleissig. Ich musste noch TIMSK = (1<<TOIE0); in meinem main- Code ergänzen. ISR muss offenbar nicht als Funktion in der do-while Schleife aufgerufen werden. Das geschieht anscheinend selbstständig von der Hardware, sobald der Overflow ausgelöst wird.
Danke für die Hilfe.

Grüße
Dennis

karmek
16.10.2007, 12:41
Okay nun ein anders Problem:
Ich habe jetzt den mit myAVR Workpad funktionierenden Code in winAVR übernommen und möchte es compilieren. Wenn ich über Tool-> make all starte, erhalte ich folgende Fehlermeldung:


> "make.exe" all

-------- begin --------
avr-gcc (GCC) 4.1.2 (WinAVR 20070525)
Copyright (C) 2006 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.


Size before:
AVR Memory Usage
----------------
Device: atmega8

Program: 150 bytes (1.8% Full)
(.text + .data + .bootloader)

Data: 0 bytes (0.0% Full)
(.data + .bss + .noinit)




Compiling C: main.c
avr-gcc -c -mmcu=atmega8 -I. -gdwarf-2 -DF_CPU=3686400UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=./main.lst -std=gnu99 -Wundef -MMD -MP -MF .dep/main.o.d main.c -o main.o
main.c:14:1: warning: "F_CPU" redefined
<command line>:1:1: warning: this is the location of the previous definition
main.c: In function 'main':
main.c:34: error: 'true' undeclared (first use in this function)
main.c:34: error: (Each undeclared identifier is reported only once
main.c:34: error: for each function it appears in.)
make.exe: *** [main.o] Error 1

> Process Exit Code: 2
> Time Taken: 00:01

Was genau fehlt meinem winavr noch? Müsste irgend ein Include sein, oder?

askazo
16.10.2007, 12:49
'true' ist in WinAVR nirgendwoi definiert.
Entweder definierst Du es Dir selber per
#define true 1
oder Du ersetzt es einfach selber durch eine 1.

Gruß,
askazo

karmek
16.10.2007, 12:56
Ah, das hat das Problem tatsächlich gelöst, danke :) Offenbar fehlt alles im Bezug auf bool zeugs, kann auch keine variable vom Typ bool deklarieren.
Kann man das irgendwie eleganter hinbekommen?

Grüße
Dennis

askazo
16.10.2007, 13:43
Ich verwende dafür eine header-Datei, die ich in jedes Projekt einbinde.
Darin sind dann so Sachen wie true, false, BYTE, WORD, bool etc. definiert.

askazo

karmek
16.10.2007, 15:54
kannst du mir die vielleicht zukommen lassen? Wäre echt super. Kann dir meine Mailadresse oder was du halt präferierst zukommen lassen.

askazo
17.10.2007, 10:47
Ich kann's auch ganz einfach hier posten :)

defines.h

#ifndef __DEFINES_H__
#define __DEFINES_H__

#define true 1
#define false 0

typedef unsigned char bool;
typedef unsigned char BYTE;
typedef unsigned short WORD;
typedef unsigned long DWORD;
typedef volatile unsigned char VBYTE;
typedef volatile unsigned short VWORD;
typedef volatile unsigned long VDWORD;

#define SetBit(ADDRESS,BIT) ((ADDRESS) |= (1<<(BIT)))
#define ClrBit(ADDRESS,BIT) ((ADDRESS) &= ~(1<<(BIT)))

#define LOBYTE(w) ((BYTE)(w))
#define HIBYTE(w) ((BYTE)(((WORD)(w) >> 8) & 0xFF))

#define MAKEWORD(lo, hi) ((WORD)(((BYTE)(lo)) | ((WORD)((BYTE)(hi))) << 8))


#endif // !__DEFINES_H__

Gruß,
askazo

karmek
20.10.2007, 10:50
super, danke :)