mikrocontroller.net

Forum: Compiler & IDEs WinAVR kompiliert nichtmal leeres Programm


Autor: Christian Heigele (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: ElMachel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

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

mfg
Christian

Autor: Christian Heigele (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Christian Heigele (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Christian Heigele (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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? :/

Autor: Christian Heigele (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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).

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.