28.11.2006, 13:59
|
#5
|
Master
Registriert seit: 11.03.2003
Alter: 41
Beiträge: 610
|
Ok, hat sich geklärt, ich hatte an einigen Stellen statt rjmp rcall benutzt, dann aber kein RET, daher hatte ich dann immer einen Stack overflow.
Hier der einwandfrei funktionierende text:
Zitat:
.nolist
.include "C:\Program Files\Atmel\AVR Tools\AvrAssembler2\Appnotes\m8535def.inc"
.list
.def vorrueck=r16
.def counter=r17
.def AR1=r18
.def AR2=r19
.def gezaehlt=r20
.def hilfszaehler=r21
rjmp main
main:
ldi AR1,LOW(RAMEND) ;Stackpointer
out SPL,AR1
ldi AR1,HIGH(RAMEND)
out SPH,AR1
ldi AR1, 0x00 ;DataDirection D für Input
out DDRD, AR1
ldi AR1, 0xFF ; Port D alles auf 1 Setzen (1=alles aus)
out PORTD, AR1
ldi AR1, 0xFF ; Datadirection B auf 0 also Eingang
out DDRB, AR1 ; Port B alles 1 damit alle LDS aus
out PORTB, AR1
ldi gezaehlt, 1
loop:
in AR2, PIND
rcall pruefen_reset
rcall ausgabe
rjmp loop
pruefen_reset:
ldi AR1, 0xFF
cpse AR1, AR2
rjmp pruefen_vor
rcall entprellen
ldi gezaehlt, 0
ret
pruefen_vor:
ldi AR1, 0xFE
cpse AR1, AR2
rjmp pruefen_rueck
rcall entprellen
ldi vorrueck, 1
rjmp pulse
pruefen_rueck:
ldi AR1, 0xFD
cpse AR1, AR2
rjmp pulse
rcall entprellen
ldi vorrueck, 2
rjmp pulse
pulse:
ldi AR1, 0xFC
cpse AR1, AR2
ret
rcall entprellen
ldi AR1, 0
cpse AR1, gezaehlt
ret
ldi gezaehlt, 1
ldi AR1, 0xFE
cpse AR1, vorrueck
rjmp decrease
rjmp increase
decrease:
dec counter
ret
increase:
inc counter
ret
ausgabe:
mov R1, counter
com R1
out PORTB, R1
ret
entprellen:
clr hilfszaehler
loop2:
in AR2, PIND
cpse AR1, AR2
rjmp loop
inc hilfszaehler
ldi AR2, 2
cpse hilfszaehler, AR2
rjmp loop2
ret
|
|
|
|