.include="m16def.inc" .equ Takt=8000000 .def akku=r16 .def mode=r17 .def position=r18 .def zaehlr=r19 .cseg rjmp start .org int0addr jmp clock .org int1addr jmp genTast ;Initialisierung start: ldi akku,LOW(RAMEND) out SPL,akku ldi akku,HIGH(RAMEND) out SPH,akku ldi akku,0xff out DDRB,akku ldi akku,0b11111110 out DDRA,akku ldi akku,0x00 out PORTD,akku initad: ldi akku,0b10000111 out ADCSR,akku ldi akku,0b01000000 out ADMUX,akku ldi akku,0b11001111 in akku,MCUCR initin: sbr akku,1 << ISC01 sbr akku,1 << ISC00 sbr akku,1 << ISC11 sbr akku,1 << ISC10 out MCUCR,akku in akku,GICR sbr akku,1 << INT0 sbr akku,1 << INT1 out GICR,akku sei ;durchlauf1: ldi mode,0 ldi position,1 rcall ausgabe rcall vordurch ;======================================================== loop: in akku,PINC rjmp loop ;======================================================== clock: cpi mode,0 breq vori cpi mode,1 breq rucki rjmp zufalli ;Auswerten eines Tastendrucks ausser Clock genTast:in akku,PINC cpi akku, 0xff breq modech rcall test1 reti ;======================================================== ;Aendern des Modus modech: in akku,sreg push akku ldi akku,5 cpi mode, 2 breq moder inc mode cpi mode, 1 breq ruckstart rcall zufalldurch ldi akku,10 rcall wartex10ms pop akku out sreg,akku reti ruckstart: rcall ruckdurch ldi akku,10 rcall wartex10ms pop akku out sreg,akku reti moder: ldi mode, 0 rcall vordurch ldi akku,10 rcall wartex10ms pop akku out sreg,akku reti ;======================================================== ;Vorwärts vori: ;rjmp test1 rcall vor rcall ausgabe reti ;Rückwärts rucki: rcall ruck rcall ausgabe reti ;Zufall zufalli:rcall zufall rcall ausgabe reti ;======================================================== ;Vorshiften vor: cpi position, 8 breq vorr inc position ret vorr: ldi position,1 ret ;Rückshiften ruck: cpi position, 1 breq ruckr dec position ret ruckr: ldi position, 8 ret ;Zufallshiften zufall: push akku push mode zufalla:sbi ADCSR,ADSC wait_adc: sbic ADCSR,ADSC rjmp wait_adc in r20, ADCL in r21, ADCH mov akku,r20 add akku,r21 com akku kleiner:subi akku,8 brcc kleiner subi akku,-9 vergleich: cp akku,position breq zufalla mov position,akku pop mode pop akku ret ;========================================================== ;Ausgabe ausgabe:push akku ldi zaehlr,1 ldi akku, 1 ;Ausgabeshiftloop aloop: cp position, zaehlr breq output lsl akku inc zaehlr jmp aloop output: out PORTB, akku pop akku ret ;=========================================================== ;Vorwärts durchlaufen vordurch: ldi akku,10 rcall vor rcall ausgabe rcall wartex10ms rcall vor rcall ausgabe rcall wartex10ms rcall vor rcall ausgabe rcall wartex10ms rcall vor rcall ausgabe rcall wartex10ms rcall vor rcall ausgabe rcall wartex10ms rcall vor rcall ausgabe rcall wartex10ms rcall vor rcall ausgabe rcall wartex10ms rcall vor rcall ausgabe ret ;Rückwärtsdurchlaufen ruckdurch: ldi akku,10 rcall ruck rcall ausgabe rcall wartex10ms rcall ruck rcall ausgabe rcall wartex10ms rcall ruck rcall ausgabe rcall wartex10ms rcall ruck rcall ausgabe rcall wartex10ms rcall ruck rcall ausgabe rcall wartex10ms rcall ruck rcall ausgabe rcall wartex10ms rcall ruck rcall ausgabe rcall wartex10ms rcall ruck rcall ausgabe rcall wartex10ms ret ;Zufälligdurch zufalldurch: ldi akku,10 rcall zufall rcall ausgabe rcall wartex10ms rcall zufall rcall ausgabe rcall wartex10ms rcall zufall rcall ausgabe rcall wartex10ms rcall zufall rcall ausgabe rcall wartex10ms rcall zufall rcall ausgabe rcall wartex10ms rcall zufall rcall ausgabe rcall wartex10ms rcall zufall rcall ausgabe rcall wartex10ms rcall zufall rcall ausgabe rcall wartex10ms ret ;===================================================== ;Warten wartex10ms: tst r16 breq wartex10msc push r16 push r24 push r25 wartex10msa: ldi r24,LOW(TAKT/400) ldi r25,HIGH(TAKT/400) wartex10msb: sbiw r24,1 brne wartex10msb dec r16 brne wartex10msa pop r25 pop r24 pop r16 wartex10msc: ret ;test test: ldi akku,0xff out PORTB,akku reti test1: ldi akku,0 out PORTB,akku ret .EXIT