Forum: Mikrocontroller und Digitale Elektronik Atmaga162 sram


von AndreasH (Gast)


Lesenswert?

Hallo,

ich habe den atmeaga162 mit dem gcc compiliert. Dabei fiel mir auf,
dass der aus einem Unterprogramm nicht zurückkam.

Daher habe ich mir ein kleines Testprogramm in Assembler geschrieben.
Um zu sehen wo das Programm steht, lasse ich die LEDs auf dem StK500
unterschiedlich aufleuchten.

RESET:
  ldi  temp,low(RAMEND)
  out  SPL,temp
  ldi  temp,high(RAMEND)
  out  SPH,temp  ;init Stack Pointer


  ldi temp, 0xff
  out DDRB, temp

  call   serout
weiter:
  ldi   temp, 0x55
  out   PORTB, temp
  rjmp  forever

serout:
  ldi temp, 0x0
  out PORTB, temp

;  rjmp  weiter
  ret

Es leuchten nur alle LED. Die 0x55 wird überhaupt nicht ausgegeben.
Nehme ich das "rjmp weiter" wieder rein, dann geht es.

Scheint irgendwas mit dem Stack zu sein.
Muss ich da noch in den Configuration Bits was einstellen oder ist der
Ram defekt?

Danke
Andreas

von Andi (Gast)


Lesenswert?

Wo ist die Marke forever?
Ist das nur ein Teil des Codes?
Evtl. sind die LED´s low-aktiv geschaltet, 0=an und 1=aus.
Dann erklärt es sich, das in 'serout' bei 0x00 alle LED´s angehen.
Danach wird dann jede 2. LED mit 0x55 abgeschaltet.
Wenn das wechselweise passiert, ist das so schnell das man nur alle
LED´s leuchten sieht (träges Auge).

Gruß
Andi

von AndreasH (Gast)


Lesenswert?

Hallo Andreas,

war nur ein Teil des Codes. Forever war eine Endlosschleife (forever:
jmp forever)

Habe es mittlerweile gefunden. Wollte gestern abend nur nicht mehr ins
internet gehen.
Nachdem ich den Stackpointer mal irgendwo mitten in den SRAM gesetzt
habe ging es dann plötzlich.
Habe mir mal dann im Datenblatt den SRAM-Bereich angesehen. Dabei sind
mir dann einige Bemerkungen aufgefallen die auf unterschiedliche
Ram-Bereiche hinweisen.

Das Problem lag darin, dass es beim Atmega162 ein Bit gibt, dass sich
M161C nennt. Damit ist der 162er kompatibel zum Atmega161. Dieses Bit
war bei mir gesetzt.
Beim Atmega161 endet der SRAM bei 0x4FF. Beim Atmega162 bei 0x4FF.
Initialisiert wurde der Stackpointer aber mit 0x4FF obwohl dem
Controller gesagt wurde "Du bist ein ATMega161".
Damit war der Rücksprung ins Nirwana vorprogrammiert.

Danke nochmals für Deine Bemühungen.

Grüße
Andreas

von Andi (Gast)


Lesenswert?

"Beim Atmega161 endet der SRAM bei 0x4FF. Beim Atmega162 bei 0x4FF.
Initialisiert wurde der Stackpointer aber mit 0x4FF obwohl dem
Controller gesagt wurde "Du bist ein ATMega161"."

Wie, was, wo?
Ist doch alles das selbe (0x4FF).!?!

Gruß
Andi

von Rufus T. Firefly (Gast)


Lesenswert?

Zahlen sind Schall und Rauch.

von AndreasH (Gast)


Lesenswert?

Blödsinn.

Sollte natürlich so sein:
Beim Atmega161 endet der SRAM bei 0x45F. Beim Atmega162 bei 0x4FF.
Initialisiert wurde der Stackpointer aber mit 0x4FF...."

Sorry


Grüße
Andreas

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.