Forum: Mikrocontroller und Digitale Elektronik SRAM Initialisieren


von Jan Purrucker (Gast)


Lesenswert?

Hallo allerseits,

ich habe nun als Anfänger schon kleine Programmchen in Assembler auf 
meinen ATMega32 erfolgreich geschrieben. Nun habe ich einen 
Hardware-Debugger (JTAGIce). Dieser zeigt mir aber bei jedem 
Debug-Schritt, dass die Werte in den SRAM Speicherzellen einfach toggeln 
und teilweise wirre Werte haben. Wie kann ich nun das gesamte SRAM auf 
einen Schlag initialisieren (z.B. löschen)?

Vielen Dank schon mal für die Hilfen.

Gruß
Jan Purrucker

von jack (Gast)


Lesenswert?

>Wie kann ich nun das gesamte SRAM auf
>einen Schlag initialisieren (z.B. löschen)?

Was soll das für einen Sinn haben?
Du liest ja bestimmte Adressen im Ram erst nachdem sie beschrieben
worden sind.

von Sven S. (stepp64) Benutzerseite


Lesenswert?

Da wirst du wohl eine kleine Schleife programmieren müssen, in der jede 
RAM-Zelle einzeln gelöscht wird.

von Jan Purrucker (Gast)


Lesenswert?

Hallo,

wie programmiere ich nun die Schleife, in der ich z.B. 2048 Ram Zellen 
löschen kann. Das passt ja nicht mehr in eine 8bit Variable, und den 
Z-Pointer kann ich ja auch nicht mittels "inc Z" inkrementieren.
Für einen kurzen Beispiel code wäre ich sehr dankbar.

Gruß
Jan

von Michael U. (amiga)


Lesenswert?

Hallo,

  ldi YL, low(RamStart)
  ldi YH, high(RamStart)

  ldi ZL,low(RamLen)
  ldi ZH,high(RamLen)
  clr temp

loop:
  st Y+,temp
  sbiw Z,1
  brne loop

...

oder

loop:
  st Y+,temp
  dec ZL
  brne loop

  dec ZH
  brne loop

...

Gruß aus Berlin
Michael

von Gast123 (Gast)


Lesenswert?

Man sollte dabei nur darauf achten, dass man sich nicht den Stack 
kaputtmacht.

von spess53 (Gast)


Lesenswert?

Hi

@Michael: Du weisst, das du damit sämtliche IO-Register und r0-r31 mit 
löscht. Der interne RAM fängt beim ATMega32 bei Adresse $60 an und endet 
bei Adresse $85F

@Jan: Wahrscheinlich ist das auch dein Problem. Die RAM-Adresse 0 ist 
r0.
Wenn du den RAM ab Adresse 0 betrachtest siehst du die Änderungen an den 
Registern und IO-Registern.

MfG Spess

von Michael U. (amiga)


Lesenswert?

Hallo,

@spess53: habe ich mich irgendwo zum Wert von RamStart und RamLen 
geäußert? ;-)

Allgemeingültig:
  ldi YL, low(SRAM_START)
  ldi YH, high(SRAM_START)

  ldi ZL,low(SRAM_SIZE)
  ldi ZH,high(SRAM_SIZE)

sind die Definitionen aus den xxxxdef.inc der AVR.

Hinweis1: NUR direkt am Anfang nach Reset und VOR SEI aufrufen!
Hinweis2: Klappt nur bis max. 64k Ram. ;)

Fehlt noch was?

Gruß aus Berlin
Michael

von spess53 (Gast)


Lesenswert?

Hi

Entschuldige, ich hatte wahrscheinlich zu schnell nach unten gescrollt. 
Hast natürlich Recht. Meine Meinung, das Jan die Register beobachtet 
hat, halte ich aber weiter Aufrecht.

MfG Spess

von Jan Purrucker (Gast)


Lesenswert?

Hallo Michael,

vielen Dank für die Kompetente Auskunft. Aber ich kann ja diese Ram 
Initialisierung auch nach der Initialisierung der Peripherie einfügen, 
da ja die Ram-Adressen erst ab 0x0060 beschrieben werden, und somit 
nicht die "Steuerbits" bis 0x0060. Ist das korrekt so?
Vielen Dank nochmals.

Gruß
Jan Purrucker

von Michael U. (amiga)


Lesenswert?

Hallo,

ja sicher kannst Du das. Es darf nur noch keine aktiven Interrupts geben 
und es darf sich so nicht in einem Unterprgramm befinden, weil eben auch 
der Stack rigoros auf 0 gesetzt wird und damit keine gültige 
Rücksprungadresse für eine IRQ-/Subroutine mehr vorhanden wäre.

Gruß aus Berlin
Michael

von Jan Purrucker (Gast)


Lesenswert?

Hallo Michael,

stimmt genau. Ich bin zwar schon fortgeschrittener Anfänger, aber ich 
stolpere immer wieder über solche Dinge.
Vielen Dank nochmals für die Kompetente Hilfe.

Gruß
Jan

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.