Forum: Compiler & IDEs WinAVR kompiliert nichtmal leeres Programm


von Christian Heigele (Gast)


Lesenswert?

Ahoi!
Ich steige grad in C /(für AVR) ein, und da ich das letzte Mal einen
Makefile error gehabt habe, hat mir jmd. empfohlen n neuen Order mit
ner angepassten Makefile und ner leeren c-Datei zu machen.
Ok. Hab ich getan, allerdings kommt jetzt dieser Fehler:

Linking: test.elf
avr-gcc -mmcu=atmega8 -I. -gstabs   -Os -funsigned-char
-funsigned-bitfields -fpack-struct -fshort-enums -Wall
-Wstrict-prototypes -Wa,-adhlns=test.o  -std=gnu99
-Wp,-M,-MP,-MT,test.o,-MF,.dep/test.elf.d test.o    --output test.elf
-Wl,-Map=test.map,--cref    -lm
C:/WinAVR/bin/../lib/gcc/avr/3.4.1/../../../../avr/lib/avr4/crtm8.o(.ini 
t9+0x0):
undefined reference to `main'
make.exe: *** [test.elf] Error 1

Das Target = main in der Makefile wurde auf Target = test gesetzt.
Muss ich da doch eine
void main()
{

}
machen?
#grs

von ElMachel (Gast)


Lesenswert?

Hi,

ja, jedes C Programm braucht die Funktion main() als
Einstiegspunkt, ansonsten brint der Linker obige Fehlermeldung

mfg
Christian

von Christian Heigele (Gast)


Lesenswert?

Juhuuu es kompiliert
Also ich hab jetzt folgenden source:

  #include <avr/io.h>

  #define LED    PB0
  #define PORTLED  DDRB


  int main(void)
  {
    PORTLED |= (1<<LED);
    PORTB |= (1<<LED);

    for(;;)
    {
      PORTB &= ~(1<<LED);
    }
  }

Den kann ich wunderbar compilen, doch wenn ich die .hex auf meinen
ATMEga8 laden will (ich nehme yaap) will der eine .prj
Wie bekomm ich die?
#grs

von Christian Heigele (Gast)


Lesenswert?

okee  blöde Frage (neues Projekt -> File -> Open File)

ABer jetzt was neues:
Warum stimmt folgender Code nicht:

#include <avr/io.h>
  #define LED1    PB0
  #define LED2    PB1
  #define LED3    PB2
  #define PORTLED  DDRB
  int main(void)
    {
    PORTLED |= (1<<LED1);
    PORTB |= (1<<LED1);
    PORTB |= (1<<LED2);
    PORTB |= (1<<LED3);
    for(;;)
    {
      PORTB &= ~(1<<LED1);
      PORTB &= ~(1<<LED2);
      PORTB &= ~(1<<LED3);
    }
  }

#grs

von Chris (Gast)


Lesenswert?

Da fehlen zwei Zeilen:
PORTLED |= (1 << LED2);
PORTLED |= (1 << LED3);

"Das geht nicht" ist aber wirklich keine gute Fehlerbeschreibung.
Bitte beschreib nächstes Mal den Fehler genauer (was erwartest du? was
passiert stattdessen? Bei Fehlermeldungen hilft Copy&Paste).

von Chris (Gast)


Lesenswert?

Ach, die Endlosschleife macht übrigens nichts außer alle drei LEDs für
immer abzuschalten.
Aber da du nicht geschrieben hast was du willst, geh ich mal davon aus,
dass du genau das bewusst bezweckt hast.

von Christian Heigele (Gast)


Lesenswert?

nene die schaltet die für "immer" an
Und den Fehler von Chris hab ich auch schon entdeckt.
Mein Fehler war das ich den chip nicht vorher "erased" habe
#grs

von Chris (Gast)


Lesenswert?

> nene die schaltet die für "immer" an
Ich bleibe bei meiner Meinung.

PORTB &= ~(1<<LED1);
In dem Fall bleiben alle Bits unangetastet außer dem letzten, das auf 0
gesetzt wird. Da du das mit allen 3 LED-Bits machst, sind am Ende alle
Bits auf 0.
Logisch betrachtet sind die LEDs damit "aus". Wie das in deiner
Schaltung aussieht, ist natürlich eine andere Frage (dazu hast du aber
auch keine Infos gegeben).

von Chris (Gast)


Lesenswert?

Bei einzelnen (lowcurrent-)LEDs ist es eh IMHO sinnvoller, die gegen
Masse zu schalten, sodass ein 1-Bit eine LED anschaltet.
Ein ATmega8 hat genau so gute source- wie sink-Fähigkeiten, deswegen
musst du keine Sorge haben den zu überlasten.


p.s.: Warum kann man hier keine Beiträge editieren? :/

von Christian Heigele (Gast)


Lesenswert?

also die sind auch gg. Masse geschalten.
Ups hab ich das etwa vergessen zu erwähnen?
Und es sind sogar ultrahelle LEDs und es tut trotzdem
Zu meinem endgültigen Glück fehlt mir, dass ich die Dinger jetzt noch
dimmen kann (ob mit HardwarePWM oder Software~ ist mir wurschd)
Hat da einer ne Idee?
#grs

von Chris (Gast)


Lesenswert?

Die Idee hast du doch schon selbst genannt? Tut mir Leid, aber ich
versteh deine Frage nicht ganz.

Eine Idee ist nunmal keine fertige, ausprogrammierte Lösung.

von Peter D. (peda)


Lesenswert?

@Chris,

"Bei einzelnen (lowcurrent-)LEDs ist es eh IMHO sinnvoller, die gegen
Masse zu schalten, sodass ein 1-Bit eine LED anschaltet."

Und warum ?

Es ist doch nur eine Ansichtsache, welcher Pegel eine LED anschaltet.


Dagegen ist es bei vielen LEDs nötig, jeweils die eine Hälfte gegen VCC
und die andere gegen GND zu schalten, wenn man die maximale
Strombelastbarkeit des MC ausschöpfen wil.


Peter

von Chris (Gast)


Lesenswert?

> Es ist doch nur eine Ansichtsache, welcher Pegel eine LED anschaltet.

Natürlich. :-)

Mit "sinnvoller" meinte ich hier nur, dass es für viele Leute
logischer erscheint, wenn eine LED bei einem 1-Bit leuchtet und bei
einem 0-Bit nicht.
Das macht prinzipiell natürlich keinen Unterschied. Es gibt bestimmt
viele Personen, die 0 == Leuchten logischer finden (z.B. wg.
Vorwissen).

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.