www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Tutorial: AVR Simulator: Uninitialized stack pointer


Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich bin gerade dabei, mich in die Programmierung für AVRs einzuarbeiten. 
Ich habe hier ein STK500, darin steckt ein ATMEGA8515.
Ich bin kein Programmierneuling, aber mit ASM habe ich bisher nicht 
gearbeitet. Daher also Newbie und ich bitte um Nachsicht.

Ich bin im AVR-Tutorial nun beim Thema Stack angelangt. Das Programm, 
dass dort gezeigt wird:
.include "m8def.inc"
 
.def temp = r16
 
         ldi temp, HIGH(RAMEND)            ; HIGH-Byte der obersten RAM-Adresse
         out SPH, temp
         ldi temp, LOW(RAMEND)             ; LOW-Byte der obersten RAM-Adresse
         out SPL, temp
 
         rcall sub1                        ; sub1 aufrufen
 
loop:    rjmp loop
 
 
sub1:
                                           ; hier könnten ein paar Befehle stehen
         rcall sub2                        ; sub2 aufrufen
                                           ; hier könnten auch Befehle stehen
         ret                               ; wieder zurück
 
sub2:
                                           ; hier stehen normalerweise die Befehle,
                                           ; die in sub2 ausgeführt werden sollen
         ret                               ; wieder zurück 

Hier bekomme ich an der Stelle rcall sub1 die Meldung "AVR Simulator: 
Uninitialized stack pointer used at 0x0004". Soso, der Stackpointer ist 
nicht initialisiert? Aber das hab ich oben doch gemacht...? 
Funktionieren scheint das Programm trotzdem ordnungsgemäß, auf jeden 
Fall im Simulator.

Damit man etwas sieht, und um ein bisschen zu üben, hab ich mir 
folgendes Programm zusammengeklöppelt:
.include "m8def.inc"

init: 
      ldi r16, HIGH(RAMEND)            ; HIGH-Byte der obersten RAM-Adresse
      out SPH, r16
      ldi r16, LOW(RAMEND)             ; LOW-Byte der obersten RAM-Adresse
      out SPL, r16

      ldi r16, 0xFF        ; PortB ist Ausgang
      out DDRB, r16

      ldi r16, 0x00        ; PortD ist Eingang
      out DDRD, r16

      ldi r16, 0xFF        ; Alle LEDs ausschalten
      out PORTB, r16

mainloop:                     ; Schalter einlesen

      sbis PIND, 0
      rcall sub1

      sbis PIND, 1
      rcall sub2

      sbis PIND, 2
      rcall sub3

      rjmp mainloop

sub1: ldi r17, 0b00000000
      out PORTB, r17
      ret

sub2: ldi r17, 0b11111111
      out PORTB, r17
      ret

sub3: ldi r17, 0b10101010
      out PORTB, r17
      ret
Hier bekomme ich bei jedem rcall die selbe Fehlermeldung, aber wieder 
scheint das Programm korrekt zu funktionieren. Übertrag ich es aber in 
den µC, dann springt das Programm bei jedem ret wieder komplett an den 
Programmanfang. Das ist daran zu erkennen, dass wenn man z.B. SW0 
drückt, die LEDs sofort wieder ausgehen, wenn man den Taster loslässt. 
Aber eigentlich sollten die LEDs ja solange anbleiben, bis man den 
nächsten Taster drückt.

Woran liegt das, wo liegt mein Fehler?

Danke!
Jens

Autor: Zwölf Mal Acht (hacky)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Naja. Wo sind die Vektoren definiert ?  zB

.CSEG

.org  0x00
; irq table
  rjmp  init_far  ;reset
  nop      ;ext irq0
  nop      ;ext irq1
  nop      ;timer2 compare
  nop      ;timer2 overflow
  rjmp  Timer1Capture  ;timer1 capture
  nop      ;timer1 compareA
  nop      ;timer1 compareB
  rjmp    Timer1Int  ;timer1 overflow
  nop      ;timer0 overflow
  nop      ;SPI,STC
  rjmp  UART_RxInt  ;uart rx
  rjmp  UARTTxInt  ;uart tx empty
  rjmp  UARTendTx  ;uart tx complete
  nop      ;adc
  nop      ;EEPROM
  nop      ;analog comp
.org  0x11


Siehe auch :

http://www.ibrtses.com/embedded/avrasmuartint.html

Autor: Zwölf Mal Acht (hacky)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Uebrigens.. der Simulator laesst doch Singelstep zu

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Naja. Wo sind die Vektoren definiert ?  zB

Das ist erst mal uninteressant.

Bei mir läuft das Programm Fehlerfrei im Simulator. Hast du den 
richtigen Controller im Simulator eingestellt?

MfG Spess

Autor: Ich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
du schreibst:
.include "m8def.inc"

und verwendest:
Atmega 8515

-> andere SPH / SPL Registeradressen

Autor: Ralph B. (rkhb)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jens schrieb:
> darin steckt ein ATMEGA8515.
> [...]
> .include "m8def.inc"

Du verwendest die Definitionen für den ATmega8. Richtig wäre:

.include m8515def.inc

viele grüße
ralph

Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich danke euch.
In der Tat, mit der richtigen Includedatei gehts. Ich war davon 
ausgegangen, dass M8def.inc für Mega 8xxx steht. Wie gesagt, das hier 
sind meine ersten Schritte in der ASM und AVR-Welt. Aber ich lerne.

Danke!
Jens

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.