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.
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
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
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!
Achso, die mainloop fehlt natürlich auch noch. Ein Main darf niemals enden !!!!!!!!!!!!!!!!!!!!!!!!! Du hast ja kein Windows, wohin es zurückkehren kann. Peter
"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
muss noch viel lernen! Aber auch mit for(;;) { lauflicht(); } geht nix
#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.
"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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.