Forum: Mikrocontroller und Digitale Elektronik Problem mit Subroutine CALL-RET.


von André M. (killroymenzel)


Lesenswert?

Hallo....

Ich habs geschafft mein EBAY-ISP mit meinem mega128A-Board zum Laufen 
bekommen...JUHU

Ein bisschen Bit-schupserei klappt aber ich habe Probleme mit meiner 
delay
subroutine.

Aufrufen mit CALL funzt, aber den Befehl "RET" führt er nicht aus, und 
bleibt einfach stehen.

wenn ich statt RET einen RJMP xy eintrage funktioniert es...

Mach ich was grundlegenes falsch?

Gruss...... Andre

von Dietrich L. (dietrichl)


Lesenswert?

andre menzel schrieb:
> Mach ich was grundlegenes falsch?

Ja, Du zeigst Dein Programm vollständiges nicht :-(

von Stefan E. (sternst)


Lesenswert?

andre menzel schrieb:
> ... mega128A-Board ...
> ...
> Aufrufen mit CALL funzt, aber den Befehl "RET" führt er nicht aus, und
> bleibt einfach stehen.

M103C-Fuse deaktivieren.

von (prx) A. K. (prx)


Lesenswert?

Der M128 kommt im M103-Modus zur Welt, was zu exakt diesem Effekt führt. 
Entsprechende Fuse umswitchen.

von Spess53 (Gast)


Lesenswert?

Hi

>Mach ich was grundlegenes falsch?

Ich gehe mal von Assembler aus: Stack nicht initialisiert.

MfG Spess

von André M. (killroymenzel)


Lesenswert?

Stefan Ernst schrieb:
> M103C-Fuse deaktivieren

Danke...schaue ich sofort....

Spess53 schrieb:
> Ich gehe mal von Assembler aus: Stack nicht initialisiert

Ja...Assember.. :-) mein Steckenpferd...

hmmmm Stack initialisiere ich wie...?

sorry...AVR-Dummy.. :-D

André

von (prx) A. K. (prx)


Lesenswert?


von Spess53 (Gast)


Lesenswert?

Hi

Oder Datenblatt S.61. Die vier Befehle, die nach 'RESET:' stehen.

MfG Spess

von André M. (killroymenzel)


Lesenswert?

.include  "m128adef.inc"
.org    0x00
    rjmp main

init:
  ldi    r16,0xFF
  out    DDRC,r16
  nop
  ldi    r16,0xFE
  out   DDRB,r16

main:
  ldi    r21,0x08
  ldi    r16,0xFE
  sec
main5:
  out    PORTC,r16
  rol    r16
  call  delay
  out    PORTC,r21
  call  delay
  rjmp  main5


delay:
    ldi  r18,0x04
    ldi  r19,0xFF
    ldi  r20,0xFF
L1: dec  r20
    brne L1
    dec  r19
    brne L1
    dec  r18
    brne L1
;  rjmp main5
    ret



Exteted Fuse ist FD
Watchdog 1
M103C    0

andere Kombinationen gehen gar nicht..... komisch....

von (prx) A. K. (prx)


Lesenswert?

Fuse 0 heisst aktiviert und Stack wird nicht initialisiert.

von MWS (Gast)


Lesenswert?

andre menzel schrieb:
> andere Kombinationen gehen gar nicht..... komisch....

Die muss auf FF, eine 0 bedeutet: diese Option ist eingeschaltet.
http://www.engbedded.com/fusecalc

von Spess53 (Gast)


Lesenswert?

Hi

>M103C    0

Damit ist der M103-Mode eingeschaltet.

>.include  "m128adef.inc"
>  ....

Da wird kein Stack initialisiert.

MfG spess

von Eumel (Gast)


Lesenswert?

Spess53 schrieb:
> Da wird kein Stack initialisiert.
>
> MfG spess

Muss man das bei dem überhaupt? Bei vielen AVRs kann man sich das auch 
sparen.

von (prx) A. K. (prx)


Lesenswert?

Er wird schon initialisiert. Aber auf 0. Das bringts nicht wirklich. Der 
M128 ist einer der ältesten Megas und das A hat daran nichts geändert.

von MWS (Gast)


Lesenswert?

Eumel schrieb:
> Muss man das bei dem überhaupt? Bei vielen AVRs kann man sich das auch
> sparen.

Steht im DB, wird beim ATM128 auf 0 initialisiert, bei neueren AVR's 
bereits auf RAMEND.

von André M. (killroymenzel)


Lesenswert?

.include  "m128adef.inc"
.org    0x00
    rjmp main

RESET:
  ldi    r16, high(RAMEND)    ; Main program start
  out    SPH,r16          ; Set stack pointer to top of RAM
  ldi    r16, low(RAMEND)
  out    SPL,r16
  sei              ; Enable interrupts


init:
  ldi    r16,0xFF
  out    DDRC,r16
  nop
  ldi    r16,0xFE
  out   DDRB,r16

main:
  ldi    r21,0x08
  ldi    r16,0xFE
  sec
main5:
  out    PORTC,r16
  rol    r16
  call  delay
  out    PORTC,r21
  call  delay
  rjmp  main5


delay:
    ldi  r18,0x04
    ldi  r19,0xFF
    ldi  r20,0xFF
L1: dec  r20
    brne L1
    dec  r19
    brne L1
    dec  r18
    brne L1
  ret



so sieht es jetzt aus....... und so bleibt er in der delay "hängen",
und wenn ich die Fuses auf FF setzte, dann geht gar nichts mehr....

von Achim (Gast)


Lesenswert?

Probiere mal

ldi   r16,low (RAMEND)
out   SP,r16


So ging es dann bei mir mit einem ATtiny26

von (prx) A. K. (prx)


Lesenswert?

Ich bin auch net so sicher, ob der Tipp mit 0xFF der Weisheit letzter 
Schluss war. Denn das läuft auf einen externen Quarz raus - und wenn da 
keiner sein sollte...

von André M. (killroymenzel)


Lesenswert?

dann kommt die Error meldung:

undefined symol:SP

von MWS (Gast)


Lesenswert?

andre menzel schrieb:
> und wenn ich die Fuses auf FF setzte, dann geht gar nichts mehr....

Mal die anderen Fuses verglichen ?

Du überspringst RESET: und rufst nur main auf...

von (prx) A. K. (prx)


Lesenswert?

Nope, dein Code war richtig. Der Tiny hat nur SP, der M128 hat beide.

von André M. (killroymenzel)


Lesenswert?

Aber leider funktioniert das alles nicht...
mit Fuse FD
RET funzt nicht
mit Fuse FF
macht er GAR nichts........ :-(

von MWS (Gast)


Lesenswert?

andre menzel schrieb:
> Aber leider funktioniert das alles nicht...

Gelesen, dass Du den SP-Init zwar im Code hast, aber nicht aufrufst ?

von (prx) A. K. (prx)


Lesenswert?

Apropus Fuses: Da gibts 3 Bytes, nicht nur 1. Von welchem redest du? Die 
FF passen nur zum dritten (extended). Die anderen beiden solltest du 
erst einmal in Ruhe lassen, dort könnte es sein, dass du dich damit 
aussperrst.

von André M. (killroymenzel)


Lesenswert?

Ja es geht nur um das dritte....extented....

von André M. (killroymenzel)


Lesenswert?

@MWS
Danke.....habe ich ganz übersehen....

jetzt geht auch fuse=FF und RET

DANKE an alle...........

:-D

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.