www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik rcall im programm funktioniert nicht


Autor: Peter Volkmer (peter65)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
bin blutiger Anfänger in Assembler und versuche einen ATMega 162 zu 
programmieren.
Jetzt wird in meinem Programm der rcall Befehl nicht ausgeführt, ich 
finde den Fehler nicht.
Wenn ich erst den Stack einrichte und dann rjmp reset, wird der rcall 
warte nicht ausgeführt, wird erst der rjmp reset ausgeführt, wird der 
Stack nicht eingerichtet und es gibt einen "AVR Simulator: Uninitialized 
stack pointer used at 0x001b" Fehler.
Ich blick da nicht durch.
Danke schon mal im voraus.



.include "m162def.inc"

.def  a = r16        ; definition r16 = a
.def  b = r17        ; definition r17 = b
.def  c = r18        ; definition r18 = c
.def  d = r19        ; definition r19 = d
.def  temp = r20      ; definition r20 = temp
.def  wart = r21      ; definition r21 = warte


.cseg            ; code in flash-speicher
.org  0x000        ; setzt den folgenden code ab adresse 0x000


;rjmp reset          ; sprung nach reset


  ldi temp,HIGH(RAMEND)  ; stack einrichten für sprungbefehle
  out SPh,temp
  ldi temp,low(RAMEND)
  out SPl,temp

 rjmp reset        ; sprung nach reset


warte:            ; warteschleife

  nop          ; 250 takte ==> jeder befehl 1 takt
  dec wart      ; 250 takte ==> jeder befehl 1 takt
  brne warte    ; 499 takte ==> bei sprung 2 takte, sonst 1er
  ret






reset:            ; reset-sprungmarke = Programmstart
  ldi temp,0xff      ; schreibt 255 in temp (r20)
  ldi  a,0b11111111    ; Bitmuster für a (alle lampen an)
  ldi b,0b01010101    ; Bitmuster für b (1 = an)
  ldi c,0b00000000    ; Bitmuster für c (alle aus)
  ldi d,0b10101010    ; Bitmuster für d (1 = an)

  out ddra,temp      ; schreibt temp (255) in DatenRichtungRegister a, 
(alles Ausgänge)
  out ddrb,temp      ; b auch Ausgänge
  out ddrc,temp      ; c auch Ausgänge
  out ddrd,temp      ; d auch Ausgänge

loop:            ; sprungmarke
  out porta,a        ; schreibt alles nach Port a
  out portb,b        ; ebenso
  out portc,c        ; ebenso
  out portd,d        ; ebenso
  dec a          ; decrement a
  dec b          ; decrement b
  dec c          ; decrement c
  dec d          ; decrement d
  ldi wart,0x05      ; warteschleife 5 x
  rcall warte        ; unterprogramm warteschleife

rjmp loop          ; relativer sprung nach loop



  rjmp reset

Autor: Otto (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Peter,

einen richtigen Fehler kann ich nicht ausmachen,
jedoch solltest Du das Programm geringfügig
umstellen:

RESET: ldi temp,HIGH(RAMEND)  ; stack einrichten für sprungbefehle
       out SPh,temp
       ldi temp,low(RAMEND)
       out SPl,temp
       ...
       ...
       ...


LOOP:  ...
       ...
       ldi r21,4
       rcall WARTE
       rjmp LOOP

WARTE: nop          ; 250 takte ==> jeder befehl 1 takt
       dec r21      ; 250 takte ==> jeder befehl 1 takt
       brne WARTE   ; 499 takte ==> bei sprung 2 takte, sonst 1er
       ret

Versuche mal, die Variable "wart" durch das Register "r21" zu ersetzen.
Evtl. kommt der Assembler durcheinander....

Autor: Peter Volkmer (peter65)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Erst mal danke für die Antwort,
hat aber nichts geändert.
Ich habe das Unterprogramm auch mal in test umbenannt, das Register mit 
r21 angesprochen, aber der rcall wird nicht ausgeführt.
Ist das ev. ein Fehler in AVRStudio 4.13 ??
Wenn ich den Stack rausnehme, dann gibt es wieder die Fehlermeldung:
AVR Simulator: Uninitialized stack pointer used at 0x000f
AVR Simulator: Invalid opcode 0xffff at address 0x0000ff
Das heißt doch, das der rcall ausgeführt wird, aber kein Stack 
eingerichtet ist, oder sehe ich das falsch ?

Autor: Bastler (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
fehlt da vor dem brne nicht ein cp / cpi?

z.b.:
dec r21
cpi r21, 0x(irgendwas)
brne warte

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habs grad mal bei mir durchlaufen lassen (auch AVRStudio 4.13). Läuft 
problemlos, auch der rcall wird ausgeführt.

Autor: Peter Volkmer (peter65)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
aber woran kann es dann liegen, das es bei mir nicht läuft ??

Autor: Peter Volkmer (peter65)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke noch mal an alle,
hab den Fehler grade gefunden

Es gibt da einen unterschied zwischen f10 und f11.

sorry

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter Volkmer wrote:
> Es gibt da einen unterschied zwischen f10 und f11.
Right. Das sind zwei verschiedene Tasten...;-)

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Johannes M. wrote:
> Peter Volkmer wrote:
>> Es gibt da einen unterschied zwischen f10 und f11.
> Right. Das sind zwei verschiedene Tasten...;-)

Und die haben auch unterschiedliche Funktion. Und zusätzlich gibt es 
noch ein paar Funktionen mehr, erreichbar mit diversen Umschalttasten. 
Interessant mit der F9-Taste wird dann auch die F5-Taste. Einfach mal im 
Menü rumblättern und die Tastenkombinationen lesen.

...

Autor: Wolfram Quehl (quehl)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
die Wartefunktion hat 25 Takte. Soll das so sein? Da kann man natürlich 
nichts mehr sehen. Versuch mal das Programm AVRDelayloop zu finden. Da 
wird der Code für bestimmte Wartezeiten angegeben.

mfg

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wer solche Programme nutzt, der lernt nix dabei. Der vernünftige Umgang 
mit dem Simulator (oder Debugger, wenn die entsprechende Hardware 
angeschlossen ist) des AVR-Studios bringt da bedeutend mehr.

Volkers Fehler war die Bedienung des Simulators. Er hat statt wirklichem 
Einzelschritt (F11) den Einzelschritt gewählt, der Unterprogramme zwar 
ausführt, aber in der Anzeige überspringt (F10). Der Simulator/Debugger 
hat recht viele Möglichkeiten, also auch viel Potential zur 
Fehlbedienung.

...

Autor: Wolfram Quehl (quehl)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja so ist es, wenn nicht alles gesagt wird. Oben steht nichts von 
Simulation.  Aber dann wird er ja jetzt gemerkt haben, daß das nur 25 
Takte sind. Bei dem angegebenen Programm kann man genauso gut lernen. 
Sind doch nur Programmbeispiele, wie man sie hier zuhauf findet und auch 
im Tutorial. Wenn man natürlich nur die Befehle abschreibt, ohne lernen 
zu wollen, dann kann er das genauso gut auch im Tutorial finden. Nur mit 
diesem Programm hat er gleich die richtigen Werte und wenn er die 
Anweisungen in der Liste der Anweisungen nachsieht, dann weiß er auch, 
was die machen.

mfg

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.