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
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.
> 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.
> 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.
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...
> "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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.