Hallo
Der folgende Code (von C aufgerufene Assembler-Routine) lässt offenbar
meinen AVR abstürzen. Ich sehe aber trotz intensiver Analyse _keine
einzige Möglichkeit_, wie dies geschehen könnte.
Sieht hier irgend jemand eine Möglichkeit, wann der Controller abstürzen
könnte? VRAM und VRAM_SIZE sind Pointer bzw. Grössenangaben für ein
Array. Die Werte sind so korrekt und funktionieren auch.
Funktionierts denn, wenn Du alle Zeilen dieser Routine (außer das "ret"
am Schluss - klar) auskommentierst? Ja? Und was ist, wenn Du die push-
und pop-Zeilen zuläßt? Läufts dann auch noch? Wenn dem so ist,
aktivier die vier "ldi"-Zeilen nach den "push"-Zeilen. Es funzt
weiterhin? Dann hast Du den Fehler auf die vier Zeilen der
"clearscreen_loop"-Schleife eingegrenzt.
Ach so: Wenn es schon "vorher" nicht funktioniert, z. B. sobald Du die
push- und pop-Zeilen zuläßt, solltest Du überprüfen, ob Du evtl.
Interruptroutinen hast, die die in "clearscreen" benutzten Register
verändern. Das wäre eine mögliche Ursache für Deinen "unerklärlichen"
Fehler.
Viel Erfolg :-).
Hallo
Jetzt ist einiges klar:
Die Schleife schreibt irgendwo in den Speicher, wo sie nicht sollte.
Ersetze ich die st Anweisung durch eine ld Anweisung, dann stürzt nix
mehr ab. Könnte es sein, dass der Compiler in den Speicherbereich meines
Arrays noch eine andere Variable platziert, obwohl ich das Array im
C-File korrekt deklariert habe?
Gruss
Michael
Hallo
Danke für eure Antworten.
Der Fehler liegt nicht wirklich in diesem Code. Das Problem ist
folgendes: Ich habe einen Interrupt, der jeweils 32 mal in kurzer Zeit
aufgerufen wird. Nach diesen 32 aufrufen folgt eine längere Pause,
während der Funktionen wie die obige ausgeführt werden. Nun gibt es aber
offensichtlich ein Problem, diese Funktion mit den Interrupts zu
koordinieren, d.h. die Funktion rutscht irgendwie zwischen die
Interrupts.
Eigentlich habe ich ja einen Zähler, der jeden Interrupt zählt und nach
dem 32. ein Flag setzt, welches die Hauptschleife veranlasst, obige
Funktion auszurufen, doch scheinbar kann die Funktion auch schonmal
zwischen den Interrupts kommen. Ist Gegenstand der Untersuchung ;-)
Gruss
Michael
Sowas... Stell Dir mal vor, Du hättest einen Interrupt, der von
"außerhalb des µC" zu völlig unvorhersehbaren Zeitpunkten ausgelöst
wird, so dass es unmöglich wäre, irgendetwas in Deinem Programm mit
diesem Interrupt zu "koordinieren"... Was meinst Du dazu? lach
Wodurch werden Deine Interrupts denn auf so seltsame Weise ausgelöst?
> Wodurch werden Deine Interrupts denn auf so seltsame Weise ausgelöst?
Von einem zweiten Controller, der diese 32 Interrupts alle 40 ms auslöst
um Daten zu übertragen. Da die Controller synchron laufen, geht sowas
eigentlich schon. Nur sollte man nicht zu blöd dazu sein, die
Rechenarbeit in die Interrupt-Pause zu legen.