Simulation mit AVR funktioniert, aber nicht in echt

Gast #182394
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.
Angehängte Dateien:
Gast #182396
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
Gast #182397
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!
#182399
"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
Gast #182401
#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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 21 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.