AVR-Assembler Fehlermeldung: "AVR Simulator: Stack pointer below start of RAM"

Gast #2139187
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
Gast #2139217
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
Gast #2139272
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.
Gast #2139305
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren