; 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< 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