- 3D-Druck Einstieg und Tipps         
Ergebnis 1 bis 10 von 10

Thema: AVR Studio 4 mit winAVR bringt seltsame Fehler beim build

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    14.08.2007
    Beiträge
    13

    AVR Studio 4 mit winAVR bringt seltsame Fehler beim build

    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:

    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
    		 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:
    Code:
    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

  2. #2
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    02.03.2005
    Beiträge
    141
    Hallo,

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

    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

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    14.08.2007
    Beiträge
    13
    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

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    14.08.2007
    Beiträge
    13
    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:
    Code:
    > "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?

  5. #5
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    02.11.2005
    Alter
    49
    Beiträge
    1.146
    '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

  6. #6
    Neuer Benutzer Öfters hier
    Registriert seit
    14.08.2007
    Beiträge
    13
    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

  7. #7
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    02.11.2005
    Alter
    49
    Beiträge
    1.146
    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

  8. #8
    Neuer Benutzer Öfters hier
    Registriert seit
    14.08.2007
    Beiträge
    13
    kannst du mir die vielleicht zukommen lassen? Wäre echt super. Kann dir meine Mailadresse oder was du halt präferierst zukommen lassen.

  9. #9
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    02.11.2005
    Alter
    49
    Beiträge
    1.146
    Ich kann's auch ganz einfach hier posten

    defines.h
    Code:
    #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

  10. #10
    Neuer Benutzer Öfters hier
    Registriert seit
    14.08.2007
    Beiträge
    13
    super, danke

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Labornetzteil AliExpress