Forum: Mikrocontroller und Digitale Elektronik ret springt nicht zurück


von Johannes S. (killertomate)


Lesenswert?

Hallo zusammen!

Ich sitze seit zwei Stunden vor meinem Quellcode und wundere mich, warum 
er nicht das tut, was er soll (wie das für Code so üblich ist ;)

Aufgefallen ist mir, dass das ret scheinbar nicht zurückspringt.
Hier ein Minimalbeispiel:
1
.include "m8def.inc"         ; Definitionsdatei für den Prozessortyp einbinden
2
3
.org 0x0000
4
    ldi r16, 0xFF       ; 
5
    out DDRB, r16       ; Port B als Ausgang
6
7
    ldi r16, 0xFF       ; 
8
    out DDRD, r16       ; Port D als Ausgang
9
main:  
10
    ldi r16, 0b11111111 ; grüne LED an
11
    out PORTB, r16      ; 
12
    
13
    rcall led
14
    
15
    ldi r16, 0b11111111 ; rote led an
16
    out PORTD, r16      ;
17
      
18
ende:   rjmp ende           ; Endlosschleife 
19
20
led:
21
  ldi r16, 0b00001111 ; gelbe LED an (rote noch aus)
22
  out PORTD, r16 
23
  ret

Als HW ist eine grüne LED an PB(2), eine gelbe LED an PD(2) und eine 
rote LED an PD(4, also das höhere Nibble).
Der Code soll die grüne, dann die gelbe und schließlich die rote LED 
anschalten.
Wenn ich den Code ausführe, leuchten aber nur die grüne und die gelbe 
LED.
Die Verbindungen sind alle überprüft und mein µC ist ein ATMega8.
Die Wahl der Pins ist bei mir irrelevant.

Habe ich irgendetwas richtig dummes übersehen oder funktioniert das so 
bei euch?

Beste Grüße
Johannes S.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Wo initialisierst Du den Stack, damit er auch die Rücksprungadresse 
ablegen kann?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Damit rcall/ret funktionieren können, muss der Stack initialisiert sein, 
denn irgendwohin muss ja rcall die Rücksprungadresse sichern.

In Deinem Code aber sehe ich keine Initialisierung des Stacks.

von Uwe (de0508)


Lesenswert?

Hallo,

mir fehlt die Angabe, wo der Stack anfängt.

Meistens liegt er am Ende des SRAM (statischen Ram).
1
ldi  r0,hi8(sramEnd)
2
xOut  SPH,r0
3
ldi  r0,lo8(sramEnd)
4
xOut  SPL,r0

von Peter D. (peda)


Lesenswert?

Bei den älteren AVRs haben sich die Entwickler den Jux erlaubt, den 
Stackpointer nach Reset in den Wald zeigen zu lassen.
Schon 1982 konnten die alten 8051 das besser.


Peter

von Kan a. (Firma: Basta) (kanasta)


Lesenswert?

Was für ein Murks. Wie viele Bilder machen deine Augen pro Sekunde? Ein 
paar Millionen?

von Johannes S. (killertomate)


Lesenswert?

Oh mann, total vergessen ...
Vielen vielen Dank an euch!

Schönen Abend noch
Johannes S.

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.