Hallo Leute,
ich hab da ein Problem mit meinem AtMega48 das ich alleine nicht gelöst
bekomme.
Ich hab ein Programm, das einen haufen Variablen (9*6 Stück) aus dem
EEprom auslesen soll. Diese liegen im Eeprom von Addresse 0x00-0x5F
(Ich hab den Eeprom in 16-Byte-Blöcke aufgeteilt, in jedem liegen je 9
Variablen. Das angehängte Programm soll diese zunächst in einer
Schleife einlesen und im SRAM speichern. Danach werden die ersten 9
Werte in Register übertragen. Zwischendurch werden die Werte auch noch
per USART ausgegeben. In der Simulation funktioniert es nun endlich,
nachdem ich herausgefunden habe, dass man das Eeprom-Image manuell
einfügen muss. Jedes Register hat den korrekten Wert. In der Realität
sieht das "ein wenig" anders aus. Die Register enthalten jedes Mal
Zufallszahlen.
Am Eeprom scheint es nicht zu liegen, ich hab das Programm jetzt einmal
laufen lassen und danach nochmal über den Programmer das Eeprom-Image
überprüft. Außerdem werden in der Schleife die Werte, die ausgelesen
worden sind, ausgegeben -> alles korrekt
Auch am AtMega scheint es nicht zu liegen, ich hab jetzt nochmal einen
anderen ausprobiert und es passiert das gleiche.
Das blödeste ist, dass es in der Simulation läuft und real nicht.
An den Initialisierungen am Anfang (USART und CLKPR) liegt es meiner
Meinung nach auch nicht.
Irgendwer ne Idee?
Hab noch was vergessen was ich eigentlich noch schreiben wollte:
Die Taktquelle ist ein externer 18,432 MHz-Oszillator, geteilt durch 32
per CLKPR.
Programmiert wird der Controller per Avreal
(http://ln.com.ua/~real/avreal/index_e.html), aber ich denke eigentlich
nicht dass das was ausmachen kann. Oder?
Hallo
Ohne jetzt den Code genauer angeschaut zu haben ein paar Denkanstösse:
Kontrolliere das EEPROM nochmals ;-) (Ich habe damit schon seltsame
Dinge erlebt, ging dann allerdings um Schreibzugriffe.)
Da du von Zufallszahlen sprichst: Das SRAM weist nach dem Reset
zufällige Werte auf. Es könnte also sein...
...dass dein Programm gar nicht wirklich etwas in das SRAM schreibt,
und du folglich auch nur die ursprünglichen Zufallszahlen bekommst.
...dass du eine Variable im SRAM nicht initialisierst sondern einfach
als 0 annimmst, allerdings hat diese dann einen zufälligen Wert. Wenn
es sich bei dieser Variable um einen Pointer handelt, sicher ziemlich
lustig.
(Ich tippe auf einen Fehler in dieser Richtung, da die zufällige
Initialisierung des SRAMs eigentlich der einzige Unterschied zur
Simulation ist.)
Oder sind es irgendwelche Timing-Probleme mit dem EEPROM? Also wenn du
das Register schon ins SRAM verfrachtest, bevor es richtig gelesen
wurde?
Gruss
Michael
> Kontrolliere das EEPROM nochmals
Die Werte die ausgelesen werden, werden auch per USART ausgegeben, und
da stimmen sie definitiv.
>...dass dein Programm gar nicht wirklich etwas in das SRAM schreibt,
und du folglich auch nur die ursprünglichen Zufallszahlen bekommst.
Glaube ich nicht, da das "st Z+, tmph" in der Schleife im Grunde
immer ausgefürt wird / werden müsste
>...dass du eine Variable im SRAM nicht initialisierst sondern einfach
als 0 annimmst, allerdings hat diese dann einen zufälligen Wert. Wenn
es sich bei dieser Variable um einen Pointer handelt, sicher ziemlich
lustig.
Pointer im RAM hab ich keine... aber die Register haben doch als
Startwert 0 oder?
>Oder sind es irgendwelche Timing-Probleme mit dem EEPROM? Also wenn
du
das Register schon ins SRAM verfrachtest, bevor es richtig gelesen
wurde?
Also wenn ich das im Datenblatt richtig gelesen habe, dann stehen die
gelesenen Daten sofort zur Verfügung (abgesehen davon, dass die CPU
dafür 4 Takte lang angehalten wird).
Fehler gelöst...
>>...dass du eine Variable im SRAM nicht initialisierst sondern
einfach
>>als 0 annimmst, allerdings hat diese dann einen zufälligen Wert.
Wenn
>>es sich bei dieser Variable um einen Pointer handelt, sicher
ziemlich
>>lustig.>Pointer im RAM hab ich keine... aber die Register haben doch als>Startwert 0 oder?
Hmhmhmhmhm... Eben nicht. Ich hab jetzt am Anfang noch das ZL-Register
auf 0 gesetzt. Das der Datenspeicher nicht standardmäßig auf 0 liegt
war mir ja bekannt, aber dass die Register nach nem Reset nicht auf 0
sind ist mir neu. Naja, Problem gelöst und wieder was dazugelernt.
Bis dann
Hallo
Da hab ich auch gerade was gelernt ;-)
IMMER mit einem sinnvollen Wert INITIALISIEREN!
Ist ja eigentlich logisch, dass sich die Register gleich wie das SRAM
verhalten, schliesslich dürfte die Technologie die selbe sein.
Gruss
Michael