Einzelnen Beitrag anzeigen
Alt 28.11.2006, 13:59   #5
philharmony
Master
 
Registriert seit: 11.03.2003
Alter: 41
Beiträge: 610


philharmony eine Nachricht über ICQ schicken
Standard

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

philharmony ist offline   Mit Zitat antworten