Forum: Mikrocontroller und Digitale Elektronik Trotz initialisiertem Stack Fehlermeldung


von Paul (Gast)


Lesenswert?

Hallo, ich versuche mich gerade an einem AVR MC (ATmega 32-16PU) und 
verwende für die Assembler Programmierung  AVR Studio. Ich habe ein 
eigentlich Simples Programm geschrieben wo eine Led per Tasten - druck 
leuchten soll und mit einem zweiten Taster wieder aus gehen soll. Mit 
einem dritten soll die Led blinken.
Wenn ich mein Programm im Debug - Modus durchgehe, tritt nachdem der 
Timer überläuft folgende Fehlermeldung ein: “AVR Simulator: 
Uninitialized stack pointer used at 0x003b” danach springt er trotzdem 
in die ISR und führt auch meine Befehle für den Interrupt aus. Nachdem 
er damit fertig ist kommt folgende Meldung: ”AVR Simulator: Invalid 
opcode 0xffff at address 0x009898”
Wäre nett wenn sich jemand kurz Zeit dafür nehmen könnte. Vielen Dank 
vorab.

 .include "m32def.inc"
     .org 0x000
     .def temp = r18
     .def t1h = r19
     .def t1l =r20
     .def stini = r17
     .cseg
    rjmp init


    .org 0x010
     rjmp intt1

   .org 0x02b

init:

    ldi stini, LOW(RAMEND)    ;Untere 8 bit laden
    out SPL, stini
    ldi stini, HIGH(RAMEND)   ;Obere 8 bit laden
    out SPH, stini
    ldi r16,0x60
    out DDRD,r16
    sei
    ldi r19, 0xc2
    ldi r20, 0xf7
    ldi  temp, 0b00000100
    out  TIMSK, temp
    rjmp loop


loop:
  SBIc   PinD,2
  rjmp an
  sbic   PinD,3
  rjmp aus
  sbic   PinD,4
  rjmp blink
 jmp    loop

an:
  ori    r27, 0x60
  out    PORTD, r27
  ldi    temp, 0b00000000 ; t1 aus
  out    TCCR1b, temp
  rjmp loop

aus:
  ldi     temp, 0b00000000 ; t1 aus
  out     TCCR1b, temp
  ldi     r27, 0x00
  out     PORTD, r27
  rjmp loop

blink:
  ldi    temp, 0b00000101 ; teiler 1024
  out    TCCR1b, temp
  out   tcnt1l,t1l
  out   tcnt1h,t1h
  ldi    r27, 0b00100000
  out    PORTD, r27
  rjmp loop

intt1:
 com   r27
 out   portd, r27
 out   tcnt1l,t1l
 out  tcnt1h,t1h
 reti

von Dussel (Gast)


Lesenswert?

Ich kenne den ATMega32 nicht, aber du schreibst von Überlauf und an der 
Stelle .org 0x010 ist der Interruptvektor für den Timer1 Compare Match. 
Daran könnte es vielleicht liegen.

von spess53 (Gast)


Lesenswert?

Hi

Der Overflowinterrupt liegt auf 0x12.

MfG Spess

von ??? (Gast)


Lesenswert?

Ich wuerd mal den Simulator des AVR studio anwerfen, und das Ganze 
durchsteppen

von Sven P. (Gast)


Lesenswert?

Wenn ich mich recht erinnere, reserviert der ATMega32 für jeden Eintrag 
in der Interrupt-Tabelle ein Doppelwort. Das deshalb, damit man ein 
vollständiges 'jmp' unterbringen kann, sodass man in den gesamten 
Programmspeicher hüpfen kann.

Ich denke, der springt dir an eine Stelle, wo nix steht (eben 
'unprogrammiert', 0xFF im Flash) und das, weil deine Tabelle zu kurz 
ist.

von Michael U. (amiga)


Lesenswert?

Hallo,
1
.include "m32def.inc"
2
     .org 0x000           da steht der ASM-Counter ohnehin am Anfang
3
     .def temp = r18
4
     .def t1h = r19
5
     .def t1l =r20
6
     .def stini = r17
7
     .cseg                etwas spät, ihm hier erst zu sagen, daß wir im cseg sind, wenn Du oben schon ein .org benutzt...
8
9
    rjmp init
10
11
12
    .org 0x010
13
     rjmp intt1
14
15
   .org 0x02b
warum nicht so?
1
;--------- Definitionen ----------
2
     .def temp = r18
3
     .def t1h = r19
4
     .def t1l =r20
5
     .def stini = r17
6
7
;--------- Programmbeginn ------- 
8
.cseg
9
   rjmp init
10
11
.org OVF1addr
12
   rjmp intt1
13
14
.org INT_VECTORS_SIZE
15
init:
16
17
usw. usw.

erspart viel nachdenken, wenn man die symbolischen Namen benutzt, 
spätestens, wenn man mit dem Code auf einen anderen AVR umzieht.

Gruß aus Berlin
Michael

von Paul (Gast)


Lesenswert?

Erstmal vielen Dank für die Antworten!
Hab die Adresse für den Interrupt geändert, jedoch bringt der Simulator 
immer noch die gleichen zwei Fehlermeldungen. Auch mit dem Doppelword 
habt Ihr recht, nur die Sprungweite des relativen Srung hat ausgereicht. 
Hab es aber zur Sicherheit mit dem Jump probiert und es hat sich nichts 
geändert. Michaels Ratschlag bezüglich der Programmierung werd ich mir 
auf jeden Fall angewöhnen.

von Stefan E. (sternst)


Lesenswert?

Mal 'ne dumme Frage: im Simulator den richtigen Controller eingestellt 
hast du aber schon, oder?

von Paul (Gast)


Lesenswert?

So dumm war deine Frage nicht! Das war der Grund! Besten dank.

von Thomas (kosmos)


Lesenswert?

zum simulieren debuggen setze ich eigentlich immer die Sprungtabelle für 
die Interrupts in den Quelltext damit man sieht wohin das Programm 
verzweigt gerade wenn man mit den Interrupts arbeitet.

Kosten kaum Platz auf dem AVR nur ist vielleicht etwas mehr scrollen 
nötig
.org 0x000     ;Beispiel für ATM16
  jmp RESET
  jmp EXT_INT0
  jmp EXT_INT1
  jmp TIM2_COMP
  jmp TIM2_OVF
  jmp TIM1_CAPT
  jmp TIM1_COMPA
  jmp TIM1_COMPB
  jmp TIM1_OVF
  jmp TIM0_OVF
  jmp SPI_STC
  jmp USART_RXC
  jmp USART_UDRE
  jmp USART_TXC
  jmp AD_C
  jmp EE_RDY
  jmp ANA_COMP
  jmp TWSI
  jmp EXT_INT2
  jmp TIM0_COMP
  jmp SPM_RDY

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.