Code:
.include "m8def.inc"
;31248 1 Sek
.EQU TIME05 = 65536 - 15624 ; 0,5 Sekunden
.EQU TIME2 = 65536 - 62496 ; zwei Sekunde
.EQU TIME1 = 65536 - 31248 ; eine Sekunde
.def temp = r16
.def speed = r21
.def updown = r22
.org 0x0000
rjmp start
.org OVF0addr ;Interrupt-handler für 8 Bit Timer0
rjmp interrupt
start:
ldi updown, 0b00000000
ldi r20,HIGH(TIME2) ;Trick, um Timer0 auf 16 Bit zu erweitern
ldi temp,LOW(TIME2) ;Starwert Timer
out TCNT0,temp
ldi temp,(1<<CS02|1<<CS00) ;Prescaler Systemtakt/1024
out TCCR0,temp
ldi temp,(1<<TOIE0) ;Timer Interrupt über TOV0 erlauben
out TIMSK,temp ; "
ldi temp, (1 << WGM10) | (1 << COM1A1) | (1 << COM1B1)
out TCCR1A, temp
ldi temp, (1 << CS11)
out TCCR1B, temp
ldi speed,0
out OCR1BH, speed
out OCR1BL, speed
out OCR1AH, speed
out OCR1AL, speed
cbi DDRD, PD7
cbi PORTD, PD7
sbi PORTC, PC0
sbi PORTC, PC1
sei ;global Interrupts einschalten
;Stackpointer setzen wg. Unterprogramm
ldi temp,HIGH(RAMEND)
out SPH,temp
ldi temp,LOW(RAMEND)
out SPL,temp
SBI DDRB, DDB1 ; Motordatenrichtungsbit setzen
SBI DDRB, DDB2
SBI DDRB, DDB4
SBI DDRB, DDB5
SBI DDRD, DDD4
SBI DDRD, DDD5
SBI PORTB, PB1 ; Motorenports PB1 und PB2 auf 5V schalten
SBI PORTB, PB2
sbi PORTD, PD5
sbi PORTB, PB5
sbi DDRC, DDC0
sbi DDRC, DDC1
;Hauptprogramm:
loop: ;leere Schleife
rjmp loop
;Interrupt Handler
interrupt: ;LEDs toggeln
inc r20 ;Timererweiterung inkrementieren
brne interrupt2 ;wenn r20=0, zu interrupt2 springen
ldi r20,HIGH(TIME2) ;sonst Starwert Timer neu setzen
;cbi PORTD, PD5
;cbi PORTB, PB5
sbrs updown,7 ;0 hoch, 1 runter
rjmp hoch
sbrc updown,7
rjmp runter
hoch:
inc speed ;1
inc speed ;2
inc speed ;3
inc speed ;4
inc speed ;5
inc speed ;6
inc speed ;7
inc speed ;8
inc speed ;9
inc speed ;10
inc speed ;11
inc speed ;12
inc speed ;13
inc speed ;14
inc speed ;15
inc speed ;16
rjmp testcompare
runter:
dec speed ;1
dec speed ;2
dec speed ;3
dec speed ;4
dec speed ;5
dec speed ;6
dec speed ;7
dec speed ;8
dec speed ;9
dec speed ;10
dec speed ;11
dec speed ;12
dec speed ;13
dec speed ;14
dec speed ;15
dec speed ;16
testcompare:
out OCR1AH, speed ; für den linken Motor
out OCR1AL, speed ; für den linken Motor
out OCR1BH, speed ; und für den rechten Motor
out OCR1BL, speed ; und für den rechten Motor
brvs noswitch
brne noswitch2
switch:
; sbrs updown,7
; rjmp noswitch2
sbrc updown,7
rjmp noswitch
;rjmp noswitch
noswitch:
ldi updown, 0b10000000
cbi DDRC, DDC0
cbi DDRC, DDC1
rjmp interrupt2
noswitch2:
ldi updown, 0b00000000
sbi DDRC, DDC0
sbi DDRC, DDC1
rjmp interrupt2
;sbi PORTD, PD5
;sbi PORTB, PB5
interrupt2:
ldi temp,LOW(TIME2) ;Startwert Timer neu
out TCNT0,temp
reti
Der soll bewirken, dass der Asuro langsam beschleunigt und dann wieder abbremst.
Lesezeichen