Code:
.org 0x000
rjmp main
.equ motorport=portb
.equ motorddr=ddrb
.equ m1a=0
.equ m2a=1
.equ m3a=2
.equ m4a=3
.equ sensorport=portb
.equ sensorddr=ddrb
.equ sensorpin=pinb
.equ irl=5
.equ irr=4
.equ irm=6
.equ trigger=6
.equ echo=7
.org 0x020
.def temp1=r16
.def weg=r23
.def temp2=r21
.def temp3=r22
.equ XTAL=1000000
.include "tn2313def.inc"
main:
powerupwait:
ldi r16, low(RAMEND)
out SPL, r16
ldi r18, 16
ldi r19, 57
ldi r20, 14
L16: dec r20
brne L16
dec r19
brne L16
dec r18
brne L16
rcall initm
go:
rcall vor
rcall sensorl
rcall vor
rcall sensorr
rcall vor
;rcall sensorm
rcall vor
rcall sensorl
rcall vor
rcall sensorr
rcall vor
;rcall sensorm
clr r26
rcall sensorus
cpi weg, 5
brlo hindernisvorne2
; 200ms at 1.0 MHz
;rcall irsensor
rjmp go
;;IRSENSOREN
sensorm:
in r16, sensorpin
sbrc r16, irm
ret
;HINDERNISS LINKS
rcall stop
rcall ruck
; Delay 500 000 cycles
; 500ms at 1.0 MHz
ldi r18, 6
ldi r19, 138
ldi r20, 86
L11: dec r20
brne L11
dec r19
brne L11
dec r18
brne L11
rcall links
ldi r16, 255
marker01:
dec r16
brne marker01
rcall links
ldi r18, 5
ldi r19, 138
ldi r20, 86
L12: dec r20
brne L12
dec r19
brne L12
dec r18
brne L12
ret
sensorl:
in r16, sensorpin
sbrc r16, irl
ret
;HINDERNISS LINKS
rcall stop
sbrs r26, 0
rcall rechts
sbrc r26, 0
rcall ruck
; Delay 500 000 cycles
; 500ms at 1.0 MHz
ldi r18, 3
ldi r19, 38
ldi r20, 86
L1555: dec r20
brne L1555
dec r19
brne L1555
dec r18
brne L1555
rcall stop
ret
hindernisvorne2:
rcall hindernisvorne
ret
sensorr:
in r16, sensorpin
sbrc r16, irr
ret
;HINDERNISS LINKS
rcall stop
sbrs r26, 1
rcall links
sbrc r26, 1
rcall ruck
; Delay 500 000 cycles
; 500ms at 1.0 MHz
ldi r18, 3
ldi r19, 38
ldi r20, 86
L2: dec r20
brne L2
dec r19
brne L2
dec r18
brne L2
rcall stop
ret
irsensor:
sbi sensorport, trigger
nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop
cbi sensorport, trigger
wait1:
sbis sensorpin, echo
rjmp wait1
;;Timer0 Als counter misbrauchen um dielänge ds signals zu erfassen
;;0,5ms entsprechen 10 cm distanz das sind bei 1mhz takt 500 takte. genauer gesagt 583 laut datenblatt
;;prescaler von 256 würde also ausreichen...das würde einen counterwert von 583/256=2 ergeben..und bei max distanz von 68
;;
;CS02 CS01 CS00 Description
;0 0 0 No clock source (Timer/Counter stopped)
;0 0 1 clkI/O/(No prescaling)
;0 1 0 clkI/O/8 (From prescaler)
;0 1 1 clkI/O/64 (From prescaler)
;1 0 0 clkI/O/256 (From prescaler)
;1 0 1 clkI/O/1024 (From prescaler)
;1 1 0 External clock source on T0 pin. Clock on falling edge
;1 1 1 External clock source on T0 pin. Clock on rising edge
ldi temp1, (1<<CS02)
out tccr0, temp1 ;prescaler auf 256
;;AB JETZT LÄUFT DER TIMER
warten2: ;Timer stoppten wenn Echo wieder Low ist
sbic sensorpin, echo
rjmp warten2
ldi temp1, 0x00
out tccr0, temp1
;;Timer 0 gestoppt
in temp1, tcnt0
cpi temp1, 3
brlo hindernisvorne
ret
hindernisvorne:
rcall stop
rcall ruck
ldi r18, 3
ldi r19, 138
ldi r20, 86
L3: dec r20
brne L3
dec r19
brne L3
dec r18
brne L3
rcall stop
rcall sensorl
rcall sensorr
rcall vor
ret
sensorus:
sbi sensorddr, trigger
sbi sensorport, trigger
ldi temp1, (XTAL/1000000+2)
trig:
nop nop nop nop nop nop nop nop nop nop nop
dec temp1
brne trig
cbi sensorport, trigger
;;;;GETRIGGERT ABHÄNGIG VOM TAKT
;;;117 takte bei 1 Mhz sind 1 cm
;;;Auf Echo warten
wait1222:
cbi sensorddr, echo
in temp1, sensorpin
clr weg
sbrs temp1, echo
rjmp wait1222
;;So nun fix mit dem zählen anfangen
zahlen:
ldi temp2, (XTAL/1000000)
marker02:
ldi temp1, (116/2)
marker011:
dec temp1
brne marker011
dec temp2
brne marker02
inc weg
;;;So nun wäre es 1 cm
in temp1, sensorpin
sbic sensorpin, echo
rjmp zahlen
ret
;MOTOREN
;Eingang "1A" Eingang "2A" "1,2EN" Ausgang "1Y" Ausgang "2Y" entspricht
;0V 0V 5V - - Motor kurzschließen (Bremsen)
;0V 5V 5V - + Motor dreht vorwärts
;5V 0V 5V + - Motor dreht rückwärts
;5V 5V 5V + + Motor kurzschließen (Bremsen)
;egal egal 0V hochohmig hochohmig Motor aus (Verbindung trennen, nicht kurzschließen)
stop:
initm:
ldi r16, (1<<m1a) |(1<<m2a)|(1<<m3a)|(1<<m4a)
out motorddr, r16
out motorport, r16
ret
vor:
ldi r16, (0<<m1a) |(1<<m2a)|(0<<m3a)|(1<<m4a)
out motorport, r16
ret
ruck:
ldi r16, (1<<m1a) |(0<<m2a)|(1<<m3a)|(0<<m4a)
out motorport, r16
ret
links:
sbr r26, 1
ldi r16, (1<<m1a) |(0<<m2a)|(0<<m3a)|(1<<m4a)
out motorport, r16
ret
rechts:
sbr r26, 0
ldi r16, (0<<m1a) |(1<<m2a)|(1<<m3a)|(0<<m4a)
out motorport, r16
ret
Ich hoffe einer von Euch erbarmt sich dieses Chaos durchzuarbeiten. Ich freue mnich über jeglich Tipps und Verbesserungen eurer seits.
Lesezeichen