mikrocontroller.net

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


Autor: Kie Bitz0309 (kiebitz0309)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: TravelRec. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: TravelRec. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: TravelRec. (Gast)
Datum:

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

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.