Code:
.include "m8def.inc"
.def temp = r16 ; Arbeitsregister
.cseg
.org 0x000
rjmp Prog_Initial ; Interruptvektoren überspringen
reti ; INT0addr - Externer Interrupt 0
reti ; INT1addr - Externer Interrupt 1
reti ; OC2addr - Output Compare2
reti ; OVF2addr - Overflow2
reti ; ICP1addr - Input Capture1
reti ; OC1Aaddr - Output Compare1A
reti ; OC1Baddr - Output Compare1B
reti ; OVF1addr - Overflow1
reti ; OVF0addr - Overflow0
reti ; SPIaddr - SPI
reti ; URXCaddr - USART Receive Complete
reti ; UDREaddr - USART Data Register Empty
reti ; UTXCaddr - USART Transmit Complete
reti ; ADCCaddr - Analog Digital wandler
reti ; ERDYaddr - EEPROM
reti ; ACIaddr - Analog Comparator
reti ; TWIaddr - Two - Wire Interface
reti ; SPMaddr - SPM complete
Prog_Initial:
;******************************************************************************
; Stack Pointer setzen *
;******************************************************************************
ldi temp, LOW(RAMEND) ; Stack Pointer low
out SPL, temp ; setzen
ldi temp, HIGH(RAMEND) ; Stack Pointer high
out SPH, temp ; setzen
;******************************************************************************
;* Init_Timer1 8 Bit PWM an den Output Compare Pins OC1A und OC1B *
;******************************************************************************
; Compare Output Mode
; Clear OC1A / OC1B on Compare Match when up - counting.
; Set OC1A / OC1B on Compare Match when downcounting
; Waveform Generation Mode
; PWM , Phase Correct, 8 Bit
; Prescaler Divisions Factor = 8
; PWM Frequenz = 1,953 Khz
ldi temp, (1 << WGM10) | (1 << COM1A1) | (1 << COM1B1)
out TCCR1A, temp
ldi temp, (1 << CS11)
out TCCR1B, temp
;******************************************************************************
;* Init_Motor_Rechts: *
;******************************************************************************
sbi DDRB, DDB2 ; PWM Ausgang
sbi DDRB, DDB4 ; Richtungs und
sbi DDRB, DDB5 ; Funktions Steuerung
sbi PORTB, PORTB4 ; Motor im
sbi PORTB, PORTB5 ; Leerlauf
ldi temp, 0x00
out OCR1BH, temp
out OCR1BL, temp
;******************************************************************************
;* Init_Motor_Links: *
;******************************************************************************
sbi DDRB, DDB1 ; PWM Ausgang
sbi DDRD, DDD4 ; Richtungs und
sbi DDRD, DDD5 ; Funktions Steuerung
sbi PORTD, PORTD4 ; Motor im
sbi PORTD, PORTD5 ; Leerlauf
ldi temp, 0x00
out OCR1AH, temp
out OCR1AL, temp
;******************************************************************************
;* Init LEDs *
;******************************************************************************
sbi DDRB, DDB0 ; Duo LED grün
sbi DDRD, DDD2 ; Duo LED rot
cbi PORTB, PORTB0 ; aus
cbi PORTD, PORTD2 ; schalten
sbi DDRD, DDD6 ; Front LED
cbi PORTD, PORTD6 ; aus
sbi DDRD, DDD7 ; Back LEDs
cbi PORTD, PORTD7
sbi DDRC, DDC0
sbi DDRC, DDC1
cbi PORTC, PORTC1
cbi PORTC, PORTC1 ; ausschalten
;********************** Interrupts erlauben ******************************
sei
;**************** Ende Init **********************************************
Prog_Run:
rcall planlos
loop:
rjmp loop
;*****************************************************************************
;* planlos herumfahren *
;*****************************************************************************
planlos:
rcall M_L_Leerlauf ; Motoren in
rcall M_R_Leerlauf ; Leerlauf schalten
ldi temp,150 ; Wert für PWM 0 - 255
out OCR1AL, temp ; für den linken Motor
out OCR1BL, temp ; und für den rechten Motor
rcall M_L_Vorwaerts ; beide Motoren
rcall M_R_Vorwaerts ; Vorwärts
;oder Rückwärts
;rcall M_L_Rueckwaerts
;rcall M_R_Rueckwaerts
;oder im Kreis
;rcall M_L_Rueckwaerts
;rcall M_R_Vorwaerts
ret
;******************************************************************************
;* Motor rechts Rückwärts *
;******************************************************************************
M_R_Rueckwaerts:
cbi PORTB, PORTB4 ; PB4 = 0
sbi PORTB, PORTB5 ; PB5 = 1
ret
;******************************************************************************
;* Motor rechts Vorwärts *
;******************************************************************************
M_R_Vorwaerts:
sbi PORTB, PORTB4 ; PB4 = 1
cbi PORTB, PORTB5 ; PB5 = 0
ret
;******************************************************************************
;* Motor rechts Leerlauf *
;******************************************************************************
M_R_Leerlauf:
sbi PORTB, PORTB4 ; PB4 = 1
sbi PORTB, PORTB5 ; PB5 = 1
ret
;******************************************************************************
;* Motor rechts Bremsen *
;******************************************************************************
M_R_Bremsen:
cbi PORTB, PORTB4 ; PB4 = 0
cbi PORTB, PORTB5 ; PB5 = 0
ret
;******************************************************************************
;* Motor links Rückwärts *
;******************************************************************************
M_L_Rueckwaerts:
cbi PORTD, PORTD4 ; PD4 = 0
sbi PORTD, PORTD5 ; PD5 = 1
ret
;******************************************************************************
;* Motor links Vorwärts *
;******************************************************************************
M_L_Vorwaerts:
sbi PORTD, PORTD4 ; PD4 = 1
cbi PORTD, PORTD5 ; PD5 = 0
ret
;******************************************************************************
;* Motor links Leerlauf *
;******************************************************************************
M_L_Leerlauf:
sbi PORTD, PORTD4 ; PD4 = 1
sbi PORTD, PORTD5 ; PD5 = 1
ret
;*****************************************************************************
;* Motor links Bremsen *
;*****************************************************************************
M_L_Bremsen:
cbi PORTD, PORTD4 ; PD4 = 0
cbi PORTD, PORTD5 ; PD5 = 0
ret
Lesezeichen