Hallo,
ich habe eine Problem mit dem angehängten Code. Das ganze soll auf einen
ATMega32. An Port C/D hängen zwei R-2R-Netzwerke als Digital-Analog
Wandler, auf denen die Software zwei Werte X und Y ausgibt, die auf
einem Oszi im XY-Modus dann schöne Bilder machen. Für das aktualisieren
der Werte ist die Timer-Interruptroutine ganz am Ende zuständig.
Nun zu dem Problem. Wenn ich den Code simuliere, dann wird diese Routine
aufgerufen, springt nachdem sie ausgeführt wurde aber nicht zurück,
sondern startet neu. Ansonsten macht sie das, was sie soll, doch das ist
mehr oder weniger zufall. Auf meinem Testboard passiert gar nichts, was
mich aber auch nicht wundert, wegen des Problems in der Simulation.
Die Routine soll alle 256 Takte aufgerufen werden, ich habe mal
durchgezählt, es sind über 100 Takte am Ende der Ausführung übrig. Das
sollte doch reichen, um zurück zu springen?
Habe ich vielleicht vergessen, in der Routine irgendetwas zu setzen?
Viele Grüße,
Fabian
Das stimmt doch nicht. CS00 und CS01 auf "1" ist doch ein Prescaler von
64. Demnach wird die ISR alle 2^14 Takte aufgerufen.
Vielleicht hast ja auch nur hier falsch gepostet. Ansonsten kann es auch
sein, dass der Mega einfach länger benötigt also diese 256 Takte. Auf
den Simulator ist nicht immer 100% Verlass.
> Das stimmt doch nicht.
Richtig, das stimmt nicht, aber nicht (nur) aus den von Dir genannten
Gründen, sondern (auch), weil hier anstelle des bitweisen ODER ein
logisches ODER steht, und das geht definitiv in die Hose...
Oh, ich sehe grad, dass (zufällig?) genau dieses (eigentlich falsche)
logische ODER dafür sorgt, dass der Prescaler tatsächlich auf die im
Kommentar genannte "1" (kein Prescaling) eingestellt sein dürfte... Dass
das so in der Absicht des Programmierers lag, halte ich allerdings für
unwahrscheilich...
Hi,
ja, das ist so nicht richtig, es war ein bischen spät gestern und ich
habe über den Code vor dem Posten nicht richtig rübergeschaut.
Eigentlich sollte da auch nur CS00 gesetzt werden, denn ich will ja
einen Prescaler = 1. Der Rest kam aus meiner letzten Debugsession, da
ich mir schon dachte, dass die Interruptroutine etwas zu lang ist. Das
werde ich gleich nochmal korrigieren und testen.
Übrigens funktioniert die Simulation doch, wie ich gerade gemerkt habe,
wenn man in die endlosschleife in Main irgendeine Dummyoperation packt.
Dann springt er auch wieder zurück.
Auf dem Testboard geht es leider immer noch nicht.
Noch einige Informationen die vielleicht nützlich sein könnten:
Ich habe zwei Statusleds, und mal versucht die erste (grün) am Anfang
von Main() zu setzen und die zweite (rot) im ISR. Was passiert ist, dass
die grüne nach einem Reset kurz aufblinkt und dann wieder ausgeht. Die
Rote bleibt immer aus. Was aber eigentlich nicht sein dürfte, da ich
wirklich nur an diesen beiden Stellen auf die LEDs zugreife, und ich sie
auch niemals ausschalte, sondern immer nur auf logisch 1 ziehe.
Auch an den Pins messe ich komische Werte. Die sollten ja eigentlich
0V/5V haben, ich messe aber eher sowas wie 2.2 V. Aber eine saubere
Gleichspannung, also nix was durch eine zufällige PWM entstanden sein
könnte.
Vielleicht noch Ideen, wie ich den Fehler genauer eingrenzen könnte?
Viele Grüße,
Fabian
stimmt. :)
Wars aber nicht, sondern es war einfach eine falsches target für den
Compiler...ATMega8 eingestellt, ATMega32 benutzt, ich nappo :)
Viele Grüße und besten dank an alle,
Fabian
Wollte nochmal allen Menschen danken, die mir hier geholfen haben.
Ohne euch wäre ich heute nicht dort, wo ich jetzt bin. Ist zwar immer
noch nicht ganz oben, aber ich habe viel gelernt. Danke dafür.