Hallo zusammen! Ich hatte in der vergangenen Woche ein etwas merkwürdiges Problem beim Simulieren eines Atmega64 über den AVR-Simulator des AVR Studios 6.1. Hierbei wurde eine For-Schleife zwar richtig abgearbeitet (3x durch und dann raus) aber die dazugehörige Zählvariable blieb im Simulator immer auf NULL stehen. Bei genauerer Betrachtung ist mir dann aufgefallen, dass sich nicht nur die Zählvariable merkwürdig verhält sondern auch andere Variablen in dieser Funktion. Da ich in dieser Funktion unter anderem ein 3x3 Aray und ein 5x5 Aray angelegt hatte viel mir dann irgenwann auf, dass ich bei einem 3x3 und einem 2x2 Aray diese Probleme noch nicht habe. Bei vergrößerung des letzten Arays auf 2x3 war es aber dann wieder da. Hierbei stellte ich fest, dass meine Variablen einmal in den Speicherbereich 0x1... geschrieben wurden (alles ok) und beim anderen mal in dem Bereich 0x0F... landeten (Auftreten des Problems). Nach der Auseinandersetzung mit dem Datenblatt des Atmnega64 viel mir dann auf der Seite 20 eine Grafik ins Auge, die den Atmega64 in zwei unterschiedlichen Konfigurationen zeigt. Einmal A und einmal B wobei bei der Konfiguration genau an der o.g. Stelle eine Grenze zwischen externem und internen SRAM ist. Allerdings habe ich gar kein externes SRAM angeschlossen. Demnach müsste es doch eigentlich gerade anders herum nicht funktionieren, also bei 0x0F... müsste dann noch alles gut sein während ich beim Wechsel in den Speicherbereich des nicht vorhandenen Externen SRAMS mit Problemen rechnen würde. Habe ich hier einen Denkfehler? Oder verstehe ich das Datenblatt falsch? Und vor allem - Wo stellt man die Konfiguration A oder B ein? Da bei der Auswahl des Devices unter Atmega64 immer 4096 angezeigt wird, würde ich hier sowieso eher die Konfiguration A vermuten! Fragen über Fragen! Aber ich hoffe, ich finde hier ein paar passende und erklärende Antworten. Dafür schon einmal im Voraus vielen Dank! Gruß Andreas
@ Andreas S. (schunki) >unterschiedlichen Konfigurationen zeigt. Einmal A und einmal B wobei bei >der Konfiguration genau an der o.g. Stelle eine Grenze zwischen externem >und internen SRAM ist. Genau. >Denkfehler? Oder verstehe ich das Datenblatt falsch? Und vor allem - Wo >stellt man die Konfiguration A oder B ein? Kombtibilitäts-Fuse.
Naja..... beantwortet immerhin mal die Frage wie man die Konfiguration umschaltet. Bleibt noch offen warum ich dieses Verhalten habe und warum es nicht andersherum ist sowie wie das ganze zu Stande kommt.
Sorry, aber ich muss hier nochmal nach haken, ob mir hier noch jemand etwas mehr weiter helfen kann. Warum hab ich das Problem nicht, wenn meine Variablen im Speicherbereich 0x1... liegen. Dies ist gem. Datenblatt der Speicherbereich des externen SRAMs, was bei mir nicht vorhanden ist. Für mich wäre es erklärbar, wenn bei der Adressierung in diesen Bereich dann etwas schief geht. Aber hier funktioniert es und im Speicherbereich 0x0F... tritt dann der Fehler auf! Warum????
Hallo Andreas, wenn ich es richtig verstanden habe, legst Du die Arrays auf dem Stack an. Der Compiler kann dann keine vollständige Prüfung auf die maximale Größe durchführen. Du solltest also den Speicherbedarf Deines Programms im Falle des Fehlers ausrechnen. Für diese Erklärung spricht auch, dass Dein Programm mit kleineren Arrays läuft. Eine relativ einfache Möglichkeit zum Test ist die Anlage der Arrays ausserhalb der Funktion. Das geht natürlich nur, wenn keine rekursiven Aufrufe erfolgen. Und vergiss nicht, dass auch Interrupts eventuell Speicher benötigen. Grüße, Kurt
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.