Forum: Mikrocontroller und Digitale Elektronik ATMega16 Unterprogramm anspringen geht nicht mehr???


von Kie B. (kiebitz0309)


Lesenswert?

Bis vorhin funktionierte diese Programm bei mir:

;+----------------------------------------------------------------------
.include  "m16def.inc"
;----------------------------------------------------------------------- 
-
;Reset and Interrupt vector             ;VNr.  Beschreibung
  rjmp  main  ;1   POWER ON RESET
  reti    ;2   Int0-Interrupt
  reti    ;3   Int1-Interrupt
  reti    ;4   TC2 Compare Match
  reti    ;5   TC2 Overflow
  reti    ;6   TC1 Capture
  reti    ;7   TC1 Compare Match A
  reti    ;8   TC1 Compare Match B
  reti    ;9   TC1 Overflow
  reti    ;10  TC0 Overflow
  reti    ;11  SPI, STC Serial Transfer Complete
  reti    ;12  UART Rx Complete
  reti    ;13  UART Data Register Empty
  reti    ;14  UART Tx Complete
  reti    ;15  ADC Conversion Complete
  reti    ;16  EEPROM Ready
  reti    ;17  Analog Comparator
  reti    ;18  TWI (I²C) Serial Interface
  reti    ;19  Store Program Memory Ready
;----------------------------------------------------------------------- 
-
;Start, Power ON, Reset
main:  ldi  r16,low(RAMEND)
  out  SPL,r16
  ldi  r16,high(RAMEND)
  out  SPH,r16
  ldi  r16,0b11111111
  out  DDRC,r16    ;PORTA auf Ausgang
  out  DDRB,r16    ;PORTB auf Ausgang
  out DDRB,r16    ;PORTC auf Ausgang
;----------------------------------------------------------------------- 
--

start:    out PORTC,r20
    ldi  r16,0x01
    out PORTB,r16
    rcall loop
    ldi  r16,0x02
    out PORTB,r16
    rcall loop
                  jmp start

loop:             ldi  R17, $12
WGLOOP0:          ldi  R18, $BC
WGLOOP1:          ldi  R19, $C4
WGLOOP2:          dec  R19
                  brne WGLOOP2
                  dec  R18
                  brne WGLOOP1
                  dec  R17
                  brne WGLOOP0
                  ret



Jetzt bleibt das Programm beim Aufruf des Unterprogrammes stehen ? Was 
ist passiert? Simuliere mit AVRStudio. Vielen Dank

von TravelRec. (Gast)


Lesenswert?

Die Vektorentabelle muß statt der vielen reti ein "rjmp RESET" erhalten, 
wobei RESET die Sprungmarke zur ersten Adresse nach den Interruptvekoren 
ist. Außerdem paßt Deine Schleifenverschachtelung nicht. r19 wird immer 
wieder neu geladen, decrementiert, neu geladen... Da kommt der 
Controller nicht mehr heraus.

von Karl H. (kbuchegg)


Lesenswert?

> Jetzt bleibt das Programm beim Aufruf des Unterprogrammes stehen

Ein Programm auf einem µC kann nicht einfach stehen bleiben-

> Simuliere mit AVRStudio.

Hast du vielleicht "Single Step" F10 mit "Step into" F11
verwechselt? Wenn du mit einem F10 über den rcall drübersteppst,
dann dauert das schon seine Zeit, bis der Simulator durch
die Schleifen durchsimuliert hat.

von Karl H. (kbuchegg)


Lesenswert?

> Die Vektorentabelle muß statt der vielen reti ein "rjmp RESET"
> erhalten,

Da keine Interrupts im Spiel sind, ist das erst mal egal.
Selbst wenn da Interrupts wären ist an den reti erst
mal nichts auszusetzen.

> Außerdem paßt Deine Schleifenverschachtelung nicht. r19 wird immer
> wieder neu geladen, decrementiert, neu geladen

Neu geladen wird nur, nachdem die Schleifevariable in der
Schleife eins weiter drausen um 1 runtergezählt wurde.
Irgendwann sind diese verschachtelten Schleifen also zuende.
Im Simulator dauert das seine Zeit, aber irgendwann kommt
der call zurück.

von TravelRec. (Gast)


Lesenswert?

Karl Heinz, hast Recht, die Schleifen sind irgendwann durch, hab´s  mit 
den Augen ;-). Die retis da oben soll´er aber doch mal in "jmp Reset" 
(nicht rjmp...) ändern, sonst geht dann später auf einmal nix mehr...

von Karl H. (kbuchegg)


Lesenswert?

> "jmp Reset" (nicht rjmp...) ändern

so wird ein Schuh draus :-)
Beim Mega16 sind die Interrupt Vektoren schon 2 Byte
gross.
Insofern ist die Aussage: 'An den reti ist erstmal nichts
auszusetzen' etwas gewagt. Um nicht zu sagen: falsch.

von TravelRec. (Gast)


Lesenswert?

Am besten, der Lutz brennt den Kram mal und simuliert nicht, dann sieht 
er am ehesten, ob´s geht oder nicht ;-)

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.