Forum: Mikrocontroller und Digitale Elektronik Problem mit Mega48 - Nur Wirrwarr im RAM


von Dennis Strehl (Gast)


Angehängte Dateien:

Lesenswert?

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?

von Dennis Strehl (Gast)


Lesenswert?

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?

von mr.chip (Gast)


Lesenswert?

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

von Dennis Strehl (Gast)


Lesenswert?

> 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).

von Dennis Strehl (Gast)


Lesenswert?

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

von mr.chip (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

Ausserdem würdest Du Dich schön beschweren, wenn
nach einem Watchdog-Reset die Register alle gelöscht
wären.

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
Noch kein Account? Hier anmelden.