
; Testprogramm zur Servo-Ansteuerung
; Timer1 im Fast PWM Mode - Timer1 zählt von 0 bis OCR1A
; OCR1A wird so festgelegt, dass die Periode exakt eine Sekunde beträgt
; Interrupt durch Match von OCR1B
;
; Achim Walther, www.voidpointer.de, 20.11.2004

.include "m8def.inc"		; Definitionsdatei einbinden

.def temp = R16
.equ onesec = 31250
.equ start = onesec/2

intvect:
	rjmp init		; RESET	
	reti			; INT0
	reti			; INT1
	reti			; T2 Compare
	reti			; T2 Overflow
	reti			; T1 Capture
	rjmp intoca		; T1 Compare A
	rjmp intocb		; T1 Compare B
	rjmp intovf		; T1 Overflow
	reti			; T0 Overflow
	reti			; SPI Transfer complete
	reti			; UART RX Complete
	reti			; UDR Empty
	reti			; UART TX Complete
	reti			; ADC complete
	reti			; EEPROM Ready
	reti			; Analog Comparator
	reti			; TWM
	reti			; SPM_RDY

init:
	ldi temp, LOW(RAMEND)
	out SPL, temp
	ldi temp, HIGH(RAMEND)
	out SPH, temp		; init stack pointer

	ldi temp, 0xFF
	out DDRC, temp		; Port C als Ausgang konfigurieren

	ldi temp, 0x00
	out DDRD, temp		; Port D als Eingang konfigurieren

	ldi temp, 0xFF
	out PORTC, temp		; PORTC auf 0xFF setzen -> LED aus

	ldi R24, LOW(onesec)	; OCR1A auf 1 Sekunde setzen
	ldi R25, HIGH(onesec)
	out OCR1AH, R25
	out OCR1AL, R24

	ldi R24, LOW(start)	; OCR1B mit Startwert initialisieren
	ldi R25, HIGH(start)
	out OCR1BH, R25
	out OCR1BL, R24

	in temp, TIMSK
	ori temp, (1<<OCIE1A) | (1<<OCIE1B)	; enable interrupt on OCR1B and OCR1A
	out TIMSK, temp

	;;ldi temp, 0b00000000	; WGM11:0 = 0 -> CTC Mode, Top = OCR1A
	;;out TCCR1A, temp

	;;ldi temp, 0b00001001	; no Prescaler
	ldi temp, 0b00001100	; Timer Prescaler 256 -> ein kompletter Zyklus ist 2.1s bei 8MHz
				; WGM13:2 = 01 -> CTC Mode
	out TCCR1B, temp

	sei

up:
	sbic PIND, 7		; Taste 1 gedrückt? -> Leuchtphase verlängern
	rjmp down
	in R24, OCR1BL		; Aktuelle Einstellung von Output Compare B laden
	in R25, OCR1BH
	adiw R24, 1		; und um 1 erhöhen
	out OCR1BH, R25		; Ergebnis wieder nach Output Compare B schreiben
	out OCR1BL, R24
	rcall delay
down:
	sbic PIND, 6		; Taste 2 gedrückt? -> Leuchtphase verkürzen
	rjmp loop
	in R24, OCR1BL		; Aktuelle Einstellung von Output Compare B laden
	in R25, OCR1BH
	sbiw R24, 1		; 1 abziehen
	out OCR1BH, R25		; Ergebnis wieder nach Output Compare B schreiben
	out OCR1BL, R24
	rcall delay

loop:	rjmp up			; Endlosschleife

; Output Compare B Interrupt Rountine
intocb:	
	cbi PORTC, 0		; LED einschalten
	reti

; Output Compare A Interrupt Rountine
intoca:	
	sbi PORTC, 0		; LED ausschalten
	reti

; Timer Overflow Interrupt Rountine
intovf:	
	sbi PORTC, 0		; LED ausschalten
	reti

delay:
	ldi temp, 0xFF
dls:	dec temp
	brne dls
	ret