mikrocontroller.net

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


Autor: Spooky ra (Gast)
Datum:
Angehängte Dateien:

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

Autor: Peter Dannegger (peda)
Datum:

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

Autor: Spooky ra (Gast)
Datum:

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

Autor: Spooky ra (Gast)
Datum:

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

Autor: Peter Dannegger (peda)
Datum:

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

Autor: Peter Dannegger (peda)
Datum:

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

Autor: Spooky ra (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
muss noch viel lernen! Aber auch mit

for(;;)
     {
     lauflicht();
     }

geht nix

Autor: Lutz Müller (Gast)
Datum:

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

Autor: Andi (Gast)
Datum:

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

Hey, sag nichts gegen meinen Knopf an der Backe!

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.