Forum: Compiler & IDEs AVR schmiert ab bei Funktionen?


von Rene (Gast)


Lesenswert?

Hallo leute

Hab die AVR seit langem nimmer angefasst aber nun schreit mein 
Modellflugzeug nach ner Kamera

Aus dem Grund spiel ich derzeit mal wieder ein bisschen mit meinem mega8 
aber irgendwas geht hier schief

immer dann, wenn ich außer der main noch eine andere funktion definiere 
gibt mir der avr gar nix aus (nichtmal ne led leuchtet, wenn ich die vor 
einem funktionsaufruf ausführe)

folgendes beispiel bringt meine led an pb1 zum leuchten aber kaum, dass 
ich den funktionsaufruf blinken() auskommentiere passiert gar nix mehr

#ifndef F_CPU
#define F_CPU 8000000
#endif

#include <avr/interrupt.h>
#include <util/delay.h>
#include <avr/io.h>
#include <stdarg.h>

int blinken()
{
  int i;
  PORTB |= (1 << PB0);
  for (i=0;i<=1000;i++)
    _delay_ms(1);
  PORTB &= ~(1<<PB0);
  for (i=0;i<=1000;i++)
    _delay_ms(1);

  return 0;
}

int main()
{
  DDRB = (1<<PB0)|(1<<PB1);
  int i;

  PORTB |= (1 << PB1);
  for (i=0;i<=2000;i++)
    _delay_ms(1);
  PORTB &= ~(1<<PB1);

  while (1==1)
  {
    //blinken();
  }
  return 0;
}

nutze die avrlibc in der derzeitigen debian etch

was mach ich da eventuell falsch?

danke schonmal für eure hilfe

von Matthias (Gast)


Lesenswert?

....och eine andere funktion definiere
gibt mir der avr gar nix aus....

....zum leuchten aber kaum, dass
ich den funktionsaufruf blinken() auskommentiere passiert gar nix 
mehr...


Was denn nun?

Was passiert MIT Aufruf von blinken, und was passiert mit leerer 
while(1) Schleife??

von Rene (Gast)


Lesenswert?

mh hab mich eventuell bissel dämlitsch ausgedrückt sorry

also nehmen wir das beispiel oben

while-schleife leer: meine led geht für eine sekunde an und dann wieder 
aus (wies sein soll)

mit aufruf von blinken (while nicht leer) passiert gar nix mehr (auch 
die led, welche ja vor der while geschaltet wird sagt nix mehr)

verständlicher?

von Frank J. (frajo)


Lesenswert?

Hast Du da zwei LED's dran? An PB0 und an PB1? Sind die LED's gegen 
Masse oder gegen Versorgungsspannung geschaltet?

von Rene (Gast)


Lesenswert?

ja es sind zwei leds (tut aber nix zur sache habs schon mit nur einer 
versucht)

das ganze ist so beschaltet:

GND -----|LED>|---[Widerstand]----(PB1/0) (keine ahnung ob led richtig 
rum gezeichnet des merk ich mir nie)

ist ein vorgefiertigtes programmierboard (die leds leuchten auch 
wunderbar innerhalb der main funktion)

von Matthias (Gast)


Lesenswert?

int blinken(void)
int main(void)

Versuche mal mit dem void in den deklarationen..

Welche Optimierungsstufe hast du eingestellt?

und mache mal aus "while (1==1)" ein: while (1) ..

von Rene (Gast)


Lesenswert?

ok danke so weit, so bald mein lippo (akku) gekladen ist versuch ichs 
mal

hab leider nur nen 12 volt netzteil

von Karl H. (kbuchegg)


Lesenswert?

Optimierungsstufe könnte interessant sein. Der Rest
sollte keinen Unterschied machen.

Bist du sicher, dass in deiner Toolchain ein Mega8
eingestellt ist?
Hast du an den Fuse Bits rumgespielt? (Konkret: an der
BODEN Fuse)

von Rene (Gast)


Lesenswert?

ok ok jetzt mal für noobs ^^

also das mit der optimierung --- keine ahnung

nutze eclipse zum programmieren (einstellungen wie hier im artikel dazu 
beschrieben)

fuse bits hab ich (mit angsschweiß auf der stirn) natürlich umstellen 
müssen (deswegen die 8 mhz)

ich werde mal meine fuses posten sobald mein akku voll ist (traue mich 
net wirklich die 12 volt für mein experimentierboard ausm rechner zu 
ziehen)

von Rene (Gast)


Angehängte Dateien:

Lesenswert?

ok jetzt wirds ganz verrückt

hab meinen ladevorgang gerade mal unterbrochen und die fuses gelesen 
(siehe anhang) sowie die änderung mittel void und die andere while 
versucht

hab gerade bemerkt, dass die led blink

nur eben extrem schwach

jetzt versteh ich gar nix mehr denn nehme ich "blinken()" raus leuchtet 
sie normal

von Hubert.G (Gast)


Lesenswert?

Dein Problem liegt warscheinlich an deinen Fuses oder Schaltung. Ich 
habe deinen Code auf mein Testboart mit einem Mega8 geladen, Optimierung 
Os, das ergibt 192Byte und läuft problemlos, zuerst leuchtet LED PB1, 
geht aus und dann blinkt LED PB0.

Hubert

von Rene (Gast)


Lesenswert?

also wahrscheinlich die fuses? (board ist ein fertiges experimentier 
boeard)

jemand ne idee, welches fuse ich umstellen müsste?

siehe oben

hubert danke, dass dus mal getestet hast

von Karl H. (kbuchegg)


Lesenswert?

Die Fuses sehen eigentlich soweit ganz gut aus.
Stimmen denn die Blinkzeiten so einigermassn?

von Rene (Gast)


Lesenswert?

blinkzeiten sind gut

nur die intensität spinnt aber eben auch nur dann, wenn ich das blinken 
in ne funktion auslagere

aber das kann damit doch nix zu tun haben so viel versteh selbst ich

werde mir das mit der optimierung heute aml ansehen eventuell hab ich da 
was eingestellt, was ich besser lassen sollte

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Optimierung muss auch funktionieren.

Hast du denn beim Linken auch das -mmcu=atmega8 mit in der
Kommandozeile?

von Εrnst B. (ernst)


Lesenswert?

Wenn die LED nur ganz schwach "glimmt", würd ich darauf Tippen, dass der 
Port nicht als Ausgang konfiguriert ist, und du nur mit dem internen 
Pullup rumwackelst.

check doch nochmal deine DDRB=... Anweisung, und pack testweise nochmal 
ein DDRB |= _BV(PB0); an den Anfang deiner blinken() funktion.

/Ernst

von Hubert.G (Gast)


Lesenswert?

Ich habe das Prog im AVR-Studio ohne Änderung compiliert und auf meinen 
Mega8 gespielt, funktioniert einwandfrei. Also kann nur der Compiler von 
Rene verrückt spielen oder die Hardware hat eine Macke.
Hubert

von Simon K. (simon) Benutzerseite


Lesenswert?

Wie groß ist der Widerstand, wie ist die LED nun genau angeschlossen?

Ich denke, dass deine LED über die Pullups mit Strom versorgt wird, 
statt über die Treiber. Blöderweise wurde das hier schon erwähnt. 
Irgendwas stimmt da nicht mit deinem PORTB.

PS: Hast du eigentlich das JTAG Interface ausgestellt per Fusebit?

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.