Forum: Mikrocontroller und Digitale Elektronik AVR-Assembler Fehlermeldung: "AVR Simulator: Stack pointer below start of RAM"


von Robert (Gast)


Lesenswert?

Hallo Leute,

ich Versuche mich gerade in Assembler reinzufuchsen.
Wenn ich das Folgende Programm simulieren möchte, kommt immer zweimal 
die oben genannte Fehlermeldung. Zwischen den beiden Fehlern erscheint 
die Warnung "AVR Simulator: Invalid opcode 0xffff at address 0x000035
".

Im weiteren Verlauf lässt sich der Code jedoch simulieren.
1
.include  "m8def.inc"
2
3
.def tmp        =  r16
4
.def spannung   =  r17
5
.def timer0     =  r18
6
7
.org 0x000
8
    rjmp   main              ; springe zum Hauptprogramm
9
.org OVF0addr  
10
    rjmp  timer0_overflow    ; Timer Interrupt
11
12
13
14
main:  
15
    ldi tmp,LOW(RAMEND)      ; Stackpointer setzen
16
    out SPL,tmp
17
    ldi tmp,HIGH(RAMEND)
18
    out SPH,tmp
19
20
    ldi tmp,0xff
21
    out DDRB,tmp             ; PORTB ist Ausgang, nur PB0 wird benutzt
22
23
    ldi  tmp,0b011000000
24
    out admux,tmp            ; 1. Steuerungregister für ADC
25
    
26
    ldi tmp,0b11111110
27
    out adcsra,tmp           ; 2. Steuerungsregister für ADC
28
29
    ldi tmp,0b00000001
30
    out TCCR0,tmp
31
32
    ldi tmp,0b00000001
33
    out TIMSK,tmp
34
35
    sei
36
37
loop:  
38
    in spannung,adch         ; High Byte in Register Spannung einlesen
39
    cpi spannung,50          ; Spannung vergleichen
40
    
41
    brsh anschalten          ; je nach dem anschalten oder ausschalten
42
    brlo ausschalten
43
44
setzen:
45
    out PORTB,tmp            ; PB0 setzen
46
47
    rjmp loop
48
49
50
anschalten:
51
    ldi tmp,0x01
52
    rjmp setzen
53
    
54
ausschalten:
55
    ldi tmp,0x00
56
    rjmp setzen
57
58
timer0_overflow:
59
    push tmp
60
    inc timer0
61
    pop  tmp
62
    reti

von spess53 (Gast)


Lesenswert?

Hi

Hast du den richtigen AVR in der Simulation eingestellt?

Debug->Select Platform and Device...

MfG Spess

von Robert (Gast)


Lesenswert?

NEIN, ich bin doch ein Depp!!!!!!

Ich hab einen Fehler gesehen, wo keiner ist. Ich habe die Meldung falsch 
interpretiert, sie entstammt von einer früheren Simulation und war noch 
im Message Fenster sichtbar.

Der Code da oben sollte für den ATmega8 fehlerfrei funktionieren.

Danke dir trotzdem Spess

von Jürgen (Gast)


Lesenswert?

Robert schrieb:
> timer0_overflow:
>     push tmp
>     inc timer0
>     pop  tmp
>     reti

Tip: Statusregister sichern !

von Robert (Gast)


Lesenswert?

Nachtrag:

Der Code funktioniert doch nicht fehlerfrei, die beschriebene 
Fehlermeldung tritt nach ca. 400.000 Zyklen auf.

Aber das sichern von SREG mit:
1
timer0_overflow:
2
    push   tmp
3
    in    tmp,SREG
4
    
5
    inc   timer0
6
7
    out    SREG,tmp
8
    pop   tmp
9
    
10
11
    reti

bringt anscheinend auch nix.

von Stefan E. (sternst)


Lesenswert?

Robert schrieb:
> Der Code funktioniert doch nicht fehlerfrei, die beschriebene
> Fehlermeldung tritt nach ca. 400.000 Zyklen auf.

Liegt daran, dass du den ADC-Interrupt aktivierst.

von spess53 (Gast)


Lesenswert?

Hi

>bringt anscheinend auch nix.

Wo ist der Sprung zur Interruptroutine (IR-Vektortabelle)?

MfG Spess

von spess53 (Gast)


Lesenswert?

Hi

Ignoriere meinen letzten Beitrag.

MfG Spess

von Robert (Gast)


Lesenswert?

Na die Interrupt Tabelle ist doch ganz oben?! (Sorry, bin blutiger 
Anfänger)

@Stefan: Ja genau, das ADIE Bit im Register ADCSRA war es!! :-)

Das heißt also, dass der ADC um die 800 Zyklen braucht, bis er eine 
Messung abgeschlossen hat??? (nach 800 Zyklen, gibts den ersten 
Interrupt aufgrund des ADC)


Grüße

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.