Forum: Compiler & IDEs Simulation mit AVR funktioniert, aber nicht in echt


von Spooky ra (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

hab ein kleines Problem mit meinem Mega8. Ich wollte ein Programm
schreiben, das einfach als simples Lauflicht funktioniert und über den
Timer wollte ich mir eine Zeitbasis von 100 ms bereitstellen. Wenn ich
das Programm in Assembler von Hand schreibe funktioniert es einwandfrei
mit den Interrupts und dem Lauflicht. Jetzt wollte ich das ganze unter C
programmieren. Im Simulator mit AVRStudio funktioniert alles
einwandfrei, aber wenn ich das Programm auf meinen Mega8 lade, brennt
immer nur die erste LED und sonst tut sich nicht.

Was mache ich da falsch.

von Peter D. (peda)


Lesenswert?

void lauflicht(void)
  {
...
  lauflicht();
  }


Ui, ganz böses Foul, Dein Stack läuft über.


Rekursionen in MCs sind wie Benzin zum feuerlöschen nehmen.


Peter

von Spooky ra (Gast)


Lesenswert?

Danke für den Hinweis, hab nur Assembler am 486 bisher gemacht und C
auch nur am PC. Deswegen bin ich sowas gewohnt, aber mein Problem hat
sich dadurch nicht gelöst. Es brennt immer nur noch die erste LED!

?

Spooky

von Spooky ra (Gast)


Lesenswert?

Also ich hab das ganze jetzt mal auf ne andere Art und Weise versucht zu
lösen und zwar mit _delay_ms und hier funktioniert die eingestellte Zeit
aber nur beim ersten mal, danach wird es viel viel langsamer.

_delay_ms(10);

ist eingestellt.
Erster durchlauf funktioniert, dann saulangsam.

Liegen meine Probleme vielleicht an der Hardware selber oder kann das
nur ein Programmierproblem sein?

Mein Timer-Problem ist das alte!

von Peter D. (peda)


Lesenswert?

Achso, die mainloop fehlt natürlich auch noch.

Ein Main darf niemals enden !!!!!!!!!!!!!!!!!!!!!!!!!

Du hast ja kein Windows, wohin es zurückkehren kann.


Peter

von Peter D. (peda)


Lesenswert?

"Danke für den Hinweis, hab nur Assembler am 486 bisher gemacht und C
auch nur am PC. Deswegen bin ich sowas gewohnt,"


Bestimmt nicht !

Eine Rekursion ohne Abbruchbedingung geht auch am PC gegen den Baum,
dauert nur länger.


Ansonsten sind Rekursionen auch im µC erlaubt, kosten bloß wesentlicher
mehr Rechenzeit, Flash und SRAM, als wenn man das gleiche mit einer
Schleife macht. Sind also ähnlich sinnvoll, wie sich einen Knopf an die
Backe nähen, aber gehen tuts.


Peter

von Spooky ra (Gast)


Lesenswert?

muss noch viel lernen! Aber auch mit

for(;;)
     {
     lauflicht();
     }

geht nix

von Lutz Müller (Gast)


Lesenswert?

#include <avr/iom8.h>
=> /* This file should only be included from <avr/io.h>, never
directly. */ steht in der iom8.h. Also einfach das "m8" wegnehmen.

PORTD |= (1 << 0);    => PORTD = PORTD | 00000001   War das gewünscht?
PORTD &= ~(1 << 0);   => PORTD = PORTD & 11111110   War das gewünscht?
Verschieben um Null sieht immer etwas komisch aus.

Nimm auch lieber SIGNAL statt INTERRUPT, obwohl es hier auf den ersten
Blick bei so einer kurzen ISR kein Problem sein dürfte. Später oder bei
längeren Programmen wird Dir sonst Deine ISR vom nächsten Interrupt
unterbrochen, was ganz schön fies sein kann, wenn man das nicht
berücksichtigt hat.

PORTD = 0xFF; hast Du doppelt drin (einmal in der main und einmal in
lauflicht().

Den Rest (Timer etc.) habe ich mir nicht angesehen.

Die switch-Geschichte kommt mir spanisch vor. Hast Du das fall-through
von i=25 bis break absichtlich gemacht (hier wohl egal)? Außerdem setzt
Du bei jedem Aufruf von lauflicht() i wieder auf 0, womit ein erreichen
von anderen Werten außer case:0 nicht möglich ist.

von Andi (Gast)


Lesenswert?

"Sind also ähnlich sinnvoll, wie sich einen Knopf an die
Backe nähen"

Hey, sag nichts gegen meinen Knopf an der Backe!

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.